commit 010df1c0a491ccbd30e1a4298c138b2752db4bfb Author: Bogdan Kolbov Date: Mon Jul 29 08:18:57 2019 +0300 Initial commit diff --git a/.cproject b/.cproject new file mode 100644 index 0000000..fb8ecea --- /dev/null +++ b/.cproject @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d9155fd --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +Debug/* +/Debug/ diff --git a/.project b/.project new file mode 100644 index 0000000..29f3071 --- /dev/null +++ b/.project @@ -0,0 +1,32 @@ + + + MCD_028 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + copy_PARENT + $%7BPARENT-3-PROJECT_LOC%7D/ProjectsGit/motorcontroldemo + + + diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml new file mode 100644 index 0000000..c8d9565 --- /dev/null +++ b/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.cdt.codan.core.prefs b/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..6e96f5d --- /dev/null +++ b/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,67 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},skip\=>true} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true}} diff --git a/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/.settings/org.eclipse.cdt.managedbuilder.core.prefs new file mode 100644 index 0000000..b91eaca --- /dev/null +++ b/.settings/org.eclipse.cdt.managedbuilder.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/CPATH/delimiter=; +environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/CPATH/operation=remove +environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/C_INCLUDE_PATH/delimiter=; +environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/C_INCLUDE_PATH/operation=remove +environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/append=true +environment/buildEnvironmentInclude/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/appendContributed=true +environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/LIBRARY_PATH/delimiter=; +environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/LIBRARY_PATH/operation=remove +environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/append=true +environment/buildEnvironmentLibrary/ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1605704765/appendContributed=true diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..315621d --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,203 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..40cd8c4 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +Данный репозиторий включает РІ себя полноценный работоспособный проект для задач управления двигателем РЅР° базе микроконтроллеров серии 1921Р’Рљ028 фирмы РђРћ «НРРР­РўВ». РџРѕРјРёРјРѕ РёСЃС…РѕРґРЅРѕРіРѕ РєРѕРґР° проекта, репозиторий содержит специализированное программное обеспечение, позволяющее производить разработку, отладку Рё исследование систем управления через интерфейс CAN (RS) СЃ протоколом высокого СѓСЂРѕРІРЅСЏ CANopen. Начинать знакомство СЃ данным РџРћ следует СЃ файла ```Описание структуры РџРћ MotorControlDemo.pdf```, находящегося РІ разделе [Downloads](https://bitbucket.org/niietcm4/motorcontroldemo/downloads/) репозитория [MotorControlDemo](https://bitbucket.org/niietcm4/motorcontroldemo/). + +Состав репозитория: + +- MotorControlDemo – проект СЃ исходными кодами - реализует различные структуры управления электродвигателями различных типов, Р° также содержит математические модели электродвигателей, которые РјРѕРіСѓС‚ быть опционально подключены вместо реального объекта управления РЅР° время отладки. РџРћ может быть сконфигурировано перед компиляцией для различных аппаратных конфигураций (различных контроллеров Рё отладочных плат РЅР° базе 1921BK028). Для некоторых аппаратных конфигураций РџРћ может работать только СЃ математическими моделями двигателей, Р° для конфигураций, поддерживающих управление реальным электродвигателем может РїРѕ выбору пользователя управлять Рё реальным объектом (например, конфигурация для отладочного комплекта VectorCARD СЃ инвертором). РџРћ микроконтроллера разработано для бесплатной среды разработки [VectorIDE (Eclipse+GCC+OpenOCD)](http://motorcontrol.ru/production/soft/vector-ide/). Каталог ```MotorControlDemo\EclipseIDE\```. +- COODEdit4 NIIET edition - редактор словарей CANopen, далее COODEdit (CanOpen Object Dictionary Editor) – программный РїСЂРѕРґСѓРєС‚, позволяющий осуществлять редактирование словарей объектов для CANopen-совместимых устройств СЃ драйвером данной реализации РІ графическом РІРёРґРµ. Подробнее СЃ возможностями программы можно ознакомиться РІ руководстве пользователя - СЃРј. файл ```COODEdit user manual.pdf``` РІ разделе [Downloads](https://bitbucket.org/niietcm4/motorcontroldemo/downloads/) репозитория [MotorControlDemo](https://bitbucket.org/niietcm4/motorcontroldemo/). +- UniCON - управляющий интерфейс пользователя, набор программных средств, позволяющих осуществлять мониторинг (РІ том числе снятие осциллограмм переходных процессов) Рё настройку CANopen-совместимых устройств посредством персонального компьютера. UniCON РїСЂРё помощи переходника CAN-USB или USB-UART конвертора взаимодействует через CANopen СЃ РџРћ микроконтроллера Рё обеспечивает интерфейс пользователя. +Подробнее СЃ возможностями программы можно ознакомиться РІ руководстве пользователя - СЃРј. файл ```UniCON руководство пользователя.pdf``` РІ разделе [Downloads](https://bitbucket.org/niietcm4/motorcontroldemo/downloads/) репозитория [MotorControlDemo](https://bitbucket.org/niietcm4/motorcontroldemo/). + + +РЎ вопросами Рё предложениями можно обращаться: + +- motorcontrol@niiet.ru +- [тема](http://forum.niiet.ru/viewtopic.php?f=37&t=536) РЅР° интернет-форуме РђРћ «НРРР­РўВ» +- интернет-форум РћРћРћ «НПФ ВЕКТОР» http://motorcontrol.ru/forum/ + +*Если РІС‹ нашли ошибку РІ программном обеспечении или документации РїСЂРѕСЃСЊР±Р° РїРѕ возможности оповестить РѕР± этом разработчиков любым удобным СЃРїРѕСЃРѕР±РѕРј.* \ No newline at end of file diff --git a/Vinclude/CANBlockTransferInterface.h b/Vinclude/CANBlockTransferInterface.h new file mode 100644 index 0000000..88e70c5 --- /dev/null +++ b/Vinclude/CANBlockTransferInterface.h @@ -0,0 +1,68 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file CANBlockTransferInterface.h + \brief Блочная передача данных для CANopen + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup CANOpen_drv Драйвер CANOpen + @{ +*/ +#ifndef CANBLOCKTRANS_INTERFACE_H +#define CANBLOCKTRANS_INTERFACE_H + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "DSP.h" + +#define CANBT_INTERFACE_FREE 0 +#define CANBT_INTERFACE_BUSY 0x8000 +#define CANBT_INTERFACE_FLASH_PROG 1 +#define CANBT_INTERFACE_DATALOG1 2 +#define CANBT_INTERFACE_DATALOG2 3 // используется для 32-битного даталоггера + +struct SCanBTInterface{ + Uint16 alreadyInit; //признак первого вызова дискетного автомата. + Uint16 state_shadow;//Теневое состояние. + Uint16 state_prev; //Предыдущее сосяние (на один такт) + Uint16 E; //Флаг первого вхождения. + Uint32 time_prev; + Uint64 state_time; //время нахождения в текущем состоянии, в тиках проца. Для 150Мгц максимальное время около 4тыс. лет :) + Uint16 BlockTransferCommand; + void (*ms_calc)(volatile struct SCanBTInterface* p, Uint32 time, TCo_OdVars* co_ptr); + void (*slow_calc)(volatile struct SCanBTInterface* p); + }; + +typedef volatile struct SCanBTInterface TCanBTInterface; + +#define T_CANBT_INTERFACE_DEFAULTS {0,CANBT_INTERFACE_FREE,0xFF,1,\ + 0,0,0,\ + SMCanBTInterface_ms,\ + SMCanBTInterface_slow} + +void SMCanBTInterface_ms(volatile struct SCanBTInterface* p, Uint32 time, TCo_OdVars* co_ptr); +void SMCanBTInterface_slow(volatile struct SCanBTInterface* p); + +//колбэки длЯ 2700.00 +void callback_BTcmd(Uint16 par, Uint16 tag_CANnum); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Vinclude/CANOpen_drv.h b/Vinclude/CANOpen_drv.h new file mode 100644 index 0000000..dd0f5cd --- /dev/null +++ b/Vinclude/CANOpen_drv.h @@ -0,0 +1,170 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file CANOpen_drv.h + \brief Драйвер CANOpen + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 3.19 2019_03_06 + + \defgroup CANOpen_drv Драйвер CANOpen + @{ +*/ + +#ifndef CAN_OPEN_DRV_H +#define CAN_OPEN_DRV_H + +#ifdef __cplusplus +extern "C" { +#endif + +//******************************************************************************************** +// + +//!Включатель CAN 1 +#define CAN_1_ENABLE +//******************************************************************************************** +//!Включатель CAN 2 +#define CAN_2_ENABLE +//******************************************************************************************** +/* + * Функции инициализации драйвера для CAN1 и CAN2 + * Драйвер использует работу с пользовательской памятью (интерфейс с которой определяется функциями co_UserMemoryRead и co_UserMemoryWrite - + * см. файл CANOpenUDfuncs.c), поэтому к моменту начала работы с драйвером пользователь должен ГАРАНТИРОВАТЬ, + * что драйвер пользовательской памяти проинициализирован. + */ +extern Uint16 co1_Init(TCo_OdVars* ppc);//В случае если инициализациЯ не удалась функциЯ возвращает 0, иначе 1. +extern Uint16 co2_Init(TCo_OdVars* ppc);//В случае если инициализациЯ не удалась функциЯ возвращают 0, иначе 1. + +//ФункциЯ переинициализации CAN без восстановлениЯ параметров из пользовательской памяти (может быть использована лишь длЯ ПОВТОРНОЙ инициализации) +extern Uint16 co_ReInit(TCo_OdVars* ppc);//В случае если инициализациЯ не удалась функциЯ возвращают 0, иначе 1. +extern void propReset (void); +//Прототипы функций +extern void co_UserMemoryRead (const T_UserMemoryContext *p); +extern void co_UserMemoryWrite (const T_UserMemoryContext *p); + +#ifdef CAN_1_ENABLE +extern void co_CAN1GpioInit(); +extern void co_CAN1INTEnable(); +extern void co_CAN1INTDisable(); +#endif + +#ifdef CAN_2_ENABLE +extern void co_CAN2GpioInit(); +extern void co_CAN2INTDisable(); +extern void co_CAN2INTEnable(); +#endif + + +//!функция драйвера CANOpen вызываемая в прерывании 1 мс таймера, тактирующего работу драйвера +extern void co_1ms_calc(TCo_OdVars*); + +//!функция обработчика драйвера CANOpen в фоновой программе +extern void co_background_calc(TCo_OdVars*); + +//!Функция восстановления значений параметров словаря объектов по умолчанию +/*! +Результатом работы функции является восстановление параметров указанного +типа и диапазона +type - 1 rw-параметры + 2 rwp-параметры + 3 rwps-параметры +range - 1 восстановление индексов 1000h-1FFFh + 2,3,4,5 +Функция по времени выполнения относится к длиным (вызывать следует в фоне) */ +extern void co_ODexpositor_instaurationDefault(TCo_OdVars* ppc, Uint16 type, Uint16 range); + +//!Функция сохранения значений параметров словаря объектов в ЭнОЗУ +/*!Результатом работы функции является сохранение параметров указанного +типа и диапазона +type - 1 rw-параметры + 2 rwp-параметры + 3 rwps-параметры +range - 1 восстановление индексов 1000h-1FFFh + 2,3,4,5 +Функция по времени выполнения относится к длиным (вызывать следует в фоне).*/ +extern void co_ODexpositor_paramConservation(TCo_OdVars* ppc, Uint16 type, Uint16 range); + +//!Функция восстановления значений параметров словаря объектов из ЭнОЗУ +/*! Результатом работы функции является восстановление параметров указанного +типа и диапазона +type - 1 rw-параметры + 2 rwp-параметры + 3 rwps-параметры +range - 1 восстановление индексов 1000h-1FFFh + 2,3,4,5 +Внимание!!!Восстановление параметров 2-го и 3-го типов возможно если +переменная co_protectBit = 0. Если co_protectBit = 1 , то функция ничего +не "делает". +Если восстановление параметров заданного типа и диапазона произошло +неудачно(контрольная сумма не сошлась), то восстановление заданного +типа и диапазона повторяется.Если после трех попыток восстановление +не завершилось успехом, то выполняется восстановление параметров заданного +типа и диапазона по умолчанию. +Функция по времени выполнения относится к длиным (вызывать следует в фоне).*/ +extern void co_ODexpositor_paramInstauration(TCo_OdVars* ppc, Uint16 type, Uint16 range); + +// функции сервиса NMT +// драйвер может выступать NMT мастером, либо быть NMT слэйвом +//! функция для отправки NMT (нужна только для NMT мастера) +void co_sendNMT(TCo_OdVars* ppc, Uint16 nmtCommand, Uint16 nmtNODE_ID); + +//!функция ПОЛЬЗОВАТЕЛя для отправки SDO запросов на чтение параметров сервера +extern void co_SDOrequestRead(TCo_OdVars*); +//!функция ПОЛЬЗОВАТЕЛя для отправки SDO запросов на запись параметров сервера +extern void co_SDOrequestWrite(TCo_OdVars*); + +extern void Z_co_receiveSDOrequest(TCo_OdVars*, TZCanMsg*); +extern void co_CANToExtInterface_Send(TZCanMsg* MSG, Uint16 tag_CANnum); + +/*!ФункциЯ возвращает адрес переменной по переданным индексу + и подындексу. Если "свЯзаннаЯ" переменнаЯ 32-х разрЯднаЯ, то + возвращаетсЯ указатель на старшую часть. + ВНИМАНИЕ!!!Если запрошенного индекса и подиндекса не существует, то + функциЯ возвращает 0 (это нужно обЯзательно отслеживать). */ +extern Uint16 * co_getAddr(TCo_OdVars* ppc, Uint32 ind_subind); +// Функция получения информации об объекте с заданным адресом. +// Возвращает 0, если объект не найден. +extern Uint16 co_getObjectInfo( + TCo_OdVars* ppc, // указатель на структуру используемого модуля CANopen + Uint32 ind_subind, // биты 16-31 - индекс, биты 0-7 - подындекс объекта + TObjectInfo* pObjectInfo // указатель на структуру, куда будет помещена информация об объекте + ); + +extern void co_RPDO1_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO2_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO3_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO4_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO5_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO6_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO7_Callback(Uint16 nodeID, Uint16 tag_CANnum); +extern void co_RPDO8_Callback(Uint16 nodeID, Uint16 tag_CANnum); + + +//функции ПОЛЬЗОВАТЕЛя, инициирующие передачу, или прием блока данных посредством +//сервиса блочной передачи +extern void CANBlockTransferInitTX(TCo_OdVars* ppc, Uint16 size, Uint16* source_ptr); +extern void CANBlockTransferInitRX(TCo_OdVars* ppc, Uint16 size, Uint16* dest_ptr); + + +#ifdef __cplusplus +} +#endif + + +#endif + + +/*@}*/ + diff --git a/Vinclude/DRV8301_SPI.h b/Vinclude/DRV8301_SPI.h new file mode 100644 index 0000000..215d627 --- /dev/null +++ b/Vinclude/DRV8301_SPI.h @@ -0,0 +1,140 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file DRV8301_SPI.h + \brief Драйвер для драйвера ключей инвертора DRV8301 + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + +*/ + +#ifndef DRV8301_INTERFACE_H +#define DRV8301_INTERFACE_H + + +// DRV8301 SPI Input Data bit definitions: +struct DRV8301_SPI_WRITE_WORD_BITS { // bit description + Uint16 DATA:11; // 10:0 FIFO reset + Uint16 ADDRESS:4; // 14:11 Enhancement enable + Uint16 R_W:1; // 15 R/W +}; + +union DRV8301_SPI_WRITE_WORD_REG { + Uint16 all; + struct DRV8301_SPI_WRITE_WORD_BITS bit; +}; + +// DRV8301 SPI Status Reister 1 bit definitions: +struct DRV8301_STATUS_REG_1_BITS { // bit description + Uint16 FETLC_OC:1; // 0 Phase C, low-side FET OC + Uint16 FETHC_OC:1; // 1 Phase C, high-side FET OC + Uint16 FETLB_OC:1; // 2 Phase B, low-side FET OC + Uint16 FETHB_OC:1; // 3 Phase B, high-side FET OC + Uint16 FETLA_OC:1; // 4 Phase A, low-side FET OC + Uint16 FETHA_OC:1; // 5 Phase A, high-side FET OC + Uint16 OTW:1; // 6 Over-temperature warning + Uint16 OTSD:1; // 7 Over-temperature shut down + Uint16 PVDD_UV:1; // 8 PVDD < 6V + Uint16 GVDD_UV:1; // 9 GVDD < 8V + Uint16 FAULT:1; // 10 FAULTn pin is asserted + Uint16 Reserved:5; // 15:11 +}; + +union DRV8301_STATUS_REG_1 { + Uint16 all; + struct DRV8301_STATUS_REG_1_BITS bit; +}; + +// DRV8301 SPI Status Reister 2 bit definitions: +struct DRV8301_STATUS_REG_2_BITS { // bit description + Uint16 DEVICE_ID:4; // 3:0 Device ID + Uint16 Reserved1:3; // 6:4 + Uint16 GVDD_OV:1; // 7 GVDD > 16V + Uint16 Reserved2:8; // 15:8 +}; + +union DRV8301_STATUS_REG_2 { + Uint16 all; + struct DRV8301_STATUS_REG_2_BITS bit; +}; + +// DRV8301 SPI Control Reister 1 bit definitions: +struct DRV8301_CONTROL_REG_1_BITS { // bit description + Uint16 GATE_CURRENT:2; // 1:0 Gate driver peak current, 1.7A (00b), 0.7A (01b), 0.25A (10b), Reserved (11b) + Uint16 GATE_RESET:1; // 2 Reset all latched faults (1), Normal Mode (0) + Uint16 PWM_MODE:1; // 3 Three (1) or six (0) pwm inputs + Uint16 OC_MODE:2; // 5:4 over-current mode, current limit (00b), latched shut down (01b), Report only (10b), OC disabled (11b) + Uint16 OC_ADJ_SET:5; // 10:6 Set Vds trip point for OC see the table in the datasheet + Uint16 Reserved:5; // 15:11 +}; + +union DRV8301_CONTROL_REG_1 { + Uint16 all; + struct DRV8301_CONTROL_REG_1_BITS bit; +}; + +// DRV8301 SPI Control Reister 2 bit definitions: +struct DRV8301_CONTROL_REG_2_BITS { // bit description + Uint16 OCTW_SET:2; // 1:0 Report OT and OC (00b), Report OT (01b), Report OC (10b), Reserved (11b) + Uint16 GAIN:2; // 3:2 Gain of shunt amplifier, 10 (00b), 20 (01b), 40 (10b), 80 (11b) + Uint16 DC_CAL_CH1:1; // 4 Shunt amplifier inputs shorted and disconnected from load (1) or shunt amplifier inputs connected to load (0) + Uint16 DC_CAL_CH2:1; // 5 Shunt amplifier inputs shorted and disconnected from load (1) or shunt amplifier inputs connected to load (0) + Uint16 OC_TOFF:1; // 6 Normal CBC operation (0), off time control during OC (1) + Uint16 Reserved:9; // 15:7 +}; + +union DRV8301_CONTROL_REG_2 { + Uint16 all; + struct DRV8301_CONTROL_REG_2_BITS bit; +}; + +struct Sdrv8301interface { + union DRV8301_CONTROL_REG_1 CTRL1; + union DRV8301_CONTROL_REG_2 CTRL2; + union DRV8301_STATUS_REG_1 STS1; + union DRV8301_STATUS_REG_2 STS2; + union DRV8301_SPI_WRITE_WORD_REG writeWord; + void (*init)(volatile struct Sdrv8301interface*); + void (*write)(volatile struct Sdrv8301interface*, Uint16); + void (*read)(volatile struct Sdrv8301interface*); +}; + +typedef volatile struct Sdrv8301interface Tdrv8301interface; +/***************************************************************************************************/ +//defines +/***************************************************************************************************/ +//DRV8301 Register Addresses +#define STAT_REG_1_ADDR 0x00 +#define STAT_REG_2_ADDR 0x01 +#define CNTRL_REG_1_ADDR 0x02 +#define CNTRL_REG_2_ADDR 0x03 + +#define DRV8301_INTERFACE_DEFAULTS {0,0,0,0,0,\ + DRV8301_Interface_Init,\ + DRV8301_Interface_Write,\ + DRV8301_Interface_Read} + +/***************************************************************************************************/ +//function prototypes +/***************************************************************************************************/ +//void DRV8301_SPI_Init(volatile struct SPI_REGS *s); +//Uint16 DRV8301_SPI_Read(volatile struct SPI_REGS *s, Uint16 address); +//Uint16 DRV8301_SPI_Write(volatile struct SPI_REGS *s, Uint16 address, Uint16 data); + +void DRV8301_Interface_Init (Tdrv8301interface*); +void DRV8301_Interface_Write (Tdrv8301interface*, Uint16); +void DRV8301_Interface_Read (Tdrv8301interface*); + +#endif diff --git a/Vinclude/DRV_INTERFACE.h b/Vinclude/DRV_INTERFACE.h new file mode 100644 index 0000000..7d1bb25 --- /dev/null +++ b/Vinclude/DRV_INTERFACE.h @@ -0,0 +1,83 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file DRV_INTERFACE.h + \brief Через данные модуль обеспечиваетсЯ работа с банком аварий (чтение, очистка). + //ПредполагаетсЯ, что модуль может расширЯть функциональность (скачивать каие-то другие данные)... + //ПРИМЕЧАНИЕ для программиста: + 1.для команд работающих по сети с автоматизированными системами (Юникон,, пульты и т.д.) после выполнения команды поле ans_data должно быть установлено значением запроса: + p->ans_data = temp; + что сообщит внешней системе, что запрос обработан. В этом случае поле p->ans_data обнуляется внешней автоматизированной системой после сбора информации с полей + p->data_Low + p->data_High + 2.для внутренних вызовов поле p->ans_data трогать не нужно + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.1 2017_07_24 + +*/ +// пример использованиЯ в модуле main +#ifndef DRV_INTERFACE_H +#define DRV_INTERFACE_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define DRV_INTERFACE_RESET_TIME 10 //выдержка в сек перед обнулением параметра Ans_Data + +//!запрос на чтение аварии +#define DATA_REQUEST_READ_FAULT 1 +//!запрос на запись аварии +#define DATA_REQUEST_WRITE_FAULT 2 +//!запрос на запись рабочего времени +#define DATA_REQUEST_WRITE_WORK_TIME 3 +//!запрос на чтение рабочего времени +#define DATA_REQUEST_READ_WORK_TIME 4 +#define DATA_REQUEST_WRITE_OPER_TIME 5 +//!запрос на чтение времени во включенном состоЯнии +#define DATA_REQUEST_READ_OPER_TIME 6 +//!очистка всего +#define DATA_REQUEST_CLEAR_ALL 10 + + + struct SDrvInterface + { + long req_data; + long ans_data; + long data_High; + long data_Low; + + long INTERFACE_time_sec;//!< + long INTERFACE_delta_time_sec;//!< + void (*calc)(struct SDrvInterface*); + }; + + typedef struct SDrvInterface TDrvInterface; + +#define DRV_INTERFACE_DEFAULTS {0,0,0,0,\ + 0,0,\ + DRV_INTERFACE_Calc,\ + } + + void DRV_INTERFACE_Calc(TDrvInterface*); + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/Vinclude/DSP.h b/Vinclude/DSP.h new file mode 100644 index 0000000..2353e76 --- /dev/null +++ b/Vinclude/DSP.h @@ -0,0 +1,112 @@ +/****************************************************************************** + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + * @file DSP.h + * @brief Файл подключения заголовочных файлов периферии и объявления системных констант + * @author ООО "НПФ Вектор". http://motorcontrol.ru + * @version v1.0 + * @date 11 декабря 2015 + + ******************************************************************************/ + +#ifndef VINCLUDE_DSP_H_ +#define VINCLUDE_DSP_H_ +#ifdef __cplusplus +extern "C" { +#endif + +// Выбор частоты кварца. Влияет на делители при настройке тактирования +//#define QUARTZ_10MHZ +#define QUARTZ_12MHZ + +//частота тактирования проца +#define CORE_CLK 200000000 + + +#define GPIO_PIN_0 0x0001 +#define GPIO_PIN_1 0x0002 +#define GPIO_PIN_2 0x0004 +#define GPIO_PIN_3 0x0008 +#define GPIO_PIN_4 0x0010 +#define GPIO_PIN_5 0x0020 +#define GPIO_PIN_6 0x0040 +#define GPIO_PIN_7 0x0080 +#define GPIO_PIN_8 0x0100 +#define GPIO_PIN_9 0x0200 +#define GPIO_PIN_10 0x0400 +#define GPIO_PIN_11 0x0800 +#define GPIO_PIN_12 0x1000 +#define GPIO_PIN_13 0x2000 +#define GPIO_PIN_14 0x4000 +#define GPIO_PIN_15 0x8000 + +#define __CM4_REV 0x0001 //в K1921VK01T.h есть объявление __CM4F_REV, но в core_cm4.h проверяется именно __CM4_REV. Если не объявлено там объявляется нулем и больше нигде, вроде, не используется эта константа +#define __CHECK_DEVICE_DEFINES + + +#include + +#include "K1921VK028.h" +#include "core_cm4.h" /* Cortex-M4 processor and core peripherals */ +#include "EPwm_defines.h" //Файл объявления системных констант для работы с ШИМ модулями +void gpioPeripheralInit(); + +typedef char int8; +typedef unsigned char Uint8; +typedef unsigned short int Uint16; +typedef unsigned int Uint32; +typedef short int int16; +typedef int int32; +typedef unsigned long long Uint64; +typedef long long int64; + +//Указатели на секцию памяти fastcode, где лежат функции для копирования из флеша в оперативку. +//Определены в файле компоновки памяти. +extern int __fastcode_ram_start; +extern int __fastcode_ram_end; +extern int __fastcode_flash_start; + +extern int __isr_vector_flash_start; +extern int __isr_vector_ram_start; +extern int __isr_vector_ram_end; + +//! Запрет прерываний +#define DINT __disable_irq() +//! Разрешение прерываний +#define EINT __enable_irq() + +//! Процедура безопасного ресета проца, не вызывающего зависаний +void propReset(void); + +//! Процедура безопасной инициализации альтернативных функций дискретных ножек +void K1921VK01T_GPIO_SafeInit(); + + +//приоритеты прерываний +#define IRQ_PRIORITY_TZ 1 +#define IRQ_PRIORITY_ADC 2 +#define IRQ_PRIORITY_CAP 3 +#define IRQ_PRIORITY_EQEP 3 +#define IRQ_PRIORITY_10K 4 +#define IRQ_PRIORITY_CAN 5 +#define IRQ_PRIORITY_1K 6 + + + +#ifdef __cplusplus +} +#endif + +#endif /* VINCLUDE_DSP_H_ */ diff --git a/Vinclude/EPwm_defines.h b/Vinclude/EPwm_defines.h new file mode 100644 index 0000000..2d46b17 --- /dev/null +++ b/Vinclude/EPwm_defines.h @@ -0,0 +1,183 @@ +/****************************************************************************** + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + * @file EPwm_defines.h + * @brief Файл объявления системных констант для работы с ШИМ модулями + * @author ООО "НПФ Вектор". http://motorcontrol.ru + * @version v1.0 + * @date 11 декабря 2015 + + ******************************************************************************/ + +#ifndef EPWM_DEFINES_H +#define EPWM_DEFINES_H + + +#ifdef __cplusplus +extern "C" { +#endif + +// TBCTL (Time-Base Control) + + +// CTRMODE bits +#define TB_COUNT_UP 0x0 +#define TB_COUNT_DOWN 0x1 +#define TB_COUNT_UPDOWN 0x2 +#define TB_FREEZE 0x3 + +// PHSEN bit +#define TB_DISABLE 0x0 +#define TB_ENABLE 0x1 + +// PRDLD bit +#define TB_SHADOW 0x0 +#define TB_IMMEDIATE 0x1 + +// SYNCOSEL bits +#define TB_SYNC_IN 0x0 +#define TB_CTR_ZERO 0x1 +#define TB_CTR_CMPB 0x2 +#define TB_SYNC_DISABLE 0x3 + +// HSPCLKDIV and CLKDIV bits +#define TB_DIV1 0x0 +#define TB_DIV2 0x1 +#define TB_DIV4 0x2 + +// PHSDIR bit +#define TB_DOWN 0x0 +#define TB_UP 0x1 + +// CMPCTL (Compare Control) + +// LOADAMODE and LOADBMODE bits +#define CC_CTR_ZERO 0x0 +#define CC_CTR_PRD 0x1 +#define CC_CTR_ZERO_PRD 0x2 +#define CC_LD_DISABLE 0x3 + +// SHDWAMODE and SHDWBMODE bits +#define CC_SHADOW 0x0 +#define CC_IMMEDIATE 0x1 + + +// AQCTLA and AQCTLB (Action Qualifier Control) + +// ZRO, PRD, CAU, CAD, CBU, CBD bits +#define AQ_NO_ACTION 0x0 +#define AQ_CLEAR 0x1 +#define AQ_SET 0x2 +#define AQ_TOGGLE 0x3 + +// DBCTL (Dead-Band Control) + +// OUT MODE bits +#define DB_DISABLE 0x0 +#define DBA_ENABLE 0x1 +#define DBB_ENABLE 0x2 +#define DB_FULL_ENABLE 0x3 + +// POLSEL bits +#define DB_ACTV_HI 0x0 +#define DB_ACTV_LOC 0x1 +#define DB_ACTV_HIC 0x2 +#define DB_ACTV_LO 0x3 + +// IN MODE +#define DBA_ALL 0x0 +#define DBB_RED_DBA_FED 0x1 +#define DBA_RED_DBB_FED 0x2 +#define DBB_ALL 0x3 + +// CHPCTL (chopper control) + +// CHPEN bit +#define CHP_DISABLE 0x0 +#define CHP_ENABLE 0x1 + +// CHPFREQ bits +#define CHP_DIV1 0x0 +#define CHP_DIV2 0x1 +#define CHP_DIV3 0x2 +#define CHP_DIV4 0x3 +#define CHP_DIV5 0x4 +#define CHP_DIV6 0x5 +#define CHP_DIV7 0x6 +#define CHP_DIV8 0x7 + +// CHPDUTY bits +#define CHP1_8TH 0x0 +#define CHP2_8TH 0x1 +#define CHP3_8TH 0x2 +#define CHP4_8TH 0x3 +#define CHP5_8TH 0x4 +#define CHP6_8TH 0x5 +#define CHP7_8TH 0x6 + +// TZSEL (Trip Zone Select) +//========================== +// CBCn and OSHTn bits +#define TZ_DISABLE 0x0 +#define TZ_ENABLE 0x1 + +// TZCTL (Trip Zone Control) +//========================== +// TZA and TZB bits +#define TZ_HIZ 0x0 +#define TZ_FORCE_HI 0x1 +#define TZ_FORCE_LO 0x2 +#define TZ_NO_CHANGE 0x3 + +// ETSEL (Event Trigger Select) +//============================= +#define ET_CTR_ZERO 0x1 +#define ET_CTR_PRD 0x2 +#define ET_CTRU_CMPA 0x4 +#define ET_CTRD_CMPA 0x5 +#define ET_CTRU_CMPB 0x6 +#define ET_CTRD_CMPB 0x7 + +// ETPS (Event Trigger Pre-scale) +//=============================== +// INTPRD, SOCAPRD, SOCBPRD bits +#define ET_DISABLE 0x0 +#define ET_1ST 0x1 +#define ET_2ND 0x2 +#define ET_3RD 0x3 + + +//-------------------------------- +// HRPWM (High Resolution PWM) +//================================ +// HRCNFG +#define HR_Disable 0x0 +#define HR_REP 0x1 +#define HR_FEP 0x2 +#define HR_BEP 0x3 + +#define HR_CMP 0x0 +#define HR_PHS 0x1 + +#define HR_CTR_ZERO 0x0 +#define HR_CTR_PRD 0x1 + + +#ifdef __cplusplus +} +#endif /* extern "C" */ + +#endif + diff --git a/Vinclude/Global_time.h b/Vinclude/Global_time.h new file mode 100644 index 0000000..cc2a119 --- /dev/null +++ b/Vinclude/Global_time.h @@ -0,0 +1,196 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file Global_time.h + \brief Модуль работы со временем + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.1 2010_02_24 + +*/ + +#ifndef GLOBAL_TIME_H +#define GLOBAL_TIME_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +#include "DSP.h" + +#define GLOBAL_TIME_CALC_FREQ 10 //!<кГц частота вызова функции calc +//#define USE_ABSOLUTE_TIME_CLOCK //раскоментировать если используютсЯ часы реального времени + + + +#define GLOBAL_TIME_SPI_START_ADDR 6500 //!<начальный адрес в SPI + +#define GLOBAL_TIME_POWER_ON_TIME_ADDR GLOBAL_TIME_SPI_START_ADDR +#define GLOBAL_TIME_OPERATIONAL_TIME_ADDR GLOBAL_TIME_SPI_START_ADDR + 4 + + +//!Абсолютное времЯ + struct SABSOLUTE_TIME + { + int16 second; + int16 minute; + int16 hour; + int16 day; + int16 year; + }; + typedef volatile struct SABSOLUTE_TIME ABSOLUTE_TIME; + +//!ОтносительнаЯ дата + typedef struct + { + int16 millisecond; + int16 second; + int16 minute; + int32 hour; + }RELATIVE_DATE; + + +//!Относительное времЯ + struct SRELATIVE_TIME + { + int ON; + Uint32 tic_isr; + Uint32 millisecond_counter; + Uint32 second_counter; + int16 delta_millisecond; + int16 delta_second; + RELATIVE_DATE relative_date; + }; + typedef volatile struct SRELATIVE_TIME RELATIVE_TIME; + + + + /*! \class TGlobalTime + \brief Модуль работы со временем. + + Класс \a TGlobalTime, основанный на структуре SGlobalTime, содержит методы + длЯ работы со временем.Отсчитывает времЯ в:\n + длЯ отсчета времени работы и т.д.:\n + милисекунды: 0-999\n + секунды: 0-59\n + минуты: 0-59\n + часы: 0-23\n + дни: 0-364\n + года: 0-примерно до 160 лет\n + длЯ отсчета дельт (приращений времени):\n + милисекунды: 0-0xFFFFFFFF - соответствует примерно 1.5 месЯцам\n + секунды: 0-0xFFFFFFFF - соответствует примерно 160 годам\n + + Есть специальный способ, позволЯющий отсчитывать выдержки времени с точностью + до миллисекунд в перывании ШИМ. ИспользуетсЯ переменнаЯ delta_millisecond, + котораЯ возводитсЯ в единицу каждую миллисекунду и на следующем периоде ШИМ + сбрасываетсЯ. Тогда можно в необходимый счетчик добавить counter+=delta_millisecond и + получить в counter счетчик миллисекунд. Аналогично delta_second. + + ПРИМЕЧАНИЕ: 1. модуль не требует инициализации + 2. автоматически перенастраиваетсЯ при изменении несущей частоты + + ДЛЯ КОРРЕКТНОЙ РАБОТЫ МОДУЛЯ ПОЛЬЗОВАТЕЛЬ ДОЛЖЕН: + 1. в макросе GLOBAL_TIME_CALC_FREQ правильно указать несущую частоту вызова функции расчета. + Следует отметить, что значение GLOBAL_TIME_CALC_FREQ целочисленное, поэтому + модуль корректно работает только при целых значениЯх несущей частоты (в кГц). + Недостаток свЯзан с конкретной реализацией модулЯ. + */ + +//! см. TGlobalTime + struct SGlobalTime + { + RELATIVE_TIME relative_time1;//!относительное времЯ 1 + RELATIVE_TIME relative_time2;//!относительное времЯ 2 + ABSOLUTE_TIME absolute_time;//!абсолютное времЯ + int16 time_type;//!часы реального времени (1 - есть) + int32 PowerOn_time; //!<Общее времЯ наработки + int32 PowerOn_time_min; //!<Общее времЯ наработки в минутах + int32 operational_time; //!<Общее времЯ включенного состоЯниЯ + int32 operational_time_min; //!<Общее времЯ включенного состоЯниЯ в минутах + int16 WtiteSPI_flag; + int32 PrevWriteSPIHour; + void (*init)(volatile struct SGlobalTime*); + void (*calc)(volatile struct SGlobalTime*); + void (*ms_calc)(volatile struct SGlobalTime*); + void (*slow_calc)(volatile struct SGlobalTime*); + void (*read_PowerOn_time)(volatile struct SGlobalTime*); + void (*write_PowerOn_time)(volatile struct SGlobalTime*); + void (*read_oper_time) (volatile struct SGlobalTime*); + void (*write_oper_time)(volatile struct SGlobalTime*); + }; + + typedef volatile struct SGlobalTime TGlobalTime; + +//!Иницализатор относительной даты. +#define RELATIVE_DATE_DEFAULTS {0,0,0,0} + +//!Инициализатор относительного времени. +#define RELATIVE_TIME_DEFAULTS {0,\ + 0,0,0,0,0,\ + RELATIVE_DATE_DEFAULTS,\ + } +//!Инициализатор абсолютного времени. +#define ABSOLUTE_TIME_DEFAULTS {0,0,0,0,0} + +//!Инициализатор TGlobalTime. +#define GLOBAL_TIME_DEFAULTS { RELATIVE_TIME_DEFAULTS,\ + RELATIVE_TIME_DEFAULTS,\ + ABSOLUTE_TIME_DEFAULTS,\ + 1,0,0,0,0,0,0,\ + GlobalTime_init,\ + GlobalTime_calc,\ + GlobalTime_ms_calc,\ + GlobalTime_slow_calc,\ + GlobalTime_read_PowerOn_time, \ + GlobalTime_write_PowerOn_time, \ + GlobalTime_read_oper_time, \ + GlobalTime_write_oper_time,\ + } + +//! \memberof TGlobalTime + void GlobalTime_init(TGlobalTime*); +//! \memberof TGlobalTime + void GlobalTime_calc(TGlobalTime*); + //! \memberof TGlobalTime + void GlobalTime_ms_calc(TGlobalTime*); +//! \memberof TGlobalTime + void GlobalTime_slow_calc(TGlobalTime*); + +//! \memberof TGlobalTime + void GlobalTime_REL_TIME_calc(RELATIVE_TIME *p); + +//! \memberof TGlobalTime +void GlobalTime_read_PowerOn_time(TGlobalTime*); +//! \memberof TGlobalTime +void GlobalTime_write_PowerOn_time(TGlobalTime*); +//! \memberof TGlobalTime +void GlobalTime_read_oper_time(TGlobalTime*); +//! \memberof TGlobalTime +void GlobalTime_write_oper_time(TGlobalTime*); + + + +#ifdef __cplusplus +} +#endif + + +#endif + + + +/*@}*/ + diff --git a/Vinclude/SM_CmdLogic.h b/Vinclude/SM_CmdLogic.h new file mode 100644 index 0000000..40ec12c --- /dev/null +++ b/Vinclude/SM_CmdLogic.h @@ -0,0 +1,118 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMCmdLogic.h + \brief Обработка команд и заданий, поступающих из различных источников. (см. TSM_CmdLogic) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup SMCmdLogic Обработка команд и заданий, поступающих из различных источников. (см. TSM_CmdLogic) + @{ +*/ + + +#ifndef SM_CmdLogicH +#define SM_CmdLogicH + +#include "V_common.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + + +//! Система остановлена, готова к запуску (ГОТОВ) +#define CMD_LOGIC_TURNED_OFF 0x0 +//! Состояние РАБОТА +#define CMD_LOGIC_TURNED_ON 0x2 + +#if defined (HW_VECTORCARD_DRV8301_EVM) || defined (HW_VECTORCARD_DRV8312_EVM) +#define STARTBUTTON ((NT_GPIOA->DATA & (1 << 14))==0) //обработка ножки старта +#define STOPBUTTON ((NT_GPIOA->DATA & (1 << 13))==0) //обработка ножки стопа +#define RESETBUTTON 0 +#endif + +#if defined (HW_MOTORCONTROLBOARD) +//Для управления контроллером мы используем внешние дискретные входы с использованием фильтрации (см. V_DIO) +#define STARTBUTTON (BIT_IS_SET(input_vect, 0) ? 1 : 0) //Проверка на уставку бита в векторе дискретных входов +#define STOPBUTTON (BIT_IS_SET(input_vect, 1) ? 1 : 0) //Проверка на уставку бита в векторе дискретных входов +#define RESETBUTTON (BIT_IS_SET(input_vect, 2) ? 1 : 0) //Проверка на уставку бита в векторе дискретных входов + +#endif + +#if !defined (HW_MOTORCONTROLBOARD) && !defined (HW_VECTORCARD_DRV8301_EVM) && !defined (HW_VECTORCARD_DRV8312_EVM) +#define STARTBUTTON 0 +#define STOPBUTTON 0 +#define RESETBUTTON 0 +#endif + +/*! \class TSM_CmdLogic + \brief Обработка команд и заданий, поступающих из различных источников. + + Класс \a TSM_CmdLogic, основанный на структуре SSMCmdLogic, служит для обработки команд + оперативного управления и задания скорости. Команды могут поступать как по CANOpen, + так и по другим протоколам (ModBus). Содержит дискретный автомат, который переключает + систему между состояниями РАБОТА и ОСТАНОВ (ГОТОВ). +*/ + +//! см. TSM_CmdLogic + struct SSM_CmdLogic + { + int state;//!DATA & (1 << 8)) +#define RESET_FAULT_BUTTON 0 //кнопка сброса аварий не предусмотрена +#endif + +#if defined (HW_VECTORCARD_DRV8301_EVM) || defined(HW_VECTORCARD_DRV8312_EVM) +#define DRV_FAULT (NT_GPIOC->DATA & (1 << 4)) +#define RESET_FAULT_BUTTON 0 //кнопка сброса аварий не предусмотрена +#endif + +#if defined (HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) +#define DRV_FAULT 0 //аварий ключа в симуляторе не предусмотрено +#define RESET_FAULT_BUTTON 0 //кнопка сброса аварий не предусмотрена +#endif + +#if defined (HW_MOTORCONTROLBOARD) +#define DRV_FAULT (GPIOB->DATA & (1 << 3)) //Прием общей аварии +#define DRV_FAULT1 (GPIOB->DATA & (1 << 4)) //Авария ключа A0 +#define DRV_FAULT2 (GPIOB->DATA & (1 << 5)) //Авария ключа A1 +#define DRV_FAULT3 (GPIOD->DATA & (1 << 4)) //Авария ключа A2 +#define DRV_FAULT4 (GPIOD->DATA & (1 << 5)) //Авария ключа B0 или B1 или B2 + +//Для сброса аппаратной аварии в данном контроллере используеется внешний дискретный порт ввода +#define RESET_FAULT_BUTTON (BIT_IS_SET(input_vect, 2) ? 1 : 0) //Если установлен 3-й бит в векторе дискретных входов +#endif + + +/*! \class TSM_Protect + \brief Модуль защит. + + Класс \a TSM_Protect, основанный на структуре SSMProtect, + обрабатывает все возможные аварийные ситуации и возводит соответствующий этой + аварии бит в одном из слов bit_fault 1-2. далее происходит обработка этих слов, и, + если эта авария не замаскирована, происходит останов привода. +*/ + +//! см. TSM_Protect + struct SSM_Protect + { + Uint16 state;//!< Состояние + Uint16 state_prev;//!< Состояние предыдущее + + Uint16 readDrvSts; //!<Флаг запроса чтения статуса drv8301 + Uint16 clearDrvFault; //!<Флаг запроса сброса аварии drv8301 + + Uint16 bit_fault1;//!<Слово аварий 1 + Uint16 bit_fault2;//!<Слово аварий 2 + + Uint16 masked_bit_fault1;//!<Слово аварий после маскирования + Uint16 masked_bit_fault2;//!<Слово аварий после маскирования + + Uint16 mask_fault1;//!<Маска аварий 1 + Uint16 mask_fault2;//!<Маска аварий 2 + + Uint16 bit_fault_written1; + Uint16 bit_fault_written2; + + long Imax_protect; //!<Уставка максимально-токовой защиты + long Umax_protect; //!<Уставка защиты max напряжения на ЗПТ + long Umin_protect; //!<Уставка защиты min напряжения на ЗПТ + long speed_max; //!<Уставка максимальной скорости + long T_max; //!<Уставка максимальной температуры + + int E;//!<Флаг первого вхождения + Uint16 Main_ErrorCode;//!< //листающийся код аварии + Uint32 Main_Flags;//!< //Флаг аварийной блокировки блока + Uint16 powered_okCounter;//!< Счетчик для ожидания включеня модуля защит после инециализации + void (*init)(struct SSM_Protect*); /* Pointer to the init funcion */ + void (*slow_calc)(struct SSM_Protect*); /* Pointer to the calc funtion */ + void (*fast_calc)(struct SSM_Protect*); /* Pointer to the calc funtion */ + void (*ms_calc)(struct SSM_Protect*); /* Pointer to the calc funtion */ + } ; + typedef struct SSM_Protect TSM_Protect; + + //!Инициализатор по умолчанию +#define SM_PROTECT_DEFAULTS {0,0,\ + 0,0,\ + 0,0,\ + 0,0,\ + 0,0,\ + 0,0,\ + 0,0,0,0,0,\ + 0,0,0,0,\ + SM_Protect_Init,\ + SM_Protect_Slow_Calc,\ + SM_Protect_Fast_Calc,\ + SM_Protect_ms_Calc,\ + } + +//! \memberof TSM_Protect + void SM_Protect_Init(TSM_Protect*); +//! \memberof TSM_Protect + void SM_Protect_Slow_Calc(TSM_Protect*); +//! \memberof TSM_Protect + void SM_Protect_Fast_Calc(TSM_Protect*); +//! \memberof TSM_Protect + void SM_Protect_ms_Calc(TSM_Protect*); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + + + + + + diff --git a/Vinclude/SM_Sys.h b/Vinclude/SM_Sys.h new file mode 100644 index 0000000..ef6522a --- /dev/null +++ b/Vinclude/SM_Sys.h @@ -0,0 +1,90 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMSys.h + \brief Модуль-обертка для расчета остальных модулей. (см. TSM_Sys) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup SMSys Модуль-обертка для расчета остальных модулей. (см. TSM_Sys) + @{ +*/ + +#ifndef SM_Sys_H +#define SM_Sys_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + //! Система в инициализации + #define SYS_INIT 0 + //! Система проинициализирована + #define SYS_READY 1 + + +/*! \class TSM_Sys + \brief Модуль-обертка для расчета остальных модулей. + + Класс \a TSM_Sys, основанный на структуре SSMSys, является модулем, + внутри методов которого происходит вызов большинства остальных. Например, + функция быстрого расчета данного модуля вызывает функции быстрого расчета + остальных модулей. Кроме того, в инициализации данного модуля настраиваются прерывания + контроллера. + */ + +//! см. TSM_Sys + struct SSM_Sys + { + int state;//!< Состояние + int state_prev;//!< Состояние предыдущее + int E;//!<Флаг первого вхождения + void (*init)(struct SSM_Sys*); /* Pointer to the init funcion */ + void (*slow_calc)(struct SSM_Sys*); /* Pointer to the calc funtion */ + void (*fast_calc)(struct SSM_Sys*); /* Pointer to the calc funtion */ + void (*ms_calc)(struct SSM_Sys*); /* Pointer to the calc funtion */ + } ; + + typedef struct SSM_Sys TSM_Sys; + +//!Инициализатор по умолчанию +#define SM_Sys_DEFAULTS {0,0,0,\ + SM_Sys_Init,\ + SM_Sys_Slow_Calc,\ + SM_Sys_Fast_Calc,\ + SM_Sys_ms_Calc,\ + } + + //! \memberof TSM_Sys + void SM_Sys_Init(TSM_Sys*); + //! \memberof TSM_Sys + void SM_Sys_Slow_Calc(TSM_Sys*); + //! \memberof TSM_Sys + void SM_Sys_Fast_Calc(TSM_Sys*); + //! \memberof TSM_Sys + void SM_Sys_ms_Calc(TSM_Sys*); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + + + + diff --git a/Vinclude/V_AutoOffset.h b/Vinclude/V_AutoOffset.h new file mode 100644 index 0000000..515e7f4 --- /dev/null +++ b/Vinclude/V_AutoOffset.h @@ -0,0 +1,72 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_AutoOffset.h (IQ version) + \brief Автоматический расчет смещения для АЦП + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + + + + Данное программное обеспечение распространяется "как есть", и Вы, + его пользователь, принимаете на себя все риски, связанные с его использованием. + ООО "НПФ Вектор" не несет никакой ответственности за возможные убытки, + связанные с его использованием. + +*/ + + +#ifndef V_AUTO_OFFSET_H +#define V_AUTO_OFFSET_H + +#ifdef __cplusplus +extern "C" +{ +#endif +#include "DSP.h" + + struct SAutoOffset + { + _iq FilterK;//!< Коэффициент фильтра (темп изменения смещения) + int32 IA_int; //!< Интегратор для тока фазы A + int32 IB_int; //!< Интегратор для тока фазы B + int32 IC_int; //!< Интегратор для тока фазы C + int Enabled; //!< Включено/выключено + void (*init)(volatile struct SAutoOffset *); + void (*ms_calc)(volatile struct SAutoOffset *); + void (*slow_calc)(volatile struct SAutoOffset *); + }; + + typedef volatile struct SAutoOffset TAutoOffset; + + +#define AUTO_OFFSET_DEFAULTS {\ + _IQ(0.0001),\ + 0,0,0,\ + 0,\ + AutoOffset_init,\ + AutoOffset_calc,\ + AutoOffset_slow_calc} + + void AutoOffset_init(TAutoOffset *); + void AutoOffset_calc(TAutoOffset *); + void AutoOffset_slow_calc(TAutoOffset *); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Vinclude/V_CANtoRS.h b/Vinclude/V_CANtoRS.h new file mode 100644 index 0000000..7c8d30d --- /dev/null +++ b/Vinclude/V_CANtoRS.h @@ -0,0 +1,110 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_CANtoRS.h + \brief Преобразователь посылок CAN в RS/USB и обратно. Работает +совместно с драйвером CANOpen + + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 3.0 08/08/2017 + +*/ + +#ifndef V_CAN_TO_RS_H +#define V_CAN_TO_RS_H + +#ifdef __cplusplus +extern "C" { +#endif + +#define CANTORS_BUFSIZE 20 +#define CANTORS_TRANSM_TIME_OUT 10 +#define CANTORS_READ_DATA_MAX_LEN 10 +#define CANTORS_HEART_COUNTER_MAX 1000 + + +#define CANTORS_ACTIVE 0x1 +#define CANTOUSB_ACTIVE 0x2 + +#include "DSP.h" +#include "CANOpen_drv.h" + +struct SCANtoRS { + Uint16 lastActiveConnection; // Определяет, какой интерфейс был активен в последний раз - USB или RS + Uint8 tempBuf[13]; // Временный буфер для данных + Uint16 test_dbg; //для отладки + Uint16 APIpacketMode; + int16 HeartBeatGo;//пропустите сердцебиение! + Uint16 callback_go; //флаг для вызова callback + Uint16 TransmBusy; //флаг занятости передатчика + Uint16 PacketInWait; //флаг если есть что-то в буфере отправки + Uint16 HeartCounter; //счетчик для отправки HeartBeat + Uint16 TransmBusyTimeCount; //счетчик таймаута занятости передатчика + Uint16 ReadPackDataCounter; //счетчик данных в пакете + Uint16 ReadCRCCounter; //счетчик данных в пакете + Uint16 SendTimeoutCounter; + Uint16 all_len; //transmit buf len + Uint16 tr_counter; //transmit counter + Uint16 MessDrop1; + Uint16 MessDrop2; + Uint16 MessDrop3; + Uint16 CounterWrongCRC; + Uint16 CounterRes; + Uint16 CounterSended; + void (*init)(volatile struct SCANtoRS *); /* Pointer to the init function */ + void (*calc)(volatile struct SCANtoRS *); /* Pointer to the calc function */ + void (*receive)(volatile struct SCANtoRS *); + Uint16 (*write)(TZCanMsg* MSG,volatile struct SCANtoRS *); + void (*callback)(TCo_OdVars* ppc, TZCanMsg* p); + unsigned char buf_out[CANTORS_BUFSIZE]; + Uint16 temp_buf[CANTORS_BUFSIZE]; + TZCanMsg MSG; + TZCanMsg bufMSG; + Uint16 ReadPackData[CANTORS_BUFSIZE]; //буфер для API посылки + Uint16 ReadCRC[2]; //буфер для СRC + Uint16 TempData[10]; + Uint16* nodeID; + UART_TypeDef *NT_UART;//!Указатель на используемый модуль UART + }; + +typedef volatile struct SCANtoRS TCANtoRS; + + +void CANtoRS_init(TCANtoRS*); +void CANtoRS_calc(TCANtoRS*); +void CANtoRS_Receive(TCANtoRS*); +Uint16 CANtoRS_SendP(Uint16* Data, int16 len,TCANtoRS *p); +Uint16 CANtoRS_Write(TZCanMsg* MSG,TCANtoRS *p); +Uint16 CANtoRS_WriteHelper(TZCanMsg* MSG,TCANtoRS *p); +void CANtoRS_HeartBeat(TCANtoRS *p); +Uint16 CANtoRS_C_CRC(TCANtoRS *p,Uint16 *Data,Uint16 len); +void CANtoRS_Analysis(TCANtoRS*); + + +//если добавляем в струкуру переменные то добавляем значения по умолчанию +#define CAN_TO_RS_DEFAULTS { .init = CANtoRS_init,\ + .calc = CANtoRS_calc,\ + .receive = CANtoRS_Receive,\ + .write = CANtoRS_WriteHelper} + +#ifdef __cplusplus +} +#endif + +#endif + + + + diff --git a/Vinclude/V_CurPar.h b/Vinclude/V_CurPar.h new file mode 100644 index 0000000..d300179 --- /dev/null +++ b/Vinclude/V_CurPar.h @@ -0,0 +1,101 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_CurPar.h + \brief Расчет наблюдаемых текущих параметров (см. TCurPar) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup V_CurPar Расчет наблюдаемых текущих параметров (см. TCurPar) + + @{ +*/ + + +#ifndef V_CURPAR_H +#define V_CURPAR_H + +#include "filter.h" + +#ifdef __cplusplus +extern "C" { +#endif + + + /*! \class TCurPar + \brief Расчет наблюдаемых текущих параметров + + Класс \a TCurPar, основанный на структуре SCurPar, содержит + ряд разрозненных вычислений для отображения текущих параметров привода. + Например, расчет действующих токов фаз, текущей мощности и т.п. + */ + +//! см. TCurPar +struct SCurPar{ + long speed; //!< Текущая частота вращения + long power; //!< Текущая мощность + long Is; //!< Текущая ток статора амплитудный мгновенный + long ThetaRefCurr; //!< Заданное угловое положение + long ThetaCurr; //!< Текущее угловое положение + + long IsRef; //!< Ток статора заданный + long Ialpha; //!< Ток по оси альфа + long Ibeta; //!< Ток по оси бетта + + long Ualpha; //!< Напряжение по оси альфа + long Ubeta; //!< Напряжение по оси бетта + long PowerK; //!< Служебный параметр для масштабирования мощности + + TFilter fPower; //!< Фильтр мощности + + void (*init)(volatile struct SCurPar*);//!< процедура инициализации + void (*calc)(volatile struct SCurPar*);//!<расчет + void (*slow_calc)(volatile struct SCurPar*);//!<медленный расчет +}; + +typedef volatile struct SCurPar TCurPar; + + +//!инициализатор по-умолчанию +#define TCUR_PAR_DEFAULTS \ +{\ + 0,0,0,0,0,\ + 0,0,0,\ + 0,0,0,\ + FILTER_DEFAULTS,\ + &CurPar_init, \ + &CurPar_calc, \ + &CurPar_slow_calc, \ +} + + +//! \memberof TCurPar +void CurPar_init(TCurPar*); +//! \memberof TCurPar +void CurPar_calc(TCurPar*); +//! \memberof TCurPar +void CurPar_slow_calc(TCurPar*); + + + +#ifdef __cplusplus +} +#endif // extern "C" + +#endif // V_UF_H + +/*@}*/ + + diff --git a/Vinclude/V_DIO.h b/Vinclude/V_DIO.h new file mode 100644 index 0000000..aaf0bd7 --- /dev/null +++ b/Vinclude/V_DIO.h @@ -0,0 +1,119 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_DIO.h + \brief Модуль дискретных входов/выходов + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 25/08/2017 + + \addtogroup + @{*/ + + +#ifndef V_DIO_H +#define V_DIO_H + +#ifdef __cplusplus +extern "C" { +#endif + + +// Макрос установки в '1' заданного бита +// var - целеваЯ переменнаЯ +// index - индекс (смещение) устанавливаемого бита +#define SET_BIT(var, index) var |= (1 << index); + +// Макрос сброса в '0' заданного бита +// var - целеваЯ переменнаЯ +// index - индекс (смещение) очищаемого бита +#define CLEAR_BIT(var, index) var &= (~(1 << index)); + +// Макрос проверки ненулевого состоЯния заданного бита +// var - целеваЯ переменнаЯ +// index - индекс (смещение) проверЯемого бита +#define BIT_IS_SET(var, index) ((var & (1 << index)) != 0) + +// Макрос проверки нулевого состоЯния заданного бита +// var - целеваЯ переменнаЯ +// index - индекс (смещение) проверЯемого бита +#define BIT_IS_CLEAR(var, index) ((var & (1 << index)) == 0) + + +// Дефайним дискретные входы +#ifdef HW_MOTORCONTROLBOARD +//TODO переделать +#define D_IN1 ((GPIOM->DATA & (1 << 13)) == 0) //M13 Старт +#define D_IN2 ((GPIOM->DATA & (1 << 11)) == 0) //M11 Стоп +#define D_IN3 ((GPIOM->DATA & (1 << 10)) == 0) //M10 Сброс аварий +#else +#define D_IN1 0 +#define D_IN2 0 +#define D_IN3 0 +#endif + +// Дефайним дискретные выходы +#ifdef HW_MOTORCONTROLBOARD +#define D_OUT1_ON GPIOD->DATAOUTSET = GPIO_PIN_1 +#define D_OUT1_OFF GPIOD->DATAOUTCLR = GPIO_PIN_1 +#define D_OUT2_ON GPIOD->DATAOUTSET = GPIO_PIN_2 +#define D_OUT2_OFF GPIOD->DATAOUTCLR = GPIO_PIN_2 +#define D_OUT3_ON GPIOM->DATAOUTSET = GPIO_PIN_14 +#define D_OUT3_OFF GPIOM->DATAOUTCLR = GPIO_PIN_14 +#else +#define D_OUT1_ON +#define D_OUT1_OFF +#define D_OUT2_ON +#define D_OUT2_OFF +#define D_OUT3_ON +#define D_OUT3_OFF +#endif + + + +// Вектор состоЯниЯ дискретных выходов +extern volatile Uint16 output_vect; +// Маска инвертированиЯ вектора состоЯниЯ дискретных выходов +extern volatile Uint16 output_mask; + +// Вектор состоЯниЯ дискретных входов +extern volatile Uint16 input_vect; +// Маска инвертированиЯ вектора состоЯниЯ дискретных входов +extern volatile Uint16 input_mask; + +// Коэффициент фильтрации дискретных входов Kf = 0.0001/Tф +// (Tф - постоЯннаЯ времени фильтра, сек) +extern volatile _iq inputKf; +#define in_Kf inputKf // псевдоним длЯ уже имеющейся переменной в словаре CANopen + +// Порог перехода дискретного входа в состоЯние OFF (0) +extern volatile _iq inputOff; +// Порог перехода дискретного входа в состоЯние ON (1) +extern volatile _iq inputOn; + + +void DIO_Init(); + +void DIO_slow_calc(); // вызывать в фоновой программе + +void DIO_fast_calc(); // вызывать с частотой 1кГц или 10 кГц + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/V_DPR_eCAP.h b/Vinclude/V_DPR_eCAP.h new file mode 100644 index 0000000..752a8c0 --- /dev/null +++ b/Vinclude/V_DPR_eCAP.h @@ -0,0 +1,225 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_DPR_eCAP.h + \brief Модуль расчёта скорости и положения по трём датчикам на элементах Холла. + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + +*/ + +#ifndef V_DPR_ECAP_H +#define V_DPR_ECAP_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +struct SDPReCAPFLG1_BITS // bits + { +Uint16 AngleMode: + 1; // 0 Режим расчета угла: 0 - 6 секторов, 1 - интерполяция +Uint16 SpeedMode: + 1; // 1 Режим расчета скорости: 0 - по каждому датчику, 1 - по каждой метке +Uint16 Dir: + 1; // 2 Направление движения: 0 - по часовой, 1 - против. +Uint16 PrevDir: + 1; // 3 Направление движения: 0 - по часовой, 1 - против. +Uint16 CAPnumber: + 2; // 4-5 Номер eCAP, по которому было предыдущее прерывание. +Uint16 ZeroFLG: + 1; // 6 Флаг обнуления скорости +Uint16 SpeedMinFLG: + 1; // 7 + +Uint16 firstlaunch1:1; //!< 1 FLAG: первое попадание в прерывание eCAP1. +Uint16 firstlaunch2:1; //!< 2 FLAG: первое попадание в прерывание eCAP2. +Uint16 firstlaunch3:1; //!< 3 FLAG: первое попадание в прерывание eCAP3. +Uint16 rsvd: + 5; // 8-15 reserved; + }; + + union SDPReCAP_FLG1 + { + Uint16 all; + struct SDPReCAPFLG1_BITS bit; + }; + + struct SDPReCAP + { + int16 HallCode; //Текущий код положения по датчикам Холла + Uint32 Ts; // Период для расчёта интерполированного угла + Uint32 Tspeed; // Период для расчёт скорости + Uint32 TsNom; // Период, соответсвующий номинальной скорости + Uint32 TsNomMilsec; // Период, соответсвующий номинальной скорости при тактировании 1 мс + Uint32 PrevTs; // Предыдущая величина периода для расчёта угла. + _iq speed; // Расчитанная скорость + + _iq speedMIN; // Уставка минимальной скорости + _iq speedMinREF; // Скорость, соответствующая уставке для обнуления скорости + _iq Angle; // Расчитанный интерполированный угол + _iq Angle6; // Расчитанный декодированный угол + _iq AnglePrev; // Расчитанный декодированный угол предыдущий + + Uint32 cnt; // Счётчик числа прерываний с момента пуска (дальше 2 не считает). + Uint32 cnt2; // Счётчик прерываний смомента реверса. + Uint32 milsec; // Время в мс с момента прихода прошлой метки + Uint32 milsecFIX; // Переститанная уставка для обнуления скорости + Uint32 milsecREF; // Уставка для обнуления скорости + Uint32 milsecPrevREF; // Предыдущее значение уставки для обнуления скорости + + Uint32 PrevTspeed; // Предыдущая величина периода для расчёта скорости + Uint32 PrevTspeed1; // Предыдущая величина периода для расчёта скорости по датчику А. + Uint32 PrevTspeed11; + Uint32 PrevTspeed2; // Предыдущая величина периода для расчёта скорости по датчику B. + Uint32 PrevTspeed22; + Uint32 PrevTspeed3; // Предыдущая величина периода для расчёта скорости по датчику C. + Uint32 PrevTspeed33; + + int16 CAPCalcEna1; + int16 CAPCalcEna2; + int16 CAPCalcEna3; + + int16 CAP_WrongEdgeCnt; + int16 CAP_WrongEdgeCnt1; + int16 CAP_WrongEdgeCnt2; + int16 CAP_WrongEdgeCnt3; + int16 CAP_WrongEdgeCntPrev; + + Uint16 WrongCodeCounter; + Uint16 WrongCodeCounterPerSec; + Uint16 WrongCodeCounterLimitPerSec; + int32 AngleOffset; + + + int16 ErrorLevel; + int16 ErrorLevelCounter; + int16 ErrorLevelTimeCounterBig; + int16 ErrorLevelTimeCounter; + int16 SensorFault; + Uint16 UserDirection;//пользовательская инверсия направления + + float SimulatorOmega2IQ_factor; + + union SDPReCAP_FLG1 DPReCAP_FLG1; + + + void (*Init)(volatile struct SDPReCAP*); + void (*AngleCalc)(volatile struct SDPReCAP*); + void (*Angle6Calc)(volatile struct SDPReCAP*); + void (*AngleErrorCalc)(volatile struct SDPReCAP*); + void (*SpeedCalc)(volatile struct SDPReCAP*); + void (*CAP1Calc)(volatile struct SDPReCAP*); + void (*CAP2Calc)(volatile struct SDPReCAP*); + void (*CAP3Calc)(volatile struct SDPReCAP*); + void (*HelpCalc)(volatile struct SDPReCAP*); + void (*slow_calc)(volatile struct SDPReCAP*); + void (*ms_calc)(volatile struct SDPReCAP*); + void (*calc_10k)(volatile struct SDPReCAP*); + }; + typedef volatile struct SDPReCAP TDPReCAP; + + /****************************************************************************** + Инициализация структуры по умолчанию + ******************************************************************************/ +#define DPRECAP_DEFAULTS \ + {\ + 0,0,0,0,0,0,0, \ + 0,0,0,0,0, \ + 0,0,0,0,0,0, \ + 0,0,0,0,0,0,0,\ + 0,0,0,\ + 0,0,0,0,0,\ + 0,0,0,0,\ + 0,0,0,0,0,0,\ + 0,0,\ + &DPReCAP_Init, \ + &DPReCAP_AngleCalc, \ + &DPReCAP_Angle6Calc, \ + &DPReCAP_AngleErrorCalc, \ + &DPReCAP_SpeedCalc, \ + &DPReCAP_CAP1Calc, \ + &DPReCAP_CAP2Calc, \ + &DPReCAP_CAP3Calc, \ + &DPReCAP_HelpCalc, \ + &DPReCAP_SlowCalc, \ + &DPReCAP_msCalc, \ + &DPReCAP_calc_10k\ + } + + /****************************************************************************** + Процедура инициализации. + ******************************************************************************/ + void DPReCAP_Init(TDPReCAP*); + + /****************************************************************************** + Процедура расчёта угла. + ******************************************************************************/ + void DPReCAP_Angle6Calc(TDPReCAP*); + + /****************************************************************************** + Процедура вычисления факта ошибочного изменения угла. + ******************************************************************************/ + void DPReCAP_AngleErrorCalc(TDPReCAP*); + + /****************************************************************************** + Процедура расчёта интерполированного угла. + ******************************************************************************/ + void DPReCAP_AngleCalc(TDPReCAP*); + + /****************************************************************************** + Процедура расчёта скорости. + ******************************************************************************/ + void DPReCAP_SpeedCalc(TDPReCAP*); + + /****************************************************************************** + Расчёт прерывания 1 + ******************************************************************************/ + void DPReCAP_CAP1Calc(TDPReCAP*); + + /****************************************************************************** + Расчёт прерывания 2 + ******************************************************************************/ + void DPReCAP_CAP2Calc(TDPReCAP*); + + /****************************************************************************** + Расчёт прерывания 3 + ******************************************************************************/ + void DPReCAP_CAP3Calc(TDPReCAP*); + + /****************************************************************************** + Вспомогательные расчёт, общий для всех прерываний + ******************************************************************************/ + void DPReCAP_HelpCalc(TDPReCAP*); + + + /****************************************************************************** + Вспомогательные расчёт в фоне + ******************************************************************************/ + void DPReCAP_SlowCalc(TDPReCAP*); + + /****************************************************************************** + Миллисекундный расчет + ******************************************************************************/ + void DPReCAP_msCalc(TDPReCAP*); + + + void DPReCAP_calc_10k(TDPReCAP* p); +#ifdef __cplusplus +} +#endif // extern "C" + +#endif // V_DPR_ECAP_H diff --git a/Vinclude/V_Excitation.h b/Vinclude/V_Excitation.h new file mode 100644 index 0000000..c960f33 --- /dev/null +++ b/Vinclude/V_Excitation.h @@ -0,0 +1,65 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_excitation.h + \brief Модуль возбудителя + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 28/03/2017 + +\defgroup V_excitation + +@{*/ + + + +#ifndef V_excitation_H +#define V_excitation_H + +#ifdef __cplusplus +extern "C" { +#endif + + /*! \class Texcitation + \brief Модуль возбудителя + + Класс \a Texcitation, основанный на структуре Sexcitation, представляет + собой модуль возбудителя. + + */ + +//! см. Texcitation +typedef struct Sexcitation{ long ref; //!< Задание + void (*calc)(struct Sexcitation*);//!< Pointer to calculation function + }Texcitation; + + +//! Инициализатор по-умолчанию +#define excitation_DEFAULTS { 0, \ + excitation_calc} + + + +//! \memberof TRelayReg +void excitation_calc(Texcitation*); + + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/V_Fan.h b/Vinclude/V_Fan.h new file mode 100644 index 0000000..5c1b4e8 --- /dev/null +++ b/Vinclude/V_Fan.h @@ -0,0 +1,85 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_Fan.h + \brief Модуль работы вентилятора + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 25/08/2017 + + \addtogroup + @{*/ + + +#ifndef V_FAN_H +#define V_FAN_H + + +//! вентилятор выключен +#define FAN_CONTROL_STATE_OFF 0 +//! вентилятор включен +#define FAN_CONTROL_STATE_ON 1 +//! состояние перегрева +#define FAN_CONTROL_STATE_OVERHEAT 2 + +/* Включение и выключение вентилятора */ +#if defined (HW_MOTORCONTROLBOARD) + +#define FAN_ON GPIOB->DATAOUTSET = GPIO_PIN_13 +#define FAN_OFF GPIOB->DATAOUTCLR = GPIO_PIN_13 +#endif + +#if !defined (HW_MOTORCONTROLBOARD) +/* Дефайны для других контроллеров */ +#define FAN_ON +#define FAN_OFF +#endif + + +struct SFanControl{ + Uint16 Enabled; + + int state; //!<состояние + int state_shadow;//!< состояние теневое + int state_prev;//!<состояние предыдущее + int StateOn;//!<двоичное состояние: включен/не включен + + long T_on;//!<температура включения + long T_off;//!<температура выключения + long T_alarm;//!температура вывода предупреждения + void (*init)(volatile struct SFanControl*); + void (*slow_calc)(volatile struct SFanControl*); +}; + +typedef volatile struct SFanControl TFanControl; + + + +//! \memberof TFanControl +void FanControl_init(TFanControl*); +//! \memberof TFanControl +void FanControl_slow_calc(TFanControl*); //расчет в фоновом режиме + + +#define FAN_CONTROL_DEFAULTS {0,\ + FAN_CONTROL_STATE_OFF,FAN_CONTROL_STATE_OFF,FAN_CONTROL_STATE_OFF,0,\ + _IQ(2.5),_IQ(2), _IQ(4),\ + FanControl_init,\ + FanControl_slow_calc} + + + +#endif + +/*@}*/ diff --git a/Vinclude/V_IQmath.h b/Vinclude/V_IQmath.h new file mode 100644 index 0000000..571ddda --- /dev/null +++ b/Vinclude/V_IQmath.h @@ -0,0 +1,337 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_IQmath.h + \brief Библиотека функций целочисленной математики + \author ООО "НПФ Вектор". Все права защищены. http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup V_IQmath Библиотека функций целочисленной математики + + \addtogroup V_IQmath +@{*/ + + +#ifndef V_IQ_MATH_H +#define V_IQ_MATH_H + + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "DSP.h" + + +static const int32 fix16_max = 0x7FFFFFFF; /*!< the maximum value of int32 */ +static const int32 fix16_min = 0x80000000; /*!< the minimum value of int32 */ +static const int32 fix16_overflow = 0x80000000; /*!< the value used to indicate overflows when FIXMATH_NO_OVERFLOW is not specified */ + + +static const int32 fix16_pi = 205887; +static const int32 fix16_e = 178145; +static const int32 fix16_one = 0x00010000; +#define _PI 3.1415926535f +typedef int32 _iq; + + +//Преобразование данных в формате с плавающей точкой в целочисленные форматы от IQ1 до IQ30. +#define _IQ30(A) (long) ((A) * 1073741824.0f) +#define _IQ29(A) (long) ((A) * 536870912.0f) +#define _IQ28(A) (long) ((A) * 268435456.0f) +#define _IQ27(A) (long) ((A) * 134217728.0f) +#define _IQ26(A) (long) ((A) * 67108864.0f) +#define _IQ25(A) (long) ((A) * 33554432.0f) +#define _IQ24(A) (long) ((A) * 16777216.0f) +#define _IQ23(A) (long) ((A) * 8388608.0f) +#define _IQ22(A) (long) ((A) * 4194304.0f) +#define _IQ21(A) (long) ((A) * 2097152.0f) +#define _IQ20(A) (long) ((A) * 1048576.0f) +#define _IQ19(A) (long) ((A) * 524288.0f) +#define _IQ18(A) (long) ((A) * 262144.0f) +#define _IQ17(A) (long) ((A) * 131072.0f) +#define _IQ16(A) (long) ((A) * 65536.0f) +#define _IQ15(A) (long) ((A) * 32768.0f) +#define _IQ14(A) (long) ((A) * 16384.0f) +#define _IQ13(A) (long) ((A) * 8192.0f) +#define _IQ12(A) (long) ((A) * 4096.0f) +#define _IQ11(A) (long) ((A) * 2048.0f) +#define _IQ10(A) (long) ((A) * 1024.0f) +#define _IQ9(A) (long) ((A) * 512.0f) +#define _IQ8(A) (long) ((A) * 256.0f) +#define _IQ7(A) (long) ((A) * 128.0f) +#define _IQ6(A) (long) ((A) * 64.0f) +#define _IQ5(A) (long) ((A) * 32.0f) +#define _IQ4(A) (long) ((A) * 16.0f) +#define _IQ3(A) (long) ((A) * 8.0f) +#define _IQ2(A) (long) ((A) * 4.0f) +#define _IQ1(A) (long) ((A) * 2.0f) + +//по умолчанию формат IQ24 +#define _IQ(A) _IQ24(A) +#define _IQmpy(A,B) _IQ24mpy(A,B) +#define _IQmpyI32(A,B) _IQ24mpyI32(A,B) +#define _IQdiv(A,B) _IQ24div(A,B) +#define _IQsqrt(A) _IQ24sqrt(A) +#define _IQsinPU(A) _IQ24sinPU(A) +#define _IQcosPU(A) _IQ24cosPU(A) +#define _IQsin(A) _IQ24sin(A) +#define _IQcos(A) _IQ24cos(A) +#define _IQtanPU(A) _IQ24tanPU(A) +#define _IQatan2PU(A,B) _IQ24atan2PU(A,B) +#define _IQmag(A,B) _IQ24mag(A,B) +#define _IQtoF(A) _IQ24toF(A) + + +int32 _IQ24sinPU(int32 inAngle); +int32 _IQ24atan2PU(int32 inY , int32 inX); +int32 _IQ24sinPU_accurate(int32 inAngle); +int32 _IQ24sqrt(int32 inValue); +int32 _IQ16div(int32 a, int32 b); +int32 _IQ24div(int32 a, int32 b); +int32 _IQ21div(int32 a, int32 b); +int32 _IQ10div(int32 a, int32 b); +int32 _IQ24mag(int32 a, int32 b); + +//! Преобразует из целочисленного 8.24 в формат float +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline float _IQ24toF(int32_t a) { + return (float)(a)*(1.0/16777216.0f); +} + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline float _IQ21toF(int32_t a) { + return (float)(a)*(1.0/2097152.0f); +} + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline float _IQ12toF(int32_t a) { + return (float)(a)*(1.0/4096.0f); +} + +//! Преобразует из целочисленного 22.10 в формат float + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline float _IQ10toF(int32_t a) { + return (float)(a)*(1.0/1024.0f); +} + +//! Преобразует из целочисленного 26.6 в формат float + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline float _IQ6toF(int32_t a) { + return (float)(a)*(1.0/64.0f); +} + +//! Умножение двух чисел в формате 8.24 + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ24mpy(int32 inArg0, int32 inArg1) { + return (int32)(((int64_t)inArg0 * inArg1)>> 24); +} + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ18mpy(int32 inArg0, int32 inArg1) { + return (int32)(((int64_t)inArg0 * inArg1)>> 18); +} + + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ20mpy(int32 inArg0, int32 inArg1) { + return (int32)(((int64_t)inArg0 * inArg1)>> 20); +} + + + +//! Умножение двух чисел в формате 32.0 + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ24mpyI32(int32 inArg0, int32 inArg1) { + return (inArg0 * inArg1); +} + +//! Умножение двух чисел в формате 16.16 + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ16mpy(int32 inArg0, int32 inArg1) { + int64_t product = (int64_t)inArg0 * inArg1; + int32 result = product >> 16; +// result += (product & 0x8000) >> 15; //Непонтяно для чего. Написано для округления + return result; +} + +//! Умножение двух чисел в формате 28.4 + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ4mpy(int32 inArg0, int32 inArg1) { + return (int32)(((int64_t)inArg0 * inArg1)>> 4); +} + + +//! Функция косинуса, вызывает функцию синуса + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ24cosPU(int32 inAngle) { + return _IQ24sinPU(inAngle + _IQ24(0.25)); +} + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ18sinPU(int32 inAngle) { + return _IQ24sinPU(inAngle<<6)>>6; +} + + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ18cosPU(int32 inAngle) { + return _IQ24sinPU((inAngle<<6) + _IQ24(0.25))>>6; +} + + +//! Функция тангенса, вызывает функции синуса и косинуса. + +//! \memberof V_IQmath +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ24tanPU(int32 inAngle) { + return _IQ24div(_IQ24sinPU(inAngle), _IQ24sinPU(inAngle)); +} + +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ16toIQ(int32 a){ + return (a << 8); +} + +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ24cos(int32 x){ + x = _IQmpy(x, _IQ(0.15915494309189533576)); + return _IQsinPU(x + _IQ24(0.25)); +} + +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQ24sin(int32 x){ + x = _IQmpy(x, _IQ(0.15915494309189533576)); + return _IQsinPU(x); +} + +#if defined (__GNUC__) +__attribute__((always_inline)) +#elif defined (__CMCPPARM__) +__STATIC_INLINE +#endif +inline int32 _IQabs(int32 x){ + if (x<0) + return -x; + return x; +} + +#ifdef __CMCPPARM__ +#define fabs(x) fabsf(x) +#endif /* __CMCPPARM__ */ + + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/V_MBVarsConv.h b/Vinclude/V_MBVarsConv.h new file mode 100644 index 0000000..167245b --- /dev/null +++ b/Vinclude/V_MBVarsConv.h @@ -0,0 +1,90 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_MBVarsConv.h + \brief Модуль преобразования данных Modbus + \author ООО "НПФ ВЕКТОР" + \version v.1.1. 02/03/2017 + + \addtogroup v_ModBus + + @{ +*/ + + + +#ifndef V_MBVARSCONV_H +#define V_MBVARSCONV_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "DSP.h" + +/*! \class TMBVarsConv + \brief Модуль преобразования данных Modbus + + Класс \a TMBVarsConv, основанный на структуре SMBVarsConv, предназначен + для преобразования данных из формата 16 разрядов Modbus в формат системы управления (IQ 24). +*/ + + +struct SMBVars{ + int Command; + int CommandPrev; + int speed_ref; + int CurIs; + int CurSpeed; + int Main_ErrorCode; + int Umax_protect; + }; +//!см. TMBVarsConv MBVars +#define SMBVARS_DEFAULTS {0,0,0,0,0,0} + + +struct SMBVarsConv{ + struct SMBVars Vars; + Uint16 NeedForSave; + void (*init)(volatile struct SMBVarsConv*); + void (*calc)(volatile struct SMBVarsConv*); + void (*slow_calc)(volatile struct SMBVarsConv*); + }; + +typedef volatile struct SMBVarsConv TMBVarsConv; + +//!Инициализатор по умолчанию +#define MBVARSCONV_DEFAULTS { SMBVARS_DEFAULTS,\ + 0,\ + MBVarsConv_init,\ + MBVarsConv_calc,\ + MBVarsConv_slow_calc\ + } + +//! \memberof TMBVarsConv +void MBVarsConv_init(TMBVarsConv *p); +//! \memberof TMBVarsConv +void MBVarsConv_calc(TMBVarsConv *p); +//! \memberof TMBVarsConv +void MBVarsConv_slow_calc(TMBVarsConv *p); + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/V_ModBus.h b/Vinclude/V_ModBus.h new file mode 100644 index 0000000..c377b89 --- /dev/null +++ b/Vinclude/V_ModBus.h @@ -0,0 +1,126 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_ModBus.h + \brief Драйвер ModBus (см. TModBus) + \author Alecksey Anuchin + \version v 1.1 24/03/2017 + \defgroup V_ModBus Драйвер ModBus (см. TModBus) + @{ +*/ + +#ifndef V_MODBUS_H +#define V_MODBUS_H + +#ifdef __cplusplus + extern "C" { +#endif + +#include "mbod.h" + + +#define MODBUS_MAX_RX_COUNT 10 + +/*! \class TModBus + \brief Драйвер ModBus + + Класс \a TModBus, основанный на структуре SModBus, обрабатывает + входящие посылки по RS-485 как посылки ModBus (RTU). */ + +//! см. TModBus + + + //! Структура modbus для хранения внутренних данных + typedef struct {volatile Uint16 In[MODBUS_MAX_RX_COUNT];//!<Массив для принятия данных + volatile Uint16 InCount;//!<Счетчик для массива принятых данных + volatile MB_Record /*const*/ *Addr;//!<Указатель на словарь + volatile Uint16 TimeOut;//!<Текущий таймаут, который надо выдерживать + volatile Uint16 TimeOut1_5;//!<Рассчитанный таймаут 1,5 длины переданного байта + volatile Uint16 TimeOut2_5;//!<Рассчитанный таймаут 2,5 длины переданного байта + volatile Uint16 ToSend;//!<Данные для отправки + volatile Uint16 NumOfHRs;//!<Количество Holding Registers + volatile Uint16 MiddleOfHRs;//!<Середина Holding Registers + volatile Uint16 InitialStepOfHRs;//!<Шаг Holding Registers + volatile Uint16 NumOfIRs;//!<Количество Input Registers + volatile Uint16 MiddleOfIRs;//!<Середина Input Registers + volatile Uint16 InitialStepOfIRs;//!<Шаг Input Registers + volatile Uint16 NumOfCs;//!<Количество Coils + volatile Uint16 MiddleOfCs;//!<Середина Coils + volatile Uint16 InitialStepOfCs;//!<Шаг Coils + volatile Uint16 NumOfDIs;//!<Количество Discrete Inputs + volatile Uint16 MiddleOfDIs;//!<Середина Discrete Inputs + volatile Uint16 InitialStepOfDIs;//!<Шаг Discrete Inputs + volatile Uint16 RxCRC;//!<Принимаемая контрольная сумма + volatile Uint16 TxCRC;//!<Передаваемая контрольная сумма + volatile Uint16 MagicNumber;//!<Эм... + volatile int16 TxState;//!<Состояние передачи + volatile Uint16 temp;//!< + volatile int16 RecievedCounter;//!<Счетчик для отсчиывания таймаута по приему + UART_TypeDef *NT_UART;//!Указатель на используемый модуль UART + } MODBUS_INT; + + #define MODBUS_INT_DEFAULTS {{0},0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\ + 0xFFFF,0xFFFF, 0xA001,-1, 0,0, \ + } + +struct SModBus{Uint32 BaudRate;//!<Скорость работы по RS + Uint16 ExecutionFreq;//!< Частота тактирования модуля + Uint16 RSNodeID; //!< Номер узла в сети + Uint16 Enabled; //!< Разрешение изменения параметров привода через ModBus + Uint16 Refresh; //!< Флаг изменения параметров по Modbus + int16 error; + int16 errorCode; + int16 AutoRestart; + int16 clear_error; + Uint16 received_data; + Uint16 GPIOsValue; + Uint16 isOnline;//!< В сети мы или нет (идут ли пакеты) + Uint32 OfflineCounter;//!< Счетчик инкрементируется с частотой вызова процедуры ModBus_Execute и обнуляется, если в сети есть пакеты + Uint32 OfflineCounterMax;//!< Таймаут отсутствия пакетов в сети (в единицах счёта OfflineCounter) + Uint16 ReceiveByteCounter;//!< Счетчик принятых байт + Uint16 ReceivePacketCounter;//!< Счетчик принятых посылок + MODBUS_INT MBInternals;//!< Служебные переменные для работы драйвера (не для пользователя) + void (*Init)(volatile struct SModBus*); + void (*Execute)(volatile struct SModBus*); + }; + + +typedef volatile struct SModBus TModBus; + + +#define MODBUS_DEFAULTS {9600,10000, 0x01, 1, 0,\ + 0,0,0,0,0,0,0,0,0,0,0,\ + MODBUS_INT_DEFAULTS,\ + ModBus_Init, \ + ModBus_Execute,\ + } + + +//! \memberof TModBus +void ModBus_Init(TModBus *p); +//! \memberof TModBus +void ModBus_Execute(TModBus *p); +//! \memberof TModBus +int16 ModBus_FindVocAddr(TModBus *p,volatile MB_Record Table[], Uint16 TableSize, int16 Type, Uint16 Index, int16 NumOfIndexs, int16 Mid, int16 Step); + + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/V_MotorModel.h b/Vinclude/V_MotorModel.h new file mode 100644 index 0000000..a2283a5 --- /dev/null +++ b/Vinclude/V_MotorModel.h @@ -0,0 +1,172 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_MotorModel.h + \brief Модуль моделей электродвигателей (см. TMotorModel) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2017 + + \defgroup V_MotorModel.h Модуль моделей электродвигателей (см. TMotorModel) + + @{ +*/ + + +#ifndef V_MOTOR_MODEL_H +#define V_MOTOR_MODEL_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "DSP.h" +#include "V_IQmath.h" + + +// faults +#define MODEL_WRONG_PARAMETERS 1 +#define MODEL_MAX_CURRENT_FAULT 2 +#define MODEL_MAX_SPEED_FAULT 3 + +// motor types (for internal use) +#define MODEL_INDUCTION_MOTOR 0 +#define MODEL_SYNC_MOTOR 1 +#define MODEL_DC_MOTOR 2 +#define MODEL_SRD_MOTOR 3 + +#define MOTOR_MODEL_PI 3.1415926f +#define MODEL_INV_2PI 0.15915494f + +//структура с параметрами двигателя и преобразователя +struct Smotor +{ + int cmpr0, cmpr1, cmpr2, cmpr3; //!< уставки сравнения ШИМ + int tpr; //!< период ШИМ + float inv_tpr; //!< 1/период ШИМ + int dt; //!< величина мертвого времени в тактах + int dta, dtb, dtc, dtf; //!< влияние мертвого времени на потенциалы фаз + float udc; //!< напряжение ЗПТ + float fia, fib, fic, fiav; //!< потенциалы фаз и средней точки + float ua, ub, uc; //!< фазные напряжения + float isa, isb, isc, isd, isq; //!< фазные токи в осях альфа, бетта + float usa, usb, usd, usq, urd, urq; //!< напряжения в ортогональных осях + float ird, irq, ira, irb; //!< токи в ортогональных осях + float omega,omega_rpm,torque; //!< скорость (частота вращения), момент + float torque_a, torque_b, torque_c; //!< момент от каждой фазы (SRD) + float j, inv_j; //!< момент инерции и обратная величина + float MechLoss; //!< момент инерции + float pp; //!< число пар полюсов + float inv_pp; //!< 1/pp + float tetaR; //!< угол положения ротора, электрический + float tetaRM; //!< угол положения ротора, механический + float cosTetaR, sinTetaR; //!< cos и sin угла положения ротора + float lm, lr, ls, lsd, lsq; //!< индуктивности - взаимная, ротора, статора + float lmin, lmax, dls; //!< минимальная индуктивность (зуб-паз), максимальная индуктивность (зуб-зуб), амплитуда изменения индуктивности + float inv_lmin; //!< 1/lmin + float l; //!< текущая индуктивнасть + float lp; //!< индуктивнасть в окрестности текущего положения + float ip, im; //!< токи в окрестности текущего положения + float wp, wm; //!< магнитные энергии фазной катушки в окрестности текущего положения + float isat; //!< ток насыщения + float rr, rs; //!< сопротивление ротра и статора + float ks, kr, km; //!< коэффициенты индуктивностей + float psa, psb, psc, psd, psq, prd, prq, pra, prb; //!< потокосцепления статора и ротора в ортогональных осях или фазные + float ppsa, ppsb, ppsd, ppsq, pprd, pprq, ppra, pprb; //!< предикторы потокосцеплений в ортогональных осях + float dpsa, dpsb, dpsd, dpsq, dprd, dprq; //!< производные потокосцеплений в ортогональных осях + int type; //!< тип двигателя + float t, t2; //!< период дискретизации, половина периода дискретизации + float speedK; //!< коэффициент датчика скорости + float iSenseK, ifSenseK, udSenseK, iSenseR, iSenseN; //!< коэффициент датчика тока, сопротивление измерительного резистора ДТ, количество витков провода через ДТ + float RatedPower; //!< номинальная мощность (справочная величина, не используется в расчетах) + float RatedSpeed; //!< номинальная скорость (справочная величина, не используется в расчетах) + float RatedCurrent; //!< номинальный ток + float RatedFluxCurrent; //!< номинальный ток возбуждения + int iADCk, ifADCk; + float QEPResolution; //!< число меток ДПР + float m; //!< потокосцепление ротора синхронной машины + float i_a, i_f, u_a, u_f, u_an; + float r_a, r_f, r_ad, l_a, l_f; + float _1_l_a, _1_l_f; + float _1_lsd, _1_lsq; + float dia, dif, dpa, dpf, pia, pif; + float l_m,kf; //!< коэффициент тока ОВ, потов ОВ + int dcm_pm; //!< флаг, что ДПТ с ПМ. + int syncm_pm; //!< флаг, что СД с ПМ. + float isPhaseA,isPhaseB,isPhaseC,isPhaseD; //!< ток фазы A,B,C + float isPhaseA_prev,isPhaseB_prev,isPhaseC_prev; //!< ток фазы A,B,C предыдущие значения + int CurrentInvertedFlag; //!< Флаг о том, что после выклчюения инвертора токи фаз один раз сменили свой знак + float cos30; //!< cos 30 градусов + float pisa,dprb,disa; //!< предиктор тока статора альфа, приращения потокосцепления ротора по оси бета, тока статора по оси альфа + float ThetaMax, PsiMax, IMax; //!< максимальный угол, поток и ток SRM (для интерполяции) + float ThetaStep, PsiStep, IStep; //!< шаг по углу, потоку и току SRM (для интерполяции) + float ThetaStep_inv, PsiStep_inv, IStep_inv; //!< обратные значения шага по углу, потоку и току SRM (для интерполяции) + float power; //!< Мощность на валу + long iAtemp, iBtemp, iCtemp, iDtemp, Udc_temp, adcSpeedtemp;//!<Временные переменные для расчета модели + Uint16 hallSensor; //!< сигнал с датчика положения Холла + Uint16 hallSensorPrev; //!< сигнал с датчика положения Холла предыдущий + float hallSensorOmegaPrev; //!< Для имитации измерения частоты вращения с датчика Холла +}; +typedef volatile struct Smotor Tmotor; + + +//Структура с данными модели. является интерфейсом между основной программой и моделью двигателя. +//Принимает уставки сравнения, период ШИМ и величину мертвого времени, момент нагрузки. Выдает показания датчиков. +struct SMotorModel +{ + Uint16 MotorType; //!< Тип двигателя в модели (для симулятора) + Uint16 MotorParametersNum; //!< Номер параметров двигателя из таблицы + Uint16 MotorParametersNumMax; // Максимальный возможный номер параметров из таблицы + Uint16 cmpr0; //!< уставки сравнения ШИМ + Uint16 cmpr1; + Uint16 cmpr2; + Uint16 cmpr3; + int16 InvertorEna; //!< Флаг включения инвертора (если нет, то ключи не управляются) + Uint16 tpr; //!< период ШИМ + Uint16 dt; //!< мертвое время в тиках таймера + Uint16 adc_code_Speed; //!< измеренная скорость + Uint32 qepCounter; //!< положение с энкодера + Uint16 hallSensor; //!< Дискретный сигнал с датчика положения Холла (три первых бита) + float hallSensorInterpAdd; //!< Для имитации интерполяции датчика Холла + float hallSensorOmega; //!< Для имитации измерения частоты вращения с датчика Холла + Uint16 adc_code_iA; //!< измеренные токи + Uint16 adc_code_iB; + Uint16 adc_code_iC; + Uint16 adc_code_iD; + Uint16 adc_code_Udc; //!< измеренное значение напряжения звена постоянного тока (ЗПТ) + int16 fault; //!< ошибка модели + float load; //!< момент нагрузки + float loadTmp; //!< момент нагрузки временная переменная + void (*Init)(volatile struct SMotorModel*); //!< Pointer to the init function + void (*Execute)(volatile struct SMotorModel*); //!< Pointer to the update function + Tmotor motorInternals; //!< Внутренние переменные для расчета модели двигателя +}; + +typedef volatile struct SMotorModel TMotorModel; + +#define MOTOR_MODEL_DEFAULTS {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,MotorModel_Init, MotorModel_Execute} + +void MotorModel_Init(TMotorModel*); +void MotorModel_Execute(TMotorModel*); + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + + diff --git a/Vinclude/V_MotorParams.h b/Vinclude/V_MotorParams.h new file mode 100644 index 0000000..ac1ae62 --- /dev/null +++ b/Vinclude/V_MotorParams.h @@ -0,0 +1,20 @@ +/* Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ +// V_motorParams.h + +#include "V_MotorParams_DCM.h" +#include "V_MotorParams_IM.h" +#include "V_MotorParams_SM.h" +#include "V_MotorParams_SRM.h" diff --git a/Vinclude/V_MotorParams_DCM.h b/Vinclude/V_MotorParams_DCM.h new file mode 100644 index 0000000..acf360f --- /dev/null +++ b/Vinclude/V_MotorParams_DCM.h @@ -0,0 +1,54 @@ +/* Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ +// V_motorParams_DCM.h +//Файл с массивами параметров модели для различных вариантов ДПТ + + // !!! Внимание! При соотношении параметров ОВ с малой индуктивность и большим сопротивлением расчет ОВ может выполняться некорректно + // !!! Критическое соотношение параметров Lf=6.3 мГн и Rf=125 Ом + // !!! Если ДПТ с постоянными магнитами, то параметры индуктивность и сопротивление ОВ должны быть заданы равными нулю. + +//структура с параметрами двигателя +struct Sdcm_param +{ + float r_f; //!< сопротивление ОВ + float l_f; //!< индуктивность ОВ, мГн + float l_m; //!< коэффициент магнитного потока (взаимная индуктивность) + float r_a; //!< сопротивления якоря + float l_a; //!< индуктивность якоря, мГн + float RatedFluxCurrent;//!< номинальный ток ОВ + float RatedCurrent; //!< номинальный ток якоря + float j; //!< момент инерции + float qep; //!< число меток энкодера + float RatedPower; //!< номинальная мощность (справочная величина, не используется в расчетах) + float RatedSpeed; //!< номинальная скорость (справочная величина, не используется в расчетах) +}; +typedef volatile struct Sdcm_param Tdcm_param; + +// !!! Внимание! Последний набор параметров в массиве ОБяЗАТЕЛЬНО должен быть нулевым! +Tdcm_param DCMDATA[] = {\ +// |r_f |l_f |l_m |r_a |l_a |If |Current |j |qep |Power |Speed + {0, 0, 0.075073632, 70.2, 6.68, 0, 0.347, 0.0000012, 3000, 0.011, 3900},\ + {0, 0, 0.070452941, 16.6, 2.22, 0, 0.659, 0.00000438, 3000, 0.02, 4210},\ + {107, 6.197183099, 1.546863917, 0.423, 48.85355617, 1.42, 47, 0.3, 2000, 8.5, 870},\ + {94, 8.25, 1.531438221, 0.266, 40.06358237, 1.6, 65, 0.425, 1000, 12, 790},\ + {70, 7.727272727, 1.25299365, 0.177, 34.78965363, 2.2, 85, 0.8, 2000, 16, 710},\ + {65, 10.20833333, 1.249697876, 0.1155, 29.29350547, 2.4, 110, 1.05, 3000, 21, 660},\ + {58, 11.15384615, 1.019986658, 0.0545, 17.38016729, 2.6, 164, 1.87, 5000, 32, 760},\ + {42, 12.5, 0.900878093, 0.0332, 15.1587913, 3.6, 233, 4, 10000, 46, 625},\ + {36, 13.25581395, 0.802128868, 0.0204, 11.08986109, 4.3, 338, 8.25, 1000, 67, 590},\ + {34.4, 20, 0.890579855, 0.0117, 9.550454994, 4.6, 470, 17, 2000, 95, 500},\ + {24.4, 17.93650794, 0.693407611, 0.00745, 7.155498472, 6.3, 670, 32.5, 3000, 135, 470},\ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\ +}; diff --git a/Vinclude/V_MotorParams_IM.h b/Vinclude/V_MotorParams_IM.h new file mode 100644 index 0000000..4fd18a2 --- /dev/null +++ b/Vinclude/V_MotorParams_IM.h @@ -0,0 +1,49 @@ +/* Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ +// V_motorParams_IM.h +//Файл с массивами параметров модели для различных вариантов АД + +//структура с параметрами двигателя +struct SIm_param +{ + float l_s; //!< индуктивность статора АД, мГн + float l_r; //!<индуктивность ротора АД, мГн + float l_m; //!< взаимная индуктивность АД, мГн + float r_s; //!< сопротивления статора АД, Ом + float r_r; //!< сопротивления ротора АД, Ом + float pp; //!< число пар полюсов + float j; //!< момент инерции + float qep; //!< число меток энкодера + float RatedPower; //!< номинальная мощность (справочная величина, не используется в расчетах) + float RatedSpeed; //!< номинальная скорость (справочная величина, не используется в расчетах) + float RatedCurrent;//!< номинальный действующий ток +}; +typedef volatile struct SIm_param TIm_param; + +// !!! Внимание! Последний набор параметров в массиве ОБЯЗАТЕЛЬНО должен быть нулевым! +TIm_param IMDATA[] = {\ +// |l_s |l_r |l_m |r_s |r_r |pp |j |qep |Power |Speed |Current + {5590.601309, 5737.268318, 5392.169472, 101.64, 94.864, 1, 0.000025, 10000, 0.09, 2742, 0.33},\ + {396.0356208, 400.9617219, 389.5056727, 2.59129728, 1.69154128, 1, 0.0035, 10000, 3, 2871, 6.11},\ + {143.0596483, 145.1464178, 139.1179724, 0.6992832, 0.4807572, 2, 0.028, 7500, 7.5, 1456.5, 15.1},\ + {100.2417862, 101.3460409, 98.15597183, 0.362330144, 0.1927288, 2, 0.1, 7500, 15, 1465.5, 28.5},\ + {71.64092383, 72.15142923, 69.76907071, 0.2673, 0.128304, 3, 0.4, 7500, 22, 977, 41.2},\ + {38.44412805, 38.74763433, 37.43244047, 0.133489031, 0.060387895, 3, 0.74, 7500, 37, 982, 69.2},\ + {21.18984563, 21.74726654, 20.41259675, 0.091259168, 0.039463424, 4, 0.4, 5000, 45, 732.75, 89.2},\ + {17.01462802, 17.14451068, 16.23533208, 0.07140672, 0.044884224, 4, 3.2, 5000, 55, 733.5, 107.8},\ + {10.47720097, 10.65862436, 9.978286639, 0.041321984, 0.038472192, 5, 6.2, 5000, 75, 590.4, 154.4},\ + {6.858182237, 7.037715804, 6.463208391, 0.027073024, 0.022560853, 6, 10, 5000, 90, 493.5, 195},\ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\ +}; diff --git a/Vinclude/V_MotorParams_SM.h b/Vinclude/V_MotorParams_SM.h new file mode 100644 index 0000000..be6e2af --- /dev/null +++ b/Vinclude/V_MotorParams_SM.h @@ -0,0 +1,56 @@ +/* Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ +// V_motorParams.h +//Файл с массивами параметров модели для различных вариантов СДПМ + +//структура с параметрами двигателя +struct Ssm_param +{ + float r_f; //!< сопротивление ОВ + float l_f; //!< индуктивность ОВ, мГн + float l_m; //!< коэффициент магнитного потока (взаимная индуктивность) + float RatedFluxCurrent;//!< номинальный ток ОВ + float psi_pm; //!< потокосцепления постоянных магнитов СДПМ + float r_s; //!< сопротивления статора СДПМ, Ом + float l_sd; //!< индуктивность статора по оси "d" СДПМ, мГн + float l_sq; //!< индуктивность статора по оси "q" СДПМ, мГн + float pp; //!< число пар полюсов + float j; //!< момент инерции + float qep; //!< число меток энкодера + float RatedPower; //!< номинальная мощность (справочная величина, не используется в расчетах) + float RatedSpeed; //!< номинальная скорость (справочная величина, не используется в расчетах) + float RatedCurrent; //!< номинальный действующий ток (справочная величина, не используется в расчетах) +}; +typedef volatile struct Ssm_param Tsm_param; + +// !!! Внимание! Последний набор параметров в массиве ОБяЗАТЕЛЬНО должен быть нулевым! +Tsm_param SMDATA[] = {\ +// |r_f |l_f |l_m |If |psi_pm |r_s |l_sd |l_sq |pp |j |qep |Power |Speed |Current + {0, 0, 0, 0, 0.162056937, 0.38, 0.91, 0.91, 4, 0.00001032, 2500, 0.1, 3000, 4},\ + {0, 0, 0, 0, 1.035363764, 21.62, 45.6, 53.7, 1, 0.000014, 1000, 0.145, 3000, 0.81},\ + {0, 0, 0, 0, 1.035363764, 10.2, 27.8, 29.3, 1, 0.000028, 2500, 0.298, 3000, 1.3},\ + {0, 0, 0, 0, 1.035363764, 5.66, 16.26, 19.42, 1, 0.000042, 3000, 0.425, 3000, 2.3},\ + {0, 0, 0, 0, 0.241876025, 1.03, 0.82, 0.82, 1, 0.0000831, 5000, 0.4, 2680, 5.9},\ + {0, 0, 0, 0, 0.130691078, 0.345, 0.273, 0.273, 1, 0.0000831, 10000, 0.4, 4960, 9.56},\ + {0, 0, 0, 0, 0.118074271, 1.01, 0.448, 0.448, 1, 0.0000209, 5000, 0.25, 5490, 4.86},\ + {0, 0, 0, 0, 0.064822775, 0.336, 0.149, 0.149, 1, 0.0000209, 2500, 0.25, 10000, 7.94},\ + {0, 0, 0, 0, 1.035363764, 0.59, 6.85, 6.85, 3, 0.00678, 2000, 2.83, 3000, 6.3},\ + {0, 0, 0, 0, 1.035363764, 6.5, 18, 20, 3, 0.00417, 3000, 1.7, 3000, 3.8},\ + {0, 0, 0, 0, 0.051993267, 0.002, 0.125, 0.125, 1, 0.01, 9000, 93, 60000, 141},\ + {0, 0, 0, 0, 0.414145505, 1.144, 5.3, 5.3, 2, 0.000153, 10000, 1.5, 6000, 4.5},\ + {0, 0, 0, 0, 0.865211934, 0.129, 4.541, 7.424, 2, 0.1, 10000, 29.864, 3100, 60},\ + {65, 10.21, 1.25, 2.4, 0, 0.129, 4.541, 7.424, 2, 0.1, 10000, 29.864, 3100, 60},\ + {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\ +}; diff --git a/Vinclude/V_MotorParams_SRM.h b/Vinclude/V_MotorParams_SRM.h new file mode 100644 index 0000000..804f0f3 --- /dev/null +++ b/Vinclude/V_MotorParams_SRM.h @@ -0,0 +1,83 @@ +/* Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. +*/ +// V_motorParams_SRM.h +//Файл с массивами параметров модели для различных вариантов ВИД + +//структура с параметрами двигателя +struct Ssrm_param +{ + float r_s; //!< сопротивление статора Swithed Reluctance Motor + float pp; //!< число пар полюсов (зубцов на роторе) Swithed Reluctance Motor + float j; //!< момент инерции + float qep; //!< число меток энкодера + float sk; //!< коэффициент датчика скорости Swithed Reluctance Motor + float RatedPower; //!< номинальная мощность (справочная величина, не используется в расчетах) + float RatedSpeed; //!< номинальная скорость (справочная величина, не используется в расчетах) + float RatedCurrent;//!< номинальный действующий ток +}; +typedef volatile struct Ssrm_param Tsrm_param; + +// !!! Внимание! Последний набор параметров в массиве ОБяЗАТЕЛЬНО должен быть нулевым! +Tsrm_param SRMDATA[] = {\ +// |r_s |pp |j |qep |sk |p_n |n_n |i_n + {3, 4, 0.031, 4000, 14.323944878270580219199538703526, 8.5, 1500, 13},\ + {2, 4, 0.04227273, 4000, 4.7746482927568600730665129011754, 12, 1500, 18},\ + {1.5, 4, 0.062, 4000, 4.7746482927568600730665129011754, 15, 1500, 23},\ + {1, 4, 0.10427273, 4000, 14.323944878270580219199538703526, 18, 1500, 27.5},\ + {0.6, 4, 0.155, 4000, 4.7746482927568600730665129011754, 20, 1500, 30},\ + {0.3, 8, 0.42272727, 4000, 14.323944878270580219199538703526, 27, 1000, 20.5},\ + {0.1, 4, 1.104272727, 4000, 4.7746482927568600730665129011754, 57, 1500, 86.5},\ + {0.05, 4, 1.155, 4000, 4.7746482927568600730665129011754, 60, 1000, 91},\ + {0.03, 4, 2.211363636, 4000, 4.7746482927568600730665129011754, 120, 1500, 182},\ + {0.02, 8, 3.31, 4000, 14.323944878270580219199538703526, 90, 1000, 70},\ + {0, 0, 0, 0, 0, 0, 0, 0},\ +}; + +//Структурка точки для кривой намагничивания (задается по точкам, с переменным шагом) +struct SFluxCurvePoint +{ + float i; //ток + float psi; //потокосцепление +}; +typedef volatile struct SFluxCurvePoint TFluxCurvePoint; + + +//Кривые намагничивания. Формат: {ток, потокосцепление} +//Согласованное положение +#define SRM_FLUX_CURVE_S {{0, 0}, {1.125, 0.45}, {2.25, 0.9}, {3.375, 1.35}, {4.5, 1.58}, {6.0, 1.7}, {7.5, 1.8}, {9.0, 1.89}, {10.5, 1.98}, {12.0, 2.06}, {13.5, 2.13}, {-1, -1}} +//Расоогласованное положение +#define SRM_FLUX_CURVE_R {{0, 0}, {1.35, 0.111}, {2.7, 0.221}, {4.05, 0.331}, {5.4, 0.44}, {6.75, 0.54}, {8.1, 0.648}, {9.45, 0.756}, {10.8, 0.863}, {12.15, 0.969}, {13.5, 1.075}, {-1, -1}} + +#define SRD_SURFACE_RESOLUTION 100 //разрешение поверхностей момента от положения и потока M=f(theta,psi), потокосцепления от тока и положения psi=f(i,theta), тока от потокосцепления и положения i=f(psi,theta) + //ПРИМЕЧАНИЕ: задается число отрезков, т.е. число точек будет на 1 больше (например, 11 точек и 10 отрезков между ними), аналогично заданы разрешения других кривых и поверхностей + +#define SRD_DELTA_THETA 0.01 //маленькое приращение углу для расчета момента SRD через разность коэнергий для соседних с текущим положений ротора +#define SRD_DELTA_THETA_INV 100.0 // 1/SRD_DELTA_THETA + + +TFluxCurvePoint Psi_I_s[] = SRM_FLUX_CURVE_S; //кривая намагничивания для согласованного положения (зуб-зуб, максимальная индуктивность) +TFluxCurvePoint Psi_I_r[] = SRM_FLUX_CURVE_R; //кривая намагничивания для рассогласованного положения (зуб-паз, миниимальная индуктивность) +float Psi_I_s_acc[SRD_SURFACE_RESOLUTION+1]; //кривая намагничивания для согласованного положения - уточненная, с постоянным шагом по току +float Psi_I_r_acc[SRD_SURFACE_RESOLUTION+1]; //кривая намагничивания для рассогласованного положения - уточненная, с постоянным шагом по току + +float Psi_ITheta[SRD_SURFACE_RESOLUTION+1][SRD_SURFACE_RESOLUTION+1]; //Поверхность зависимости потокосцепления от тока и положения psi=f(i,theta) +float I_PsiTheta[SRD_SURFACE_RESOLUTION+1][SRD_SURFACE_RESOLUTION+1]; //Поверхность зависимости тока от потокосцепления и положения i=f(psi,theta) + +float M_ITheta[SRD_SURFACE_RESOLUTION+1][SRD_SURFACE_RESOLUTION+1]; //поверхность зависимости момента одной фазы SRD от тока и положения M=f(i,theta) + + +float MotorModel_FluxCubicInterpolation (volatile float Isource, volatile TFluxCurvePoint SourceArray[], volatile int SourceResolution); + + diff --git a/Vinclude/V_PWM_Module.h b/Vinclude/V_PWM_Module.h new file mode 100644 index 0000000..ec7ef78 --- /dev/null +++ b/Vinclude/V_PWM_Module.h @@ -0,0 +1,173 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_PWM_Module.h + \brief Модуль реализации векторной ШИМ (см. TPWM_Module) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup V_PWM_Module Модуль реализации векторной ШИМ (см. TPWM_Module) + @{*/ + +#ifndef _V_PWM_Module_ +#define _V_PWM_Module_ + +#ifdef __cplusplus +extern "C" +{ +#endif + +#define _1_SQRT3 _IQ(0.5773503) +#define _2_SQRT3 _IQ(1.1547005) + +//! Ограничения частоты ШИМ (кГц) min +#define PWM_FREQ_MIN _IQ10(2) +//! Ограничения частоты ШИМ (кГц) max +#define PWM_FREQ_MAX _IQ10(100.0) + +//!Векторная 6-ти секторная ШИМ +#define PWM_TYPE_6SECT_NO_SV 0 +//!Синусоидальная ШИМ +#define PWM_TYPE_SIN_PWM 1 +//!Векторная 12-ти секторная ШИМ +#define PWM_TYPE_12SECT_NO_SV 2 +//!ШИМ методом вычисления фазных потенциалов +#define PWM_TYPE_FLY_12SECT 3 +//!ШИМ для управления ДПТ +#define PWM_TYPE_DC_DRIVE 4 +//!ШИМ для управления SRM +#define PWM_TYPE_SRD 5 + +//! Ограничения величины "мёртвого времени", мкс, min +#define DEAD_BAND_MIN _IQ(0) +//! Ограничения величины "мёртвого времени", мкс, max +#define DEAD_BAND_MAX _IQ(10) + +//! Ограничения величины "минимальной скважности", мкс, min +#define GAMMA_LIMIT_MIN _IQ(0) +//! Ограничения величины "минимальной скважности", мкс, max +#define GAMMA_LIMIT_MAX _IQ(10) + +// Константы загрузки регистров AQCTL# и AQCSFRC (ePWM) +// (определяют настройку событий для выходов ШИМ) +#define AQ_EPWM_DISABLE 0x0000 //!< все события запрещены + +//! Флаг разрешения внутренней привязки ШИМ-выходов +#define ENABLE_PULLUP 0 + +//!что делать при аппаратной аварии с ножками +#define TZ_STATE TZ_FORCE_LO + +/*! \class TPWM_Module + \brief Модуль реализации ШИМ + + Класс \a TPWM_Module, основанный на структуре SPWM_Module, реализует + векторную и скалярную широтно-импульсную модуляцию для управления + шестиключевым инвертором. Имеет настройки мертвого времени, + частоты, коррекцию в зависимости от напряжения ЗПТ, + компенсацию мертвого времени. + Задание напряжения происходит по двум перпендикулярным осям альфа и бетта. + При этом ось альфа сонаправлена с осью А трехфазной системы координат. Для задания нового напряжения нужно + поместить задание в UalphaRef, UbetaRef и вызвать update. В зависимости от того, + какой тип ШИМ выбран в настройках (настраивается пользователем в переменной PWM_type), + функция PWM_Module_Update вызовет нужную функцию, реализующую требуемый тип ШИМ. + В результате этого на трех фазах инвертора в среднем за период ШИМ будет реализован + такой вектор напряжения, который задан в UalphaRef, UbetaRef. Чтобы создать переменное + синусоидальное напряжение, требуется вращать вектор задания внешней по отношению к модулю ШИМ программой. + */ + +//! см. TPWM_Module +struct SPWM_Module { + int16 Enabled; //!< Флаг для чтения - включен ШИМ или выключен. + int32 UalphaRef; //!<Задание по оси асьфа (задается) + int32 UbetaRef; //!<Задание по оси бетта (задается) + + int32 UPhARef; //!<Задание по фазе A (задается) + int32 UPhBRef; //!<Задание по фазе B (задается) + int32 UPhCRef; //!<Задание по фазе c (задается) + + int32 k_pwm; //!< Период таймера ШИМ, для чтения. + int32 U_mag; //!< Текущая амплитуда напряжения, для чтения. + int32 U_lim; //!< Ограничение вектора напряжения, задается + + int32 GammaA; //!< Скважность фазы А в размерности таймера ШИМ, для чтения. + int32 GammaB; //!< Скважность фазы B в размерности таймера ШИМ, для чтения. + int32 GammaC; //!< Скважность фазы C в размерности таймера ШИМ, для чтения. + + int16 PWM_type; //!< Тип ШИМ. Принимает значения констант с префиквом PWM_TYPE_. Задается. + int16 PWM_typeOld; //!< Предыдущее значения типа ШИМ, служебная переменная. + int16 sector; //!< Текущий сектор в векторном типе ШИМ. Для чтения. + + int32 UalphaNorm; //!< Нормированное задание, служебная переменная. + int32 UbetaNorm; //!< Нормированное задание, служебная переменная. + int32 UdCorTmp; //!<Служебная переменная для корректировки выходного напряжения в зависимости от напряжения ЗПТ + int32 UdCompK; //!< Коэффициент корректировки выходного напряжения инвертора в зависимости от изменения напряжения ЗПТ от номинального. Задается. + int32 UdCompEnable; //!< Разрешение корректировки выходного напряжения инвертора в зависимости от изменения напряжения ЗПТ от номинального. Задается. + int16 ULimitation; //!< флаг о том, что идет ограничение напряжения - выходное напряжение меньше заданного. Для чтения. + _iq Frequency; //!< Частота ШИМ в кГц. Формат 22.10! Задается. + _iq FreqPrev; //!< Предудущая частота ШИМ, служебная переменная. + int32 DeadBand; //!< величина "мёртвого времени", мкс, задается. + int32 MinGammaLimit; //!< минимальная скважность на ключе, задается. + int PDP_Fault; //!< Флаг о том, что моудлем ШИМ зафиксирована аппаратная авария от инвертора. Для чтения. По ней необходима реакция модуля защит! + int ChargingMode; //!< Режем заряда будстрепных конденсаторов. Должен выставляться в еденицу на время 2-10 мс внешней программой перед запуском ШИМ. + void (*init)(volatile struct SPWM_Module*); /* Pointer to the init function */ + void (*update)(volatile struct SPWM_Module*); /* Pointer to the update function */ + void (*slow_calc)(volatile struct SPWM_Module*); + void (*On)(volatile struct SPWM_Module*); //!< процедура включения (разрешения) ШИМ-выходов + void (*Off)(volatile struct SPWM_Module*); //!< процедура отключения (запрещения) ШИМ-выходов +}; + +typedef volatile struct SPWM_Module TPWM_Module; + +//! Инициализатор по-умолчанию. +#define PWM_Module_DEFAULTS {\ + 0,0,0, \ + 0,0,0, \ + 0, \ + 0, \ + _IQ(0.866),0, \ + 0,0,\ + 0,0,\ + 0,\ + 0,0,0,0,0,0,0x1400,0,0,0,0,0,\ + PWM_Module_Init, \ + PWM_Module_Update, \ + PWM_Module_SlowCalc, \ + PWM_Module_On, \ + PWM_Module_Off, \ + } + +//! \memberof TPWM_Module +void PWM_Module_Init(TPWM_Module *); +//! \memberof TPWM_Module +void PWM_Module_Update(TPWM_Module *); +//! \memberof TPWM_Module +void PWM_Module_SlowCalc(TPWM_Module *); +//! \memberof TPWM_Module +void PWM_Module_On(TPWM_Module *); +//! \memberof TPWM_Module +void PWM_Module_Off(TPWM_Module *); + +//векторные функции из библиотеки +void PWM_Module_No_SV_Update(TPWM_Module *); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + diff --git a/Vinclude/V_QEP.h b/Vinclude/V_QEP.h new file mode 100644 index 0000000..943cedb --- /dev/null +++ b/Vinclude/V_QEP.h @@ -0,0 +1,251 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_QEP.h + \brief Модуль оценки скорости и положения при помощи eQEP (см. TposspeedEqep) + \author ООО "НПФ Вектор". Все права защищены. http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup V_QEP Модуль оценки скорости и положения при помощи eQEP (см. TposspeedEqep) + + \addtogroup V_QEP +@{*/ + + +#include "V_IQmath.h" +#include "filter.h" +#ifndef V_POSSPEED_EQEP_H +#define V_POSSPEED_EQEP_H + +#ifdef __cplusplus +extern "C" { + #endif + + + struct SPOSSPEEDCTL_BITS { // bits +Uint16 InitType: + 2; // 0:1 INPUT: режим инициализации положения при пуске: + // 0 - всё выставляется вручную + // 1 - выставляем вектор тока, далее пуск в векторном режиме(исходное положение - 0 электрических градусов); + // 2 - пуск в векторном режиме(исходное положение - последнее сохранённое) +Uint16 index_en: + 1; // 2 INPUT: наличие репера + // 0 - репер отсутствует + // 1 - репер подключён; +Uint16 dir: + 1; // 3 INPUT: направление движения(в случае неправильного направления); + // 0 - (по умолчанию)прямое включение; + // 1 - инверсия; +Uint16 CmdInit: + 1; // 4 INPUT: для режима инициализации +Uint16 Min_clk: + 4; // 5:8 INPUT: минимальное число меток для захвата на низкой скорости - НЕ МЕНяТЬ!!!!! + // Min_clk=2 - 4 метки + // 3 - 8 меток - по умолчанию + // 4 - 16 меток + // 5 - 32 метки + // 6 - 64 метки + // 7 - 128 меток + // 8 - 256 меток + // 9 - 512 меток + // 10 - 1024 метки +Uint16 rsvd: + 7; // 9:15 reserved; + }; + + union SPOSSPEED_CTL { + Uint16 all; + struct SPOSSPEEDCTL_BITS bit; + }; + + struct SPOSSPEEDFLG1_BITS { // bits +Uint16 UTO_tmp: + 1; // 0 TEMPORARY FLAG: флаг time-out; +Uint16 PCO_tmp: + 1; // 1 TEMPORARY FLAG: флаг положительного переполнения счётчика; +Uint16 PCU_tmp: + 1; // 2 TEMPORARY FLAG: флаг отрицательного переполнения счётчика; +Uint16 UPPS_tmp: + 4; // 3:6 TEMPORARY: значение текущего кванта перемещения для захвата; +Uint16 CCPS_tmp: + 3; // 7:9 TEMPORARY: значение текущего коэффициента деления; +Uint16 first_launch: + 2; // 10:11 FLAG: инициализация первого запуска; +Uint16 accuracy: + 2; // 12:13 FLAG: флаг переключения алгоритмов; +Uint16 first_theta: + 1; // 14 FLAG: флаг первого расчёта углового преращения; +Uint16 transit: + 1; // 15 FLAG: флаг перехода на алгоритм высоких скоростей; + + }; + + union SPOSSPEED_FLG1 { + Uint16 all; + struct SPOSSPEEDFLG1_BITS bit; + }; + + struct SPOSSPEEDFLG2_BITS { // bits +Uint16 pos_ident: + 1; // 0 FLAG: флаг точной идентификации абсолютного положения ротора; +Uint16 UTO_tmp2: + 1; // 1 TEMPORARY FLAG: флаг time-out; +Uint16 PCO_tmp2: + 1; // 2 TEMPORARY FLAG: флаг положительного переполнения счётчика; +Uint16 PCU_tmp2: + 1; // 3 +Uint16 lost_UTO: + 1; // 4 +Uint16 Dir_prev: + 1; // 5 +Uint16 Cdef: + 1; // 6 +Uint16 Delay_flux: + 1; // 7 +Uint16 first_index: + 1; // 8 +Uint16 rsvd: + 8; // 9:15 reserved; + }; + + union SPOSSPEED_FLG2 { + Uint16 all; + struct SPOSSPEEDFLG2_BITS bit; + }; + + + +/*! \class TposspeedEqep + \brief Модуль обработки квадратурного декодера (ДПР типа "энкодер") + + Класс \a TposspeedEqep, основанный на структуре SposspeedEqep, + является модулем для определения углового положения и скорости ротора + двигателя по данным от квадратурного энкодера. Для работы с датчиком + используется периферийный модуль процессора EQEP. Положение вала theta_elec определяется + по аппаратному счетчику QPOSCNT, который увеличивает и уменьшает + свое значение автоматически при вращении вала. После включения процессора + абсолютное угловое положение вала не может быть оперелено, пока не произойдет + событие индексации (сработает реперная метка). Модуль возводит флаг Posspeed_FLG2.bit.pos_ident, + как только это происходит. До этого момента значение углового положения не валидное и не должно использоваться + системой управления. Для калибровки датчика положения (смещения нулевого положения) + используется переменная AngleOffset. + Для вычисления скорости speed_elec используется аппаратный счетчик QCPRD, + который измеряет время между заданным количеством меток датчика. Для обеспечения приемлемой + точности на высоких и низких скоростях "заданное" количество меток переключается на ходу при помощи + делителя UPPS. Так как скорость на малых скоростях вращения пульсирует, + имеется инерционный фильтр скорости первого порядка, значение которого, + speed.output, может быть выведено пользователю. + */ + +//! см. TposspeedEqep + struct SposspeedEqep { + Uint32 resol; //!DATAOUTCLR = GPIO_PIN_14; +#define UD_CONTROL_ON GPIOB->DATAOUTSET = GPIO_PIN_14; +#else +#define UD_CONTROL_OFF // операция для выключения +#define UD_CONTROL_ON // операция для включения +#endif + + + +/*! \class TUdControl + \brief Управление цепью заряда звена постоянного тока + + Класс \a TUdControl, основанный на структуре SUdControl, служит + для управления дискретным выходом, который замыкает цепь заряда + звена постоянного тока. Перед включением следуют три проверки: + выдержка таймаута, превышение напряжения выше заданной уставки и + выполаживание кривой напряжения (производная стремится к нулю). +*/ + +//!см. TUdControl +struct SUdControl{ + Uint16 Enabled; + int fault_start; //!<попытка пуска при незашунтированном реле + int state; //!<состояние + int state_shadow;//!< состояние теневое + int state_prev;//!<состояние предыдущее + int E;//!<флаг первого вхождения + int StateCounter;//!<счетчик времени нахождения в состоянии + long fUdc_output_prev;//!<значения напряжения предыдущее + long U_on;//!<напряжение включения + long U_off;//!<напряжение выключения + long Timeout_on;//!<таймаут включения в мс. + long deriv_time_ZPT; //!<производная по напряжению на миллисекунде + long deriv_const; //!<константа уставки сравнения производной + int StateOn;//!<двоичное состояние: включен/не включен + TFilter fUdc;//!<фильтр напряжения на ЗПТ + Uint16 ExternCheckKey;//!<Вход блок-контакта + Uint16 ExternCheckKeyEnabled;//!<Надо ли анализировать блок-контакта + void (*init)(volatile struct SUdControl*); + void (*calc)(volatile struct SUdControl*); +}; + +typedef volatile struct SUdControl TUdControl; + + + +//! \memberof TUdControl +void UdControl_init(TUdControl*); +//! \memberof TUdControl +void UdControl_calc(TUdControl*); + + +#define UD_CONTROL_DEFAULTS {0,0,UD_CONTROL_STATE_OFF,UD_CONTROL_STATE_OFF,UD_CONTROL_STATE_OFF,\ + 0,0,0,\ + _IQ(0.8),_IQ(0.5),3000,0,\ + 0,0, FILTER_DEFAULTS,\ + 0,0,\ + UdControl_init,\ + UdControl_calc} + + +#ifdef __cplusplus +} +#endif + +#endif + + +/*@}*/ + diff --git a/Vinclude/V_UserMemory.h b/Vinclude/V_UserMemory.h new file mode 100644 index 0000000..04dc9ad --- /dev/null +++ b/Vinclude/V_UserMemory.h @@ -0,0 +1,162 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_UserMemory.h + \brief Работа с энергонезависимой памятью 1921BK028 (см. TUserMemory) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 20/03/2019 + + \defgroup V_UserMemory Работа с энергонезависимой памятью (см. TUserMemory) + @{ +*/ + + + +#ifndef V_USERMEMORY_H +#define V_USERMEMORY_H + +#include "DSP.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +/*! \class TUserMemory + \brief Работа с пользовательской энергонезависимой памятью МС01 + + Класс \a TUserMemory, основанный на структуре TUserMemory, представляет собой драйвер для работы с + flash памятью.\n + пример использования:\n + для инициализации\n + spimem.init.(&spimem);\n + + для записи\n + UserMem.spiaddr=0;\n + UserMem.startaddr=buff;\n + UserMem.data_length=1000;\n + UserMem.write(&spimem);\n + + */ + +//! см. TUserMemory + +//Пользовательскую память не рекомендуется размешать в той же области, где находится основная программа. +//Так как, если исполняться из BFlash и подать команду записи/стирания NVR ячейки той же BFlash, то произойдет приостановка +//работы ядра на время записи/стирания. Потому что это один физический блок, и он может работать только либо с основным +//массивом flash или с массивом NVR flash + +//#define NVR_MAIN_FLASH //размещать пользовательские данные в NVR основной памяти +#define NVR_BOOT_FLASH //размещать пользовательские данные в NVR загрузочной памяти + + +#define USERMEMORY_USERFLASH_KEY 0xC0DE0100 // Ключ 0xC0DE0000 + бит NVRON +#define USERMEMORY_MAX_WAITCLOCKS 2000000L +#define USERMEMORY_WRITE_HARDFAULT 0x1 +#define USERMEMORY_WRITE_TIMEOUT 0x2 +#define USERMEMORY_READ_HARDFAULT 0x3 +#define USERMEMORY_READ_TIMEOUT 0x4 +#define USERMEMORY_OP_OK 0x0 + +#ifdef NVR_MAIN_FLASH +#define USERMEMORY_PAGE_SIZE MEM_MFLASH_PAGE_SIZE +#define NVRFLASH MFLASH +#define NUMBER_OF_BYTE_ON_PAGE 64 +#define NUMBER_OF_32BIT_WORDS_AT_ONCE 16 +#define PAGE_SIZE_LOG2 MEM_MFLASH_PAGE_SIZE_LOG2 +#endif + +#ifdef NVR_BOOT_FLASH +#define USERMEMORY_PAGE_SIZE MEM_BFLASH_PAGE_SIZE +#define NVRFLASH BFLASH +#define NUMBER_OF_BYTE_ON_PAGE 16 +#define NUMBER_OF_32BIT_WORDS_AT_ONCE 4 +#define PAGE_SIZE_LOG2 MEM_BFLASH_PAGE_SIZE_LOG2 +#endif + +#define USERMEMORY_CMD_READ (1<<0) +#define USERMEMORY_CMD_WRITE (1<<1) +#define USERMEMORY_CMD_PAGE_ERASE (1<<2) +#define USERMEMORY_CMD_FULL_ERASE (3<<2) // бит ERASESEC + бит ALLSEC +#define USERMEMORY_NVRON_BIT (1 << 8) + + +struct SUserMemory { + Uint16 MemStartAddr; //!Адрес на flash + Uint8 *MCUStartAddr8; //!адрес на массив с данными как байтовый указатель + Uint16 *MCUStartAddr; //!адрес на массив с данными + Uint16 data_length; //!длина данных + int16 receivedCode; //!Статус операции + Uint32 waitClocks; //!Счетчик для ожидания таймаута операции + Uint16 PageInCache; //!Номер текущей закешированной страницы + Uint16 autoFlushCounter; //!Счетчик для сохранения кеша на флеш по таймауту + Uint8 PageRAM_and_FLASH_IdenticalFlag; //!Флаг о том, что данные в кеше и на флеше идентичны + Uint8 NeedFlushRequest; //флаг запроса на запись данных из кеша на флеш + Uint8 cacheArr[USERMEMORY_PAGE_SIZE]; //кеш данных - одна страница памяти + void (*init)(struct SUserMemory*); + void (*write)(struct SUserMemory*); + void (*read)(struct SUserMemory*); + void (*full_erase)(struct SUserMemory*); + void (*flush)(struct SUserMemory*); + void (*ms_calc)(struct SUserMemory*); + void (*slow_calc)(struct SUserMemory*); +}; + +typedef struct SUserMemory TUserMemory; + +//!Инициализатор по умолчанию +#define USERMEMORY_DEFAULTS {\ + .init = USERMEMORY_Init, \ + .write = USERMEMORY_Write,\ + .read = USERMEMORY_Read,\ + .full_erase = USERMEMORY_Full_Erase,\ + .flush = USERMEMORY_Flush,\ + .ms_calc = USERMEMORY_ms_calc,\ + .slow_calc = USERMEMORY_slow_calc,\ + } + + +//! \memberof TUserMemory +void USERMEMORY_Init(TUserMemory*); +//! \memberof TUserMemory +void USERMEMORY_Write(TUserMemory*); +//! \memberof TUserMemory +void USERMEMORY_Read(TUserMemory*); +//! \memberof TUserMemory +void USERMEMORY_Full_Erase(TUserMemory*); +//! \memberof TUserMemory +void USERMEMORY_ReadToCache(TUserMemory *p, int16 pageNum); +//! \memberof TUserMemory +void USERMEMORY_WriteFromCache(TUserMemory *p, int16 pageNum); +//! \memberof TUserMemory +void USERMEMORY_Flush(TUserMemory *p); +//! \memberof TUserMemory +void USERMEMORY_ms_calc(TUserMemory *p); +//! \memberof TUserMemory +void USERMEMORY_slow_calc(TUserMemory *p); +//! \memberof TUserMemory +void USERMEMORY_UpdateCurrentPage(TUserMemory *p, Uint16 spiaddr); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + + + + diff --git a/Vinclude/V_adc.h b/Vinclude/V_adc.h new file mode 100644 index 0000000..c7d3f22 --- /dev/null +++ b/Vinclude/V_adc.h @@ -0,0 +1,163 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_adc.h + \brief Модуль обработки АЦП (см. TAdcDrv) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup V_adc Модуль обработки АЦП (см. TAdcDrv) + + @{ +*/ + + +#ifndef V_ADC_H +#define V_ADC_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + /*! \class TAdcDrv + \brief Модуль обработки АЦП + + Класс \a TAdcDrv, основанный на структуре SAdcDrv, содержит в себе + методы для обработки результатов АЦП. А именно: считывание, нормировку и + приведение к относительным единицам, фильтрацию. У каждого измеряемого сигнала + есть как минимум два параметра для настройки: коэффициент усиления и смещение. + Настройку датчиков желательно производить так: подать нулевой сигнал и настроить + смещение, чтобы измеряемое значение показывало ноль. Подать уровень сигнала, близкий + к номинальному и настроить коэффициент усиления, чтобы измеренное значение соответствовало + действительности.*/ + +//! см. TAdcDrv + struct SAdcDrv + { + int16 Imeas_a_gain; //!< Коэффициент усиления. + int16 Imeas_a_offset; //!< Смещение нуля. + int32 Imeas_a; //!< Измеренное значение усредненное. + int32 IaGainNom; //!< Вспомогательный коэфф. усиления. + int32 IA_temp; //!<Временная переменная + + int16 IASampleLength; //длина выборки (кол-во точек на периоде ШИМ) + int16 IAPointer; //номер последней выборки + int16 IABuf[4]; //массив точек для усреднения + + + int16 Imeas_b_gain; + int16 Imeas_b_offset; + int32 Imeas_b; + int32 IbGainNom; + int32 IB_temp; + + int16 IBSampleLength; //длина выборки (кол-во точек на периоде ШИМ) + int16 IBPointer; //номер последней выборки + int16 IBBuf[4]; //массив точек для усреднения + + + int16 Imeas_c_gain; + int16 Imeas_c_offset; + int32 Imeas_c; + int32 IcGainNom; + int32 IC_temp; + + int16 ICSampleLength; //длина выборки (кол-во точек на периоде ШИМ) + int16 ICPointer; //номер последней выборки + int16 ICBuf[4]; //массив точек для усреднения + + int16 Imeas_d_gain; + int16 Imeas_d_offset; + int32 Imeas_d; + int32 IdGainNom; + int16 ID_temp; + + int16 IDSampleLength; //длина выборки (кол-во точек на периоде ШИМ) + int16 IDPointer; //номер последней выборки + int16 IDBuf[4]; //массив точек для усреднения + + + int16 Udc_meas_gain; + int16 Udc_meas_offset; + int32 Udc_meas; + int32 UdcGainNom; + int16 Udc_temp; + + int16 UdcSampleLength; //длина выборки (кол-во точек на периоде ШИМ) + int16 UdcPointer; //номер последней выборки + int16 UdcBuf[4]; //массив точек для усреднения + + int16 T_meas_gain; //!< Коэффициент усиления. + int32 T_meas; //!< Измеренное значение усредненное. + int32 TGainNom; //!< Вспомогательный коэфф. усиления. + int16 T_temp; //!<Временная переменная + + int16 ref_meas_gain; + int16 ref_meas_offset; + int32 ref_meas; + int32 refGainNom; + int16 ref_temp; + + void (*init)(struct SAdcDrv *); + void (*fast_calc)(struct SAdcDrv*); + void (*ms_calc)(struct SAdcDrv*); + void (*slow_calc)(struct SAdcDrv*); + }; + + + typedef struct SAdcDrv TAdcDrv; + +//!Инициализатор по умолчанию. +#define ADC_DRV_DEFAULTS {\ + 54,0,0,0,0, \ + 4,0,{0}, \ + 54,0,0,0,0, \ + 4,0,{0}, \ + 54,0,0,0,0, \ + 4,0,{0}, \ + 54,0,0,0,0, \ + 4,0,{0}, \ + 800,0,0,0,0, \ + 4,0,{0}, \ + 100,0,0,0, \ + 54,0,0,0,0, \ + AdcDrv_init,\ + AdcDrv_fast_calc,\ + AdcDrv_ms_calc,\ + AdcDrv_slow_calc,\ + } + + +//! \memberof TAdcDrv + void AdcDrv_init(TAdcDrv*); +//! \memberof TAdcDrv + void AdcDrv_slow_calc(TAdcDrv*); +//! \memberof TAdcDrv + void AdcDrv_fast_calc(TAdcDrv*); +//! \memberof TAdcDrv + void AdcDrv_ms_calc(TAdcDrv*); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + + + + diff --git a/Vinclude/V_bits_to_enum_numbers.h b/Vinclude/V_bits_to_enum_numbers.h new file mode 100644 index 0000000..92e7887 --- /dev/null +++ b/Vinclude/V_bits_to_enum_numbers.h @@ -0,0 +1,77 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_bits_to_enum_numbers.h + \brief Модуль "листания" битовых переменных (см. TBitsToEnumNums) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup V_bits_to_enum_numbers Модуль "листания" битовых переменных (см. TBitsToEnumNums) + @{ +*/ + +#ifndef V_BITS_TO_ENUM_NUMS_H +#define V_BITS_TO_ENUM_NUMS_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +//!количество заразервированных мест для битовых переменных +#define NUM_OF_W_PTRS 2 + + /*! \class TBitsToEnumNums + \brief Модуль "листания" битовых переменных + + Класс \a TBitsToEnumNums, основанный на структуре SBitsToEnumNums, преобразует + битовые переменные в числа (соответствующие номерам битов входной переменой), + меняющиеся с заданным интервалом. Значение в самом младшем бите соответствует 1. + Выдает 0 если никакие биты в проверяемых словах не установлены. Предполагается для + "пролистывания" битов слов аварий и предупреждений в целях вывода на ПУ. */ + +//! см. TBitsToEnumNums + struct SBitsToEnumNums + { + Uint16 out_refresh_devisor;//!< делитель, задающий темп листания + Uint16 counter;//!<счетчик таймаута листания + Uint16 num_of_words;//!<кол-во битовых переменных + Uint16 last_word;//!<текущее слово + Uint16 last_bit;//!<текущий бит + Uint16 *w_ptrs[NUM_OF_W_PTRS]; //!<указатель на битовые переменные (несколько) + Uint16 output;//!<выход модуля (листающееся число) + void (*calc)(volatile struct SBitsToEnumNums*); + }; + + typedef volatile struct SBitsToEnumNums TBitsToEnumNums; + + +//!инициализатор по умолчанию +#define BITS_TO_ENUM_NUMS_DEFAULTS {1000,0,4,0,0,{0},0,\ + BitsToEnumNums,\ + } +//! \memberof TBitsToEnumNums + void BitsToEnumNums(TBitsToEnumNums*); + + +#ifdef __cplusplus +} +#endif + +#endif + + +/*@}*/ + diff --git a/Vinclude/V_common.h b/Vinclude/V_common.h new file mode 100644 index 0000000..48cd9ba --- /dev/null +++ b/Vinclude/V_common.h @@ -0,0 +1,128 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_common.h + \brief Объявление структур данных различного назначения, которые еще слишком малы для того, чтобы + организовывать их в отдельный модуль + \author ООО "НПФ Вектор". Все права защищены. http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup v_common Объявление структур данных различного назначения + +@{*/ + +#ifndef V_COMMON_H +#define V_COMMON_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +//!Битовое поле для битового статуса системы управления + typedef struct + { + unsigned int ready: + 1; + unsigned int running: + 1; + unsigned int fault: + 1; + unsigned int alarm: + 1; + unsigned int testing: + 1; + unsigned int overheat: + 1; + } DRV_STATUS_BIT; + +//!Структура для статуса системы управления (содержит DRV_STATUS_BIT) + typedef union + { + int all; + DRV_STATUS_BIT bit; + }TDrvStatus; + + +//!Битовое поле слова управления + typedef struct + { +unsigned int start: + 1; +unsigned int stop: + 1; +unsigned int trip_reset: + 1; +unsigned int reserved: + 5; + } CMD_BIT; + +//!Структура слова управления (содержит DRV_STATUS_BIT) + typedef union + { + unsigned int all; + CMD_BIT bit; + }TCmd; + + +//! Структура, содержащия основные задания для привода + typedef volatile struct + { + long speed_ref;//!< Задание скорости + long Iq_ref;//!< Задание токоограничения для векторной системы управления + long i_flux_ref;//!< Задание тока для замкнутой по току системы управления (не векторной) + long theta_elec;//!< Задание углового положения вектора тока/напряжения + long ua_ref, uf_ref; // Задания тока якоря и тока ОВ для ДПТ + long DCMspeed_ref;//!< Задание скорости + } TRefs; + +//! Структура для хранения параметров привода, двигателя, базовых величин системы управления + typedef struct + { + long Rs;//!< Сопротивление фазы статора + long Ls;//!< Индуктивность фазы статора + int p;//!< Количество пар полюсов + int I_nom;//!< Номинальный (базовый) фазный ток в формате 16.0 + long _1_I_nom;//!< 1/I_nom + int U_nom;//!< Номинальное (базовое) фазное напряжение в формате 16.0 + long _1_U_nom;//!< 1/U_nom + int Udc_nom;//!< Номинальное (базовое) напряжение ЗПТ в формате 16.0 + long _1_Udc_nom;//!< 1/Udc_nom + int speed_nom;//!< Номинальная (базовая) скорость в формате 16.0 + int freq_nom;//!< Номинальная (базовая) частота в формате 16.0 + int power;//!< Номинальная (базовая) мощность в формате 16.0 + int sens_type;//!< Тип датчика положения + } TDrvParams; + + +//! Структура для битовых "переключателей", таких как направление вращения, разрешение рекуперации и т.п. +typedef struct { + Uint16 recuperation_ena;//!< Разрешение рекуперации энергии при торможении + Uint16 rotation_dir;//!< Направление вращения + Uint16 Reboot;//!< Программная перезагрузка + Uint16 AutoOffset;//!< автосмещение АЦП + Uint16 HardwareType;//!< Тип железа, под который собран проект + Uint16 excitation_ena;//!< Разрешение возбудителя + } TSysSwitches; + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + diff --git a/Vinclude/V_data_log.h b/Vinclude/V_data_log.h new file mode 100644 index 0000000..7d5a4c6 --- /dev/null +++ b/Vinclude/V_data_log.h @@ -0,0 +1,225 @@ +/*! + \file v_data_log.h + \brief 4-х канальный логгер длЯ осциллографированиЯ в реальном времени (см. TDataLog) +В версии 2.0 реализован 32-битный режим работы. Основные положения: +Тип данных даталоггера определяется символьной константой в заголовочном файле 'V_data_log.h' +(один из вариантов нужно раскомментировать): +//#define DLOG_DATA_SIZE 16 +#define DLOG_DATA_SIZE 32 +Для 16-битного режима даталоггер работает "классическим" методом. Старый Юникон работает как было. +Новый Юникон при этом не получает флаг 32-битного режима (см. ниже) и работает по "классическому" алгоритму +(правда, буфер принимаемых данных у него теперь 32-битный, но это тонкости). При буферной передаче каждый +канал передаётся, как и раньше, одним запросом. +32-битный режим: +В переменную 'dlog.control' добавлен флаг '32-битные данные', по которому новый Юникон узнаёт тип даталоггера. +При SDO-чтении осциллограмм данные, как и раньше, выдвигаются через 32-битную переменную 'dlog.next_value_var' +(там, кроме 16-битного значения, есть всякие поля). В неё добавлены два флага: +- флаг, что в поле "значение" - старшие 16 бит точки +- флаг, что переменная 16-разрядная +Юникон сначала запрашивает младшую часть значения, потом - старшую и т.д. по всем точкам. +Если переменная 16-разрядная, то старшая часть не запрашивается. При буферной передаче: +Т.к. один буферный запрос ограничен у нас 256-тью 16-битными словами, то Юникон сначала запрашивает +первые 256 слов (128 32-битных точек), затем - остальные 256 слов. Т.е. используется два буферных запроса. + + \author Коллектив ООО НПФ Вектор + \version v 2.0 10/04/2017 + \defgroup v_data_log Цифровой осциллограф (см. TDataLog) + @{ +*/ + + +#ifndef V_DATA_LOG_H +#define V_DATA_LOG_H + +#include "CANOpen_drv.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +// Размер значений, передаваемых через логгер (бит) +//#define DLOG_DATA_SIZE 16 +#define DLOG_DATA_SIZE 32 + + +#if DLOG_DATA_SIZE == 16 +typedef int16 type_data; +#elif DLOG_DATA_SIZE == 32 +typedef int32 type_data; +#endif + + +//! Размер массивов длЯ осциллографированиЯ. + +//!Если нужно менЯть, то это делать надо не только тут - слишком много завЯзано на это число +//!Переделать сложно, так как на это число завЯзка косвеннаЯ: например, длЯ ускорениЯ работы +//!применЯютсЯ такие конструкции: p->Wcounter&=0xFF; Где FF - маска (символизирует 256 точек) +#define NUMBER_SAMPLES 256 + + /*! \class TDataLog + \brief 4-х канальный логгер длЯ осциллографированиЯ в реальном времени + + Класс \a TDataLog, основанный на структуре SDataLog, позволЯет записывать выбранные 4 переменных в массивы + из 255 точек с заданной дискретизацией по времени. Кроме того, имеет + свЯзь с драйвером CANOpen длЯ автоматизации указаниЯ этих переменных: можно + "зарЯдить" в даталоггер любой существующий элемент словарЯ.*/ + +//! см. TDataLog + struct SDataLog + { + Uint32 update_sample_rate; // + type_data buff[(NUMBER_SAMPLES*4)]; //4 массива для отснятых осциллограмм, слепленные в один большой +#if DLOG_DATA_SIZE == 16 + type_data *dlog_iptr1; //!< указатели на переменные для записи (например. ток фазы A, скорость и т.д.) + type_data *dlog_iptr2; //!< Input: Second input pointer (Q15) + type_data *dlog_iptr3; + type_data *dlog_iptr4; +#endif + int dlog_cntr_max; //!< Parameter: Maximum number of samples + Uint16 Wcounter; //!< Счетчик по массиву длЯ записи + Uint16 Rcounter; //!< Счетчик по массиву длЯ чтениЯ + type_data* dl_buffer1_adr; //!< Указатели на массивы, где лежат отснятые осциллограммы + type_data* dl_buffer2_adr; //!< Parameter: Buffer starting address 2 + type_data* dl_buffer3_adr; + type_data* dl_buffer4_adr; + + type_data upload_buff[NUMBER_SAMPLES]; //массив для отправки осциллограммы в юникон. Сюда копируется осциллограмма из одного из четырех массивов buff со смещением, чтобы начало осциллограммы было в начале массива. + type_data* dl_upload_buffer_adr; //указатель на массив для отправки. + Uint32 trig_shift; //сдвиг первой точки после срабатывания триггера. Используется, чтобы задать, сколько точек предыстории сохранять. + Uint16 trig_shift_int; //то же, переведенное в точки + Uint16 first_point_written; //первая точка, относящаяся к записываемой осциллограмме с учетом длины предыстории и точки срабатывания триггера + Uint16 prehistory_length; //длина записанной предыстории (если даталоггер переинициализировался кнопкой "обновить", она обнуляется) + Uint16 valid_points_num; //счетчик валидных точек предыстории, записанных после переинициализации кнопкой "обновить" в юниконе + + /*! Режимов работы четыре:\n + 0 - стоп\n + 1 - однократнаЯ запись\n + 2 - запись по кругу без остановки\n + 3 - однократнаЯ запись одной переменной во все 4 массива последовательно, длЯ получениЯ длинной осциллограммы.\n + Устанавливать переменную надо только вызовом функции set_mode! */ + Uint16 mode_reset; //!< задаетсЯ режим работы + Uint16 mode_reset_prev; //!< предыдущий режим работы + int E; // флаг энтри + + /*! "control" имеет 32 разрЯда. Первые 16 бит - флаги, последние 16 бит - установка разреживания.\n + 9 8 7 6 5 4 3 2 1 0\n + | x | x | x | x | x | x | x | x | x | x |\n + | | | | | | первые 4 бита - какие из 4х переменых интересуют (какие адреса обновлЯть, какие данные записывать)\n + | | | | 2 бита - желаемый режим даталоггера: 0, 1, 2\n + | | | бит "данные готовы" - устанавливаетсЯ контроллером\n + | | бит "поддерживается блочная передача"\n + | бит "32-битные данные"\n + резерв */ + long control; //!< управление даталоггером через внешние программы + + unsigned int WriteDelimiter; //!<делитель данных при записи + unsigned int WriteDelimiterCounter; //!<Счетчик длЯ делителЯ + long ind_subind1; //!<записываетсЯ индекс и подындекс длЯ словарЯ + long ind_subind2; + long ind_subind3; + long ind_subind4; + unsigned long next_value_var; //!<через эту переменную выдвигаютсЯ записанные значениЯ при считывании: + //!<биты 0-15: значение точки + //!<биты 16-23: Rcounter (отдаваемая точка) + //!<биты 24-25: buff_num + //!<бит 26: флаг, что в поле "значение" - старшие 16 бит точки (используется при DLOG_DATA_SIZE = 32) + //!<бит 27: флаг, что переменная 16-разрядная (используется при DLOG_DATA_SIZE = 32) + Uint16 StartBits; + int buff_num; //!<номер массива, из которого идет выдвижение значений в next_value_var + int ResetAfterStart; //!<флаг обнулениЯ счетчика записи при запуске + Uint16 OneShotOperation; //!<флаг синхронизации осциллографа только по первому событию (переход в 1 возможен только из 2) + TCo_OdVars *pco_vars; //!<адрес структуры драйвера CANopen +#if DLOG_DATA_SIZE == 32 + int highPartOfValue; //!<флаг выдачи старшей части + TObjectInfo object1Info; //!<информация о записываемом объекте №1 + TObjectInfo object2Info; //!<информация о записываемом объекте №2 + TObjectInfo object3Info; //!<информация о записываемом объекте №3 + TObjectInfo object4Info; //!<информация о записываемом объекте №4 +#endif + void (*update)(volatile struct SDataLog *); //! / chip / K1921VK01T / GCC / USB / CDC_VCP / + + \author ООО "НПФ Вектор". http://motorcontrol.ru, НИИЭТ http://niiet.ru + \version v 1.0 08/08/2017 + +*/ + +#ifndef VINCLUDE_V_USBLIB_H_ +#define VINCLUDE_V_USBLIB_H_ + +int USB_init_hardware(void); +void USB_enable_peripheral (void); +void SystemInit (void); + +extern Uint8 usbActiveFlag; +#endif /* VINCLUDE_V_USBLIB_H_ */ diff --git a/Vinclude/V_watchdog.h b/Vinclude/V_watchdog.h new file mode 100644 index 0000000..e35225c --- /dev/null +++ b/Vinclude/V_watchdog.h @@ -0,0 +1,32 @@ +/* + * V_watchdog.h + * + * Created on: 12 июл. 2018 г. + * Author: Dmitry + */ + +#ifndef V_WATCHDOG_H_ +#define V_WATCHDOG_H_ + +struct Swdog; +typedef volatile struct Swdog Twdog; + +struct Swdog { + void (*enable)(); + void (*disable)(); + void (*feed)(); + void (*resetCPU)(); +}; + +void WDog_Enable(); +void WDog_Disable(); +void WDog_Feed(); +void WDog_ResetSystem(); + +#define WDOG_DEFAULTS {.enable = WDog_Enable,\ + .disable = WDog_Disable,\ + .feed = WDog_Feed,\ + .resetCPU = WDog_ResetSystem} + +extern Twdog Watchdog; +#endif /* V_WATCHDOG_H_ */ diff --git a/Vinclude/X_CANFlashProgData.h b/Vinclude/X_CANFlashProgData.h new file mode 100644 index 0000000..d8e341a --- /dev/null +++ b/Vinclude/X_CANFlashProgData.h @@ -0,0 +1,51 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file X_CANFlashProgData.h + \brief Бинарный файл прошивальщика - грузится в ОЗУ и ему передается управление, далее по CANopen можно обновить программу по flash. + \author Алямкин Д. + \version v 1.0 30/05/2017 + + \defgroup X_CANFlashProgData */ +/*@{*/ + + + +#ifndef X_CANFLASHPROGDATA_H +#define X_CANFLASHPROGDATA_H + +#ifdef __cplusplus +extern "C" +{ +#endif +//адрес структуры настроек +extern Uint32 const FPSettingsAddr; +//адрес начала программы прошивальщика +extern Uint32 const FPStartAddr; +//количество адресов в массиве FPAddrs +extern Uint16 const FPNumOfAddrs; +//адреса начала частей прошивальщика +extern Uint32 const FPAddrs[]; +//длина частей прошивальщика +extern Uint16 const FPPartsLength[]; +//данные прошивальщика +extern Uint16 const FPData[]; +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/X_CANFlashProgStarter.h b/Vinclude/X_CANFlashProgStarter.h new file mode 100644 index 0000000..4d78dc7 --- /dev/null +++ b/Vinclude/X_CANFlashProgStarter.h @@ -0,0 +1,82 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file X_CANFlashProgStarter.h + \brief Инициализирует процесс прожига по CANу + \author Алямкин Д. + \version v 1.0 30/05/2017 + + \defgroup TCANFlashProgStarter */ +/*@{*/ + + + +#ifndef X_CANFLASHPROGSTARTER_H +#define X_CANFLASHPROGSTARTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + +//#define FP_DEVICE_2810 +//#define FP_DEVICE_28335 +//#define FP_DEVICE_28035 +//#define FP_DEVICE_28069 +#define FP_DEVICE_M4F + +//ПереопределЯемые пользователем макросы +#define FP_BLOCK_PWM pwm.Off(&pwm); //выключение ШИМ +#define FP_CTRL_STOP sm_ctrl.state=CTRL_STOP +#define FP_FAULT_SET sm_prot.bit_fault2|= F_FLASH_PROGRAM + + +struct SFlashProgSettings{ + Uint16 magic_number; + Uint16 CANa_nodeID; //2000.0 номер данного узла + Uint16 CANa_bitRate; //2001.0 + Uint16 CANa_enable; + Uint16 CANb_nodeID; //2000.0 номер данного узла + Uint16 CANb_bitRate; //2001.0 + Uint16 CANb_enable; +}; +typedef volatile struct SFlashProgSettings TFlashProgSettings; + +extern TFlashProgSettings FPsettings; + +/* + struct SFlashProgStarter + { + Uint16 input; + void(*start)(volatile struct SFlashProgStarter*); + }; + + typedef volatile struct SFlashProgStarter TFlashProgStarter; + +#define TFLASHPROGSTARTER_DEFAULTS {0,\ + StartFlashProgrammer,\ + } +*/ +void StartFlashProgrammer(); +extern long swu_vars; + + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vinclude/build.h b/Vinclude/build.h new file mode 100644 index 0000000..c99f7ed --- /dev/null +++ b/Vinclude/build.h @@ -0,0 +1,152 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file build.h + \brief Конфигурационный заголовочный файл + Содержит глобальные макроопределения, используемые во всем проекте. + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 3.0 30/05/2017 + + @{ +*/ + + +//Выбор типа аппаратной части + +//VectorCARD с отладочным комплектом DRV8301 +//#define HW_VECTORCARD_DRV8301_EVM + +//VectorCARD с отладочным комплектом DRV8312 +//#define HW_VECTORCARD_DRV8312_EVM + +//VectorCARD с имитационными моделями двигателей +//#define HW_VECTORCARD_SIMULATOR + +//Отладочная плата НИИЭТ с имитационными моделями двигателей +//#define HW_NIIET_BOARD_SIMULATOR + +//Контроллер МК40.4 НПФ ВЕКТОР +//#define HW_VECTOR_MK_40_4 + +//Контроллер Motor Control Board +#define HW_MOTORCONTROLBOARD + + +//Для UART, выбирается чем его занять - MODBUS или CANtoRS драйвером +//#define MODBUS_ENA +#define CANTORS_ENA + +// Также можно задействовать USB для CANopen +//#define CANTOUSB_ENA + +//Выбор типа тригонометрических операций для преобразований Park и iPark - аппаратно через блок TMU или программно с помощью библиотеки IQMath +#define PARK_IPARK_TMU +//#define PARK_IPARK_IQMATH + + +//!Режимы работы (состояния ДА sm_ctrl) +//! Режим останов +#define CTRL_STOP 0 +//! Режим запуска (включение ШИМ, переход в другой желаемый режим работы) +#define CTRL_RUN 1 +//! Режим намагничивание (постоянный ток), работает контур тока +#define CTRL_FLUXING 2 +//! Режим скалярного управления по кривой U(f) без контуров тока +#define CTRL_RUN_U2F 3 +//! Режим вращения вектора тока +#define CTRL_RUN_I2F 4 +//! Векторная структура управления двухконтурная с датчиком для синхронной машины +#define CTRL_RUN_VECTOR_SM 5 +//! Векторная структура управления с энкодером и с контуром положения для синхронной машины +#define CTRL_RUN_VECTOR_SM_ENCODER_POS 10 + +//! Векторное управление для асинхронного двигателя с энкодером с контуром скорости +#define CTRL_RUN_VECTOR_IM_ENCODER 55 + +//! Векторное управление для асинхронного двигателя с энкодером с контуром скорости и положения +#define CTRL_RUN_VECTOR_IM_ENCODER_POS 60 + +//! Режим калибровки датчика положения +#define CTRL_AUTO_SENSOR_TUNING 29 + +//! Структура управления двигателем постоянного тока без контуров: задание напряжения на обмотки +#define CTRL_DC_DRIVE 35 +//! Структура управления двигателем постоянного тока с контуром тока и скорости +#define CTRL_DC_DRIVE_FB 36 + +//! Режим автокоммутации для SRM +#define CTRL_RUN_SRM_AUTOCOMMUTATION 101 + + + + +//Флаги аварий для модуля защит + +//bit_fault1 +#define F_CTRL_LOW_UDC 0x1 +#define F_CTRL_HI_UDC 0x2 +#define F_ENCODER_FAULT 0x4 +#define F_MODEL_FAULT 0x8 +#define F_FLASH_PROGRAM 0x10 +#define F_CTRL_HI_TEMP 0x20 +//#define F_RESERVED 0x40 +//#define F_RESERVED 0x80 +#define F_PROGRAM_1K 0x100 +#define F_PROGRAM_10K 0x200 +#define F_PROGRAM_40K 0x400 +//#define F_RESERVED 0x800 +#define F_PDPINT 0x1000 +#define F_RELAY_START 0x2000 +#define F_PROGRAM_IS_ON_BFLASH 0x4000 +//#define F_RESERVED 0x8000 + +//bit_fault2 +//#define F_RESERVED 0x1 +//#define F_RESERVED 0x2 +//#define F_RESERVED 0x4 +//#define F_RESERVED 0x8 +#define F_CTRL_MAX_I_PH_A 0x10 +#define F_CTRL_MAX_I_PH_B 0x20 +#define F_CTRL_MAX_I_PH_C 0x40 +//#define F_RESERVED 0x80 +//#define F_RESERVED 0x100 +#define F_CTRL_SPEED_MAX 0x200 +//#define F_RESERVED 0x400 +//#define F_RESERVED 0x800 +#define F_PDP_SWITCH_A0 0x1000 +#define F_PDP_SWITCH_A1 0x2000 +#define F_PDP_SWITCH_A2 0x4000 +#define F_PDP_SWITCH_LOWER 0x8000 + + +#define POS_SENSOR_TYPE_NO_SENSOR 0 +#define POS_SENSOR_TYPE_ENCODER 1 +#define POS_SENSOR_TYPE_HALL 2 +#define POS_SENSOR_TYPE_ENC_HALL 3 +#define POS_SENSOR_TYPE_SSI 4 +#define POS_SENSOR_TYPE_SENSORLESS 5 + +//!Время дискретизации быстрого расчета (прерывание, которое обычно 10кГц) +#define FAST_CALC_TS _IQ(0.0001) + + + +#if (!defined(HW_VECTORCARD_DRV8301_EVM)) && (!defined(HW_VECTORCARD_DRV8312_EVM)) && (!defined(HW_VECTORCARD_SIMULATOR))\ + && (!defined(HW_NIIET_BOARD_SIMULATOR)) && (!defined(HW_VECTOR_MK_40_4)) && (!defined(HW_MOTORCONTROLBOARD)) +#error необходимо определить хотя бы одну версию аппаратной части +#endif + + +/*@}*/ diff --git a/Vinclude/clarke.h b/Vinclude/clarke.h new file mode 100644 index 0000000..40b11d3 --- /dev/null +++ b/Vinclude/clarke.h @@ -0,0 +1,71 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file clarke.h + \brief Модуль фазных преобразований (см. TClarke) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup clarke Модуль фазных преобразований (см. Tclarke) + + @{ +*/ + +#ifndef CLARKE_H +#define CLARKE_H + +#ifdef __cplusplus +extern "C" { +#endif + + +/*! \class TClarke + \brief Фазные преобразования + + Класс \a TClarke, основанный на структуре SClarke, обеспечивает + преобразование величины из трефазной системы координат в двухфазную. + Так, для преобразования токов фаз входным переменным as и bs необходимо + присвоить значение токов фаз A и B, вызвать функцию calc, после чего в выходных + переменных ds, qs будет значение вектора тока во взаимно перпендикулярных осях + альфа, бетта (в англоязычной литературе оси d,q).*/ + +//! см. TClarke +struct SClarke{ long as; //!< Input: phase-a stator variable + long bs;//!< Input: phase-b stator variable + long ds; //!< Output: stationary d-axis stator variable + long qs; //!< Output: stationary q-axis stator variable + void (*calc)(struct SClarke*); //!< Pointer to calculation function + }; + +typedef struct SClarke TClarke; + + //! инициализатор по-умолчанию +#define CLARKE_DEFAULTS { 0, \ + 0, \ + 0, \ + 0, \ + clarke_calc } + + //! \memberof TClarke +void clarke_calc(TClarke*); + +#ifdef __cplusplus +} +#endif + + +#endif + +/*@}*/ diff --git a/Vinclude/co_ODvars.h b/Vinclude/co_ODvars.h new file mode 100644 index 0000000..b5338f2 --- /dev/null +++ b/Vinclude/co_ODvars.h @@ -0,0 +1,867 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file co_ODvars.h + \brief Объявляет некоторые служебные структуры для драйвера CANOpen + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.3 28/06/2019 + + \defgroup CANOpen_drv Драйвер CANOpen + @{ +*/ + +#ifndef CO_OD_VARS_H +#define CO_OD_VARS_H +#ifdef __cplusplus +extern "C" { +#endif + +#include "DSP.h" + +//**************************************************************************************************************************************** +//! Начальный адрес для сохранения в SPI памяти словаря 1-го CAN +#define CO1_SPI_START_ADDR 0 +//! Начальный адрес для сохранения в SPI памяти словаря 2-го CAN +#define CO2_SPI_START_ADDR 3500 + + +// количество "замеппированных" объектов для каждого PDO +#define RPDO1NUMOFPARAMS 4 +#define RPDO2NUMOFPARAMS 4 +#define RPDO3NUMOFPARAMS 4 +#define RPDO4NUMOFPARAMS 4 +#define RPDO5NUMOFPARAMS 4 +#define RPDO6NUMOFPARAMS 4 +#define RPDO7NUMOFPARAMS 4 +#define RPDO8NUMOFPARAMS 4 + +#define TPDO1NUMOFPARAMS 4 +#define TPDO2NUMOFPARAMS 4 +#define TPDO3NUMOFPARAMS 4 +#define TPDO4NUMOFPARAMS 4 +#define TPDO5NUMOFPARAMS 4 +#define TPDO6NUMOFPARAMS 4 +#define TPDO7NUMOFPARAMS 4 +#define TPDO8NUMOFPARAMS 4 + + + +//структура с таблицами параметров для настройки скорости CAN (для каждого микроконтроллера настройки свои) +typedef struct { + Uint16 co_DIV8[6]; + Uint16 co_BRP[6]; + Uint16 co_TSEG1[6]; + Uint16 co_TSEG2[6]; + Uint16 co_SJW[6]; +} TCANSpeedTableOptions; + +//структура пользовательских настроек драйвера +struct S_CANOPEN_DRV_SETTINGS +{ + Uint16 LoadParamsFromUserMemory_ena; //Загружать параметры из пользовательской памяти при инициализации + Uint16 CAN_ISR_priority; //Приоритет прерываний CAN + + Uint16 MultiPDO_ena; /* //разрешение принимать PDO от любых устройств в сети: + //для каждого RPDO доступны 8 диапазонов принимаемых идентификаторов: + // 0x181-0x1FF + // 0x200-0x27F + // 0x280-0x2FF + // ... + // 0x480-0x4FF + // 0x500-0x57F + //Каждому RPDO должен быть сопоставлен свой диапазон идентификаторов. + //Для сопоставления данному RPDO диапазона идентификаторов необходимо присвоить + //соответствующему RPDOxCOBID любой идентификатор требуемого диапазона. + //Двум RPDO одного устройства не может быть сопоставлен один и тот же диапазон идентификаторов - + //в этом случае поведение непредсказуемо. */ + + Uint16 RX_PDO_Callback_ena; /*//разрешение вызова CallBack при приеме PDO. (может использоваться как в обычном режиме, так и в режиме МультиPDO). + //Если дефайн объявлен, то после каждого приема узлом PDO будет вызываться соответствующая CallBack функция + //(ф-ии описаны в файле CANOpenCallbacks.c) вида: void co_RPDOx_Callback(Uint16 nodeID) + //Где x = 1,2,..8 при приеме RPDO1, RPDO2,..RPDO8 соответственно. + //В качестве параметра в функцию передается только номер узла (nodeID) от которого принято PDO, + //а принятая информация находится по соответствующему(-им) мэппингу данного PDO адресу(-ам).*/ + + Uint16 AutoBusON_ena; /*//разрешение CAN устройству оставаться в работе даже при наличии большого количества ошибок на линии CAN. + //С одной стороны разрешение позволяет работать устройству в сильно зашумленной линии, но с другой - + //при отказе в устройстве, например rx, устройство забьет всю сеть, пытаясь отправить свою посылку...*/ + + Uint16 BlockTransfer_ena; //разрешение использования в драйвере функций блочной передачи + + Uint32 BaseAdressCanRegisters; //адрес в памяти, с которого начинаются CAN-регистры. Нужно для унификация библиотеки драйвера CANOpen для разных + //микроконтроллеров фирмы НИИЭТ + + Uint16 CAN_IRQn; //номер перечисления прерывания CAN из таблицы прерываний. Нужно для унификация библиотеки драйвера CANOpen для + //разных микроконтроллеров фирмы НИИЭТ + + TCANSpeedTableOptions *speedCANTablePointer;//указатель на массив структур с таблицами параметров для настройки скорости CAN для разных микроконтроллеров. + + void (*resetCPU)(void); //указатель на функцию перезагрузки микроконтроллера. Нужна, потому как для разных микроконтроллеров фирмы НИИЭТ + //используются разные функции для ресета. +}; + +// Тип доступа к параметру (согласно формату) +typedef enum EObjAccess +{ + OBJ_ACCESS_READONLY, // read-only + OBJ_ACCESS_RW, // read/write + OBJ_ACCESS_WP, // read/writeable protected + OBJ_ACCESS_SWP, // read/secret writeable protected +} TObjAccess; + +// Тип параметра (согласно формату) +typedef enum EObjType +{ + OBJ_TYPE_UNKNOWN, + OBJ_TYPE_ROOT, + OBJ_TYPE_U8, + OBJ_TYPE_U16, + OBJ_TYPE_QU16, + OBJ_TYPE_I8, + OBJ_TYPE_I16, + OBJ_TYPE_QI16, + OBJ_TYPE_U32, + OBJ_TYPE_QU32, + OBJ_TYPE_I32, + OBJ_TYPE_QI32, + OBJ_TYPE_BIT_FIELD, + OBJ_TYPE_FLOAT_ABS, + OBJ_TYPE_FLOAT_PU, +} TObjType; + +// Структура, содержащая различную информацию об объекте. +typedef struct +{ + void* varAddr; // адрес переменной в ОЗУ + int varSize; // размер переменной в битах (16/32) + TObjAccess access; // тип доступа к объекту + TObjType type; // тип объекта + Uint16 subIndNum; // число подындексов (для ROOT) + Uint16 scaleNum; // номер масштабирующего коэффициента (для QU16, QI16, QU32, QI32, FLOAT_PU) + Uint16 Q; // число разрядов дробной части (для QU16, QI16, QU32, QI32) + Uint16 bitOffset; // смещение битового поля (для BIT_FIELD) + Uint16 bitNum; // размер битового поля (для BIT_FIELD) + Uint16 precision; // число знаков, отображаемых после запятой (для FLOAT_ABS) + Uint16 prefix; // префикс размерности (для FLOAT_ABS) + Uint16 units; // размерность (для FLOAT_ABS) +} TObjectInfo; + + +typedef volatile struct S_CANOPEN_DRV_SETTINGS T_CANOPEN_DRV_SETTINGS; + +//!Конфигурирование полей SDO +struct SDOcommSpecifier { + Uint16 s:1; //!< 0 - если s=1, то размер передаваемых данных известен и указан + Uint16 e:1; //!< 1 - expedited или нет + Uint16 n:2; //!< 3:2 - количество байт данных не содержащих данных + Uint16 X:1; //!< 4 - reserved + Uint16 cs:3;//!< 7:5 - SDO команда + Uint16 reserved:8;// +}; + +//! Нулевой байт мейл-бокса +union MBOXByte0{ + struct SDOcommSpecifier SDO_Spicifier; + Uint16 byte0; +}; +//! Байты мейл-бокса, используемого для альтернативной CAN связи (ZigBee, USB) +typedef struct { + union MBOXByte0 MByte0; + Uint16 byte1; + Uint16 byte2; + Uint16 byte3; + Uint16 byte4; + Uint16 byte5; + Uint16 byte6; + Uint16 byte7; + Uint16 senderNodeID; +}Z_MBytes; + +typedef struct { + Uint32 id; + Uint8 data[8]; + Uint8 dlc; +} TZCanMsg; + + +///сообщение в виде полей SDO + struct SDOmsg + { Uint32 s:1; //!< 0 - если s=1, то размер передаваемых данных известен и указан + Uint32 e:1; //!< 1 - expedited или нет + Uint32 n:2; //!< 3:2 - количество байт данных не содержащих данных + Uint32 X:1; //!< 4 - reserved + Uint32 cs:3;//!< 7:5 - SDO команда + Uint32 index:16; + Uint32 subindex:8; + Uint32 data:32; + }; +//сообщение в виде байтов + struct MBOX_bytes + { Uint16 byte0:8; + Uint16 byte1:8; + Uint16 byte2:8; + Uint16 byte3:8; + Uint16 byte4:8; + Uint16 byte5:8; + Uint16 byte6:8; + Uint16 byte7:8; + }; +//сообщение в виде слов + struct MBOX_words + { Uint16 word0; + Uint16 word1; + Uint16 word2; + Uint16 word3; + }; +//сообщение в виде MDRL, MDRH + struct MBOX_Uint32 + { Uint32 MDRL; + Uint32 MDRH; + }; +//все представления накладываем друг на друга + union MBOX_data { + struct MBOX_Uint32 u32; + struct MBOX_words u16; + struct MBOX_bytes u8; + struct SDOmsg SDO; + }; + typedef volatile union MBOX_data TMBOX_data; + + struct MID_bits + { Uint32 rsvd1:18; //пока не используем + Uint32 senderNodeID:7; //номер узла + Uint32 rsvd2:7; //пока не используем + }; + union MID_data { + Uint32 all; + struct MID_bits bit; + }; +// мейл-бокс + struct MData + { + union MBOX_data data; + union MID_data MID; + }; + typedef volatile struct MData TCo_MOData; + +//! Сборник данных всех мейл-боксов + struct CO_MBOXDATA + { + struct MData MBOX_0; + struct MData MBOX_1; + struct MData MBOX_2; + struct MData MBOX_3; + struct MData MBOX_4; + struct MData MBOX_5; + struct MData MBOX_6; + struct MData MBOX_7; + struct MData MBOX_8; + struct MData MBOX_9; + struct MData MBOX_10; + struct MData MBOX_11; + struct MData MBOX_12; + struct MData MBOX_13; + struct MData MBOX_14; + struct MData MBOX_15; + struct MData MBOX_16; + struct MData MBOX_17; + struct MData MBOX_18; + struct MData MBOX_19; + struct MData MBOX_20; + struct MData MBOX_21; + struct MData MBOX_22; + struct MData MBOX_23; + struct MData MBOX_24; + struct MData MBOX_25; + struct MData MBOX_26; + struct MData MBOX_27; + struct MData MBOX_28; + struct MData MBOX_29; + struct MData MBOX_30; + struct MData MBOX_31; + }; + + typedef volatile struct CO_MBOXDATA TCo_MboxData; + +//**************************************************************************************************************************************** +//структуры модуля блочной передачи +#define BT_FIFO_SIZE 8 //8 сообщений должно хватить для 1Мбит/с, если обработка производится в 1мс +//внутримодульные дефайны +#define BT_FIFO_SUCCESSFUL 0 +#define BT_FIFO_EMPTY 1 +#define BT_FIFO_FULL 2 +#define BT_FIFO_BUSY 3 + +struct S_BT_FIFO +{ +Uint16 busy_flag; //флаг занятости ФИФО, показывает количество инстанций, использующих ФИФО в данный момент +Uint16 size; +Uint16 number_of_msgs; +Uint16 read_ptr; +Uint16 write_ptr; +TMBOX_data msg_array[BT_FIFO_SIZE]; +Uint16(*read)(volatile struct S_BT_FIFO*,TMBOX_data*); +Uint16(*write)(volatile struct S_BT_FIFO*,TMBOX_data*); +Uint16(*clear)(volatile struct S_BT_FIFO*); +}; + +typedef volatile struct S_BT_FIFO T_BT_FIFO; + +#define T_BT_FIFO_DEFAULTS {0,\ + BT_FIFO_SIZE,\ + 0,0,0,\ + {0},\ + BT_FIFO_Read,\ + BT_FIFO_Write,\ + BT_FIFO_Clear} + +Uint16 BT_FIFO_Read(T_BT_FIFO*,TMBOX_data*); +Uint16 BT_FIFO_Write(T_BT_FIFO*,TMBOX_data*); +Uint16 BT_FIFO_Clear(T_BT_FIFO* p); + +#define CANBT_STATE_FREE 0 +#define CANBT_STATE_RX 1 +#define CANBT_STATE_TX 2 + +#define CANBT_STATUS_IDLE 0 +#define CANBT_STATUS_BUSY 1 +#define CANBT_STATUS_SUCCESSFUL 2 +#define CANBT_STATUS_TIMEOUT 3 +#define CANBT_STATUS_CRC_ERR 4 +#define CANBT_STATUS_ANY_ERR 5 + +struct SBlockTransfer +{ Uint16 state; //Состояние. + Uint16 state_shadow;//Теневое состояние. + Uint16 state_prev; //Предыдущее состояние (на один такт) + Uint16 E; //Флаг первого вхождения. + Uint32 state_time; //время нахождения в текущем состоянии, в мс. + Uint16 RX_block_size; //размер принимаемого блока (определяется пользователем перед приемом) + Uint16 TX_block_size; //размер отправляемого блока (определяется пользователем перед отправкой) + Uint16 firstTXmsg; //флаг, показывающий, что 1-е сообщение блока еще не отправлялось. + Uint16* RX_dest_ptr; + Uint16* TX_source_ptr; + int RX_index; + int TX_index; + T_BT_FIFO RXmsgFIFO; + T_BT_FIFO TXmsgFIFO; + Uint16 blockCRC; + Uint16 rx_status; //обратная связь для внешней программы использующей блочную передачу + Uint16 tx_status; // + Uint32 timeout; +}; + +typedef volatile struct SBlockTransfer TBlockTransfer; + +#define TBLOCK_TRANSFER_DEFAULTS {CANBT_STATE_FREE,\ + CANBT_STATE_FREE,0xff,1,\ + 0,\ + 0,0,0,0,0,0,0,\ + T_BT_FIFO_DEFAULTS,T_BT_FIFO_DEFAULTS,\ + 0,\ + CANBT_STATUS_IDLE,CANBT_STATUS_IDLE,\ + ((Uint32)500)/*500мс*/,\ + } + + +//**************************************************************************************************************************************** +//структура работы с пользовательской памятью для сохранения и восстановления параметров словаря объектов +struct S_UserMemoryContext +{ + Uint16 MemStartAddr; //!Адрес в пользовательской памяти (побайтовый доступ) + Uint16 *MCUStartAddr; //!Указатель на массив с данными в MCU + Uint16 data_length; //!длина данных (в байтах) +}; +typedef volatile struct S_UserMemoryContext T_UserMemoryContext; +//**************************************************************************************************************************************** + +//Структура с данными драйвера CANOpen +//Помимо служебных и пользоваельских данных, необходимых для работы драйвера, +//в данную структуру входят стандартные переменные словаря CANOpen + +struct SCo_OdVars{ + Uint32 co_deviceType; //1000.0 + Uint16 co_errorRegister; //1001.0 Регистр ошибки + Uint32 co_deviceState; //1002.0 + Uint32 co_emcyCOBID; //1014.0 + Uint32 co_CHBT; //1016.1 Consumer heartbeat time + Uint32 co_PHBT ; //1017.0 Producer heartbeat time + Uint32 co_vendorID; //1018.1 + Uint32 co_productCode; //1018.2 + Uint32 co_revisionNumber; //1018.3 + Uint32 co_serialNumber; //1018.4 + Uint32 co_csrxCOBID; //1200.1 + Uint32 co_sctxCOBID; //1200.2 + Uint32 co_cstxCOBID; //1280.1 + Uint32 co_scrxCOBID; //1280.2 + Uint16 co_ssNODEID; //1280.3 + Uint32 co_RPDO1COBID; //1400.1 + Uint16 co_transType; //1400.2 , 1401.2 , 1402.2 , 1403.2 + Uint32 co_RPDO2COBID; //1401.1 + Uint32 co_RPDO3COBID; //1402.1 + Uint32 co_RPDO4COBID; //1403.1 + Uint32 co_RPDO5COBID; //1404.1 rwp + Uint32 co_RPDO6COBID; //1405.1 rwp + Uint32 co_RPDO7COBID; //1406.1 rwp + Uint32 co_RPDO8COBID; //1407.1 rwp +// + Uint32 co_RPDO1_1Mapping; //1600.1 + Uint32 co_RPDO1_2Mapping; //1600.2 + Uint32 co_RPDO1_3Mapping; //1600.3 + Uint32 co_RPDO1_4Mapping; //1600.4 + Uint32 co_RPDO2_1Mapping; //1601.1 + Uint32 co_RPDO2_2Mapping; //1601.2 + Uint32 co_RPDO2_3Mapping; //1601.3 + Uint32 co_RPDO2_4Mapping; //1601.4 + Uint32 co_RPDO3_1Mapping; //1602.1 + Uint32 co_RPDO3_2Mapping; //1602.2 + Uint32 co_RPDO3_3Mapping; //1602.3 + Uint32 co_RPDO3_4Mapping; //1602.4 + Uint32 co_RPDO4_1Mapping; //1603.1 + Uint32 co_RPDO4_2Mapping; //1603.2 + Uint32 co_RPDO4_3Mapping; //1603.3 + Uint32 co_RPDO4_4Mapping; //1603.4 +//2007_03_14 + Uint32 co_RPDO5_1Mapping; //1604.1 rwp + Uint32 co_RPDO5_2Mapping; //1604.2 rwp + Uint32 co_RPDO5_3Mapping; //1604.3 rwp + Uint32 co_RPDO5_4Mapping; //1604.4 rwp + Uint32 co_RPDO6_1Mapping; //1605.1 rwp + Uint32 co_RPDO6_2Mapping; //1605.2 rwp + Uint32 co_RPDO6_3Mapping; //1605.3 rwp + Uint32 co_RPDO6_4Mapping; //1605.4 rwp + Uint32 co_RPDO7_1Mapping; //1606.1 rwp + Uint32 co_RPDO7_2Mapping; //1606.2 rwp + Uint32 co_RPDO7_3Mapping; //1606.3 rwp + Uint32 co_RPDO7_4Mapping; //1606.4 rwp + Uint32 co_RPDO8_1Mapping; //1607.1 rwp + Uint32 co_RPDO8_2Mapping; //1607.2 rwp + Uint32 co_RPDO8_3Mapping; //1607.3 rwp + Uint32 co_RPDO8_4Mapping; //1607.4 rwp +// + Uint32 co_TPDO1COBID; //1800.1 + Uint16 co_TPDO1ITime; //1800.3 rw + Uint16 co_compatEntry; //1800.4 rw + Uint16 co_TPDO1EventTimer; //1800.5 rw + Uint32 co_TPDO2COBID; //1801.1 + Uint16 co_TPDO2ITime; //1801.3 rw + Uint16 co_TPDO2EventTimer; //1800.5 rw + Uint32 co_TPDO3COBID; //1802.1 + Uint16 co_TPDO3ITime; //1802.3 rw + Uint16 co_TPDO3EventTimer; //1800.5 rw + Uint32 co_TPDO4COBID; //1803.1 + Uint16 co_TPDO4ITime; //1803.3 rw + Uint16 co_TPDO4EventTimer; //1800.5 rw + Uint32 co_TPDO5COBID; //1804.1 r + Uint16 co_TPDO5ITime; //1804.3 rw + Uint16 co_TPDO5EventTimer; //1804.5 rw + Uint32 co_TPDO6COBID; //1805.1 r + Uint16 co_TPDO6ITime; //1805.3 rw + Uint16 co_TPDO6EventTimer; //1805.5 rw + Uint32 co_TPDO7COBID; //1806.1 r + Uint16 co_TPDO7ITime; //1806.3 rw + Uint16 co_TPDO7EventTimer; //1806.5 rw + Uint32 co_TPDO8COBID; //1807.1 r + Uint16 co_TPDO8ITime; //1807.3 rw + Uint16 co_TPDO8EventTimer; //1807.5 rw +// + Uint32 co_TPDO1_1Mapping; //1A00.1 + Uint32 co_TPDO1_2Mapping; //1A00.2 + Uint32 co_TPDO1_3Mapping; //1A00.3 + Uint32 co_TPDO1_4Mapping; //1A00.4 + Uint32 co_TPDO2_1Mapping; //1A01.1 + Uint32 co_TPDO2_2Mapping; //1A01.2 + Uint32 co_TPDO2_3Mapping; //1A01.3 + Uint32 co_TPDO2_4Mapping; //1A01.4 + Uint32 co_TPDO3_1Mapping; //1A02.1 + Uint32 co_TPDO3_2Mapping; //1A02.2 + Uint32 co_TPDO3_3Mapping; //1A02.3 + Uint32 co_TPDO3_4Mapping; //1A02.4 + Uint32 co_TPDO4_1Mapping; //1A03.1 + Uint32 co_TPDO4_2Mapping; //1A03.2 + Uint32 co_TPDO4_3Mapping; //1A03.3 + Uint32 co_TPDO4_4Mapping; //1A03.4 + Uint32 co_TPDO5_1Mapping; //1A04.1 rwp + Uint32 co_TPDO5_2Mapping; //1A04.2 rwp + Uint32 co_TPDO5_3Mapping; //1A04.3 rwp + Uint32 co_TPDO5_4Mapping; //1A04.4 rwp + Uint32 co_TPDO6_1Mapping; //1A05.1 rwp + Uint32 co_TPDO6_2Mapping; //1A05.2 rwp + Uint32 co_TPDO6_3Mapping; //1A05.3 rwp + Uint32 co_TPDO6_4Mapping; //1A05.4 rwp + Uint32 co_TPDO7_1Mapping; //1A06.1 rwp + Uint32 co_TPDO7_2Mapping; //1A06.2 rwp + Uint32 co_TPDO7_3Mapping; //1A06.3 rwp + Uint32 co_TPDO7_4Mapping; //1A06.4 rwp + Uint32 co_TPDO8_1Mapping; //1A07.1 rwp + Uint32 co_TPDO8_2Mapping; //1A07.2 rwp + Uint32 co_TPDO8_3Mapping; //1A07.3 rwp + Uint32 co_TPDO8_4Mapping; //1A07.4 rwp +// + Uint16 co_nodeID ; //2000.0 номер данного узла + Uint16 co_bitRate; //2001.0 + Uint16 co_specialData1; //2003.1 + Uint16 co_specialData2; //2003.2 + Uint16 co_specialData3; //2003.3 + Uint16 co_specialData4; //2003.4 + Uint32 co_secretCode; //2004.0 + Uint16 co_protectBit; //2005.0 + Uint32 co_devicePresentFlag0; + Uint32 co_devicePresentFlag1; + Uint32 co_devicePresentFlag2; + Uint32 co_devicePresentFlag3; + Uint32 co_deviceGlobalPresent0; + Uint32 co_deviceGlobalPresent1; + Uint32 co_deviceGlobalPresent2; + Uint32 co_deviceGlobalPresent3; + Uint32 co_heartbeatFlag0 ; //2010.1 Флаги heartbeat с 0 по 31-е устройство + Uint32 co_heartbeatFlag1 ; //2010.2 Флаги heartbeat с 32 по 63-е устройство + Uint32 co_heartbeatFlag2 ; //2010.3 Флаги heartbeat с 64 по 95-е устройство + Uint32 co_heartbeatFlag3 ; //2010.4 Флаги heartbeat с 96 по 127-е устройство + Uint32 co_heartbeatMask0 ; //2011.1 Маски heartbeat с 0 по 31-е устройство (0110b) + Uint32 co_heartbeatMask1 ; //2011.2 Маски heartbeat с 32 по 63-е устройство + Uint32 co_heartbeatMask2 ; //2011.3 Маски heartbeat с 64 по 95-е устройство + Uint32 co_heartbeatMask3 ; //2011.4 Маски heartbeat с 96 по 127-е устройство + Uint16 co_heartbeatAutoStart ; //2012.0 Параметр, определяющий возможен ли автозапуск сети + Uint16 co_heartbeatAutoRecovery ; //2014.0 Параметр, определяющий возможен ли перезапуск системы из состояния STOPPED + Uint16 co_nodeState ; //2015.0 состояние данного узла - вначале BOOTUP + Uint16 co_emergencyErrorCode ; //2016.0 Код аварии + Uint32 co_deviceErrorState ; //2017.0 Статусный регистр ошибок производителя + Uint16 co_ODCommand; //2080.1 + Uint16 co_currentODIndex; //2080.2 + Uint16 co_currentODSubIndex; //2080.3 + Uint16 co_currentODEText; //2080.4 + Uint16 co_currentODEFormat; //2080.5 + Uint16 co_currentODEMin; //2080.6 + Uint16 co_currentODEMax; //2080.7 + Uint16 co_currentODEDefault; //2080.8 + Uint16 co_currentODEMinLow; //2080.9 + Uint16 co_currentODEMaxLow; //2080.10 + Uint16 co_currentODEDefaultLow; //2080.11 + Uint16 co_currentODEAddrHigh; //2080.12 + Uint16 co_currentODEAddrLow; + Uint16 co_currentODEType; + Uint16 co_odIndexSize; + Uint32 co_defaultIndex1; //2082.1 rw + Uint32 co_defaultIndex2; //2082.2 rw + Uint16 co_maskElement01; //2083.1,2 rw + Uint16 co_maskElement23; //2083.3,4 rw + Uint16 co_maskElement45; //2083.5,6 rw + Uint16 co_maskElement67; //2083.7,8 rw + Uint16 co_maskElement89; //2083.9,A rw + Uint16 co_maskElementAB; //2083.B,C rw + Uint16 co_maskElementCD; //2083.D,E rw + Uint16 co_maskElementEF; //2083.F,10 rw + Uint16 co_profileAccessMask; //2081.0 rw + Uint16 co_scaleNum0; //2100.1 + Uint16 co_scaleNum0Format; //2100.2 + Uint16 co_scaleNum1; //2101.1 + Uint16 co_scaleNum1Format; //2101.2 + Uint16 co_scaleNum2; //2102.1 + Uint16 co_scaleNum2Format; //2102.2 + Uint16 co_scaleNum3; //2103.1 + Uint16 co_scaleNum3Format; //2103.2 + Uint16 co_scaleNum4; //2104.1 + Uint16 co_scaleNum4Format; //2104.2 + Uint16 co_scaleNum5; //2105.1 + Uint16 co_scaleNum5Format; //2105.2 + Uint16 co_scaleNum6; //2106.1 + Uint16 co_scaleNum6Format; //2106.2 + Uint16 co_scaleNum7; //2107.1 + Uint16 co_scaleNum7Format; //2107.2 + Uint16 co_scaleNum8; //2108.1 + Uint16 co_scaleNum8Format; //2108.2 + Uint16 co_scaleNum9; //2109.1 + Uint16 co_scaleNum9Format; //2109.2 + Uint16 co_scaleNumA; //210A.1 + Uint16 co_scaleNumAFormat; //210A.2 + Uint16 co_scaleNumB; //210B.1 + Uint16 co_scaleNumBFormat; //210B.2 + Uint16 co_scaleNumC; //210C.1 + Uint16 co_scaleNumCFormat; //210C.2 + Uint16 co_scaleNumD; //210D.1 + Uint16 co_scaleNumDFormat; //210D.2 + Uint16 co_scaleNumE; //210E.1 + Uint16 co_scaleNumEFormat; //210E.2 + Uint16 co_scaleNumF; //210F.1 + Uint16 co_scaleNumFFormat; //210F.2 + Uint16 co_scaleNum10; //2110.1 + Uint16 co_scaleNum10Format; //2110.2 + Uint16 co_scaleNum11; //2111.1 + Uint16 co_scaleNum11Format; //2111.2 + Uint16 co_scaleNum12; //2112.1 + Uint16 co_scaleNum12Format; //2112.2 + Uint16 co_scaleNum13; //2113.1 + Uint16 co_scaleNum13Format; //2113.2 + Uint16 co_scaleNum14; //2114.1 + Uint16 co_scaleNum14Format; //2114.2 + Uint16 co_scaleNum15; //2115.1 + Uint16 co_scaleNum15Format; //2115.2 + Uint16 co_scaleNum16; //2116.1 + Uint16 co_scaleNum16Format; //2116.2 + Uint16 co_scaleNum17; //2117.1 + Uint16 co_scaleNum17Format; //2117.2 + Uint16 co_scaleNum18; //2118.1 + Uint16 co_scaleNum18Format; //2118.2 + Uint16 co_scaleNum19; //2119.1 + Uint16 co_scaleNum19Format; //2119.2 + Uint16 co_scaleNum1A; //211A.1 + Uint16 co_scaleNum1AFormat; //211A.2 + Uint16 co_scaleNum1B; //211B.1 + Uint16 co_scaleNum1BFormat; //211B.2 + Uint16 co_scaleNum1C; //211C.1 + Uint16 co_scaleNum1CFormat; //211C.2 + Uint16 co_scaleNum1D; //211D.1 + Uint16 co_scaleNum1DFormat; //211D.2 + Uint16 co_scaleNum1E; //211E.1 + Uint16 co_scaleNum1EFormat; //211E.2 + Uint16 co_scaleNum1F; //211F.1 + Uint16 co_scaleNum1FFormat; //211F.2 + + Uint16 co_blockTransferCommand; //2700 + + //Указатели + Uint16 *co_currentWordODTbl1 ;//данные указатели ипользуются для работы интерпретатора + Uint16 *co_currentWordODTbl2 ;//команд в прерывании ШИМ (для обработки быстрых команд) + Uint16 co_currentAccessMask; //маска доступа индекса на который указывает co_currentWordODTbl1 + + Uint16 *co_shadow_currentWordODTbl1 ;//данные указатели ипользуются для работы интерпретатора + Uint16 *co_shadow_currentWordODTbl2 ;//команд в фоновой программе (для обработки медленных команд) + + Uint16 *co_SDOcurrentWordODTbl1; + Uint16 *co_SDOcurrentWordODTbl2; + + //ExternalInterface + Uint16 *Z_co_SDOcurrentWordODTbl1; + Uint16 *Z_co_SDOcurrentWordODTbl2; + + Uint16 *co_PDOcurrentWordODTbl1; + Uint16 *co_PDOcurrentWordODTbl2; + Uint16 *co_PDOMAPcurrentWordODTbl1; + Uint16 *co_PDOMAPcurrentWordODTbl2; + + Uint16 *co_endODTbl1 ;//указывает на последний элемент индекс в таблице ODTbl1 + + Uint32 co_MailboxMDRL; + Uint32 co_MailboxMDRH; + Uint32 co_MailboxMID; + + Uint32 co_flagBackUp0;// + Uint32 co_flagBackUp1;// предыдущие состояния флагов + Uint32 co_flagBackUp2;// + Uint32 co_flagBackUp3;// + + Uint32 co_backupEEC; // Предыдущее состояние кода аварии + Uint32 co_backupER; // Предыдущее состояние регистра ошибки + Uint32 co_backupDES; // Предыдущее состояние статусного регистра ошибок производителя + + Uint32 co_consHBTimeCounter;// изначально должен быть равен co_CHBT + Uint32 co_prodHBTimeCounter;// изначально должен быть равен co_PHBT + Uint32 co_emcyNewState; // Состояние в которое перешел узел после ошибки + Uint32 co_msDevisor; // делитель частоты для получения 1мс - используется для отправки Heartbeat + + Uint16 co_shadow_currentODIndex; + Uint16 co_shadow_currentODSubIndex; + Uint16 co_shadow_currentODEText; + Uint16 co_shadow_currentODEFormat; + Uint16 co_shadow_currentODEMin; + Uint16 co_shadow_currentODEMax; + Uint16 co_shadow_currentODEDefault; + Uint16 co_shadow_currentODEMinLow; + Uint16 co_shadow_currentODEMaxLow; + Uint16 co_shadow_currentODEDefaultLow; + Uint16 co_shadow_currentODEAddrLow; + Uint16 co_shadow_currentODEAddrHigh; + Uint16 co_shadow_currentODEType; + //переменные необходимые для работы SDO служб + Uint16 co_SDOrequestIndex; + Uint16 co_SDOrequestSubIndex; + Uint16 co_SDOrequestData; + Uint16 co_SDOrequestDataH; + Uint16 co_SDOrequestStatus; + Uint16 co_SDOrequestFlag; + Uint16 co_SDOSuspendedSend; + TMBOX_data SDOMsgData; + + //временная переменная защиты секретных параметров от несанкционированного доступа + Uint16 co_secretProtectBit; + + //переменные необходимые для работы PDO служб + Uint16 co_PDOMappingFlags;//RRRR RRRR TTTT TTTT - "T" - TPDO;- "R" - RPDO + + Uint16 co_PDO1Devisor; // делитель для получения заданной скорости передачи PDO1 + Uint16 co_PDO2Devisor; + Uint16 co_PDO3Devisor; + Uint16 co_PDO4Devisor; + Uint16 co_PDO5Devisor; + Uint16 co_PDO6Devisor; + Uint16 co_PDO7Devisor; + Uint16 co_PDO8Devisor; + // + Uint16 co_NumOfNextPDO; + Uint16 co_PDOTransmitFlags;//0000 0000 TTTT TTTT + Uint16 co_PDOTransmitEna; //0000 0000 TTTT TTTT + Uint16 co_PDOReceiveEna; //0000 0000 RRRR RRRR + + Uint16 co_my_PDO1TransmitFlags; + Uint16 co_my_PDO2TransmitFlags; + Uint16 co_my_PDO3TransmitFlags; + Uint16 co_my_PDO4TransmitFlags; + Uint16 co_my_PDO5TransmitFlags; + Uint16 co_my_PDO6TransmitFlags; + Uint16 co_my_PDO7TransmitFlags; + Uint16 co_my_PDO8TransmitFlags; + + + Uint32 co_RPDO1_addr[RPDO1NUMOFPARAMS]; + Uint32 co_RPDO2_addr[RPDO2NUMOFPARAMS]; + Uint32 co_RPDO3_addr[RPDO3NUMOFPARAMS]; + Uint32 co_RPDO4_addr[RPDO4NUMOFPARAMS]; + Uint32 co_RPDO5_addr[RPDO5NUMOFPARAMS]; + Uint32 co_RPDO6_addr[RPDO6NUMOFPARAMS]; + Uint32 co_RPDO7_addr[RPDO7NUMOFPARAMS]; + Uint32 co_RPDO8_addr[RPDO8NUMOFPARAMS]; + // + + Uint16 co_RPDO1_startBit[RPDO1NUMOFPARAMS]; + Uint16 co_RPDO2_startBit[RPDO2NUMOFPARAMS]; + Uint16 co_RPDO3_startBit[RPDO3NUMOFPARAMS]; + Uint16 co_RPDO4_startBit[RPDO4NUMOFPARAMS]; + Uint16 co_RPDO5_startBit[RPDO5NUMOFPARAMS]; + Uint16 co_RPDO6_startBit[RPDO6NUMOFPARAMS]; + Uint16 co_RPDO7_startBit[RPDO7NUMOFPARAMS]; + Uint16 co_RPDO8_startBit[RPDO8NUMOFPARAMS]; + // + + Uint16 co_RPDO1_numOfBits[RPDO1NUMOFPARAMS]; + Uint16 co_RPDO2_numOfBits[RPDO2NUMOFPARAMS]; + Uint16 co_RPDO3_numOfBits[RPDO3NUMOFPARAMS]; + Uint16 co_RPDO4_numOfBits[RPDO4NUMOFPARAMS]; + Uint16 co_RPDO5_numOfBits[RPDO5NUMOFPARAMS]; + Uint16 co_RPDO6_numOfBits[RPDO6NUMOFPARAMS]; + Uint16 co_RPDO7_numOfBits[RPDO7NUMOFPARAMS]; + Uint16 co_RPDO8_numOfBits[RPDO8NUMOFPARAMS]; + // + + Uint32 co_TPDO1_addr[TPDO1NUMOFPARAMS]; + Uint32 co_TPDO2_addr[TPDO2NUMOFPARAMS]; + Uint32 co_TPDO3_addr[TPDO3NUMOFPARAMS]; + Uint32 co_TPDO4_addr[TPDO4NUMOFPARAMS]; + Uint32 co_TPDO5_addr[TPDO5NUMOFPARAMS]; + Uint32 co_TPDO6_addr[TPDO6NUMOFPARAMS]; + Uint32 co_TPDO7_addr[TPDO7NUMOFPARAMS]; + Uint32 co_TPDO8_addr[TPDO8NUMOFPARAMS]; + // + + Uint16 co_TPDO1_startBit[TPDO1NUMOFPARAMS]; + Uint16 co_TPDO2_startBit[TPDO2NUMOFPARAMS]; + Uint16 co_TPDO3_startBit[TPDO3NUMOFPARAMS]; + Uint16 co_TPDO4_startBit[TPDO4NUMOFPARAMS]; + Uint16 co_TPDO5_startBit[TPDO5NUMOFPARAMS]; + Uint16 co_TPDO6_startBit[TPDO6NUMOFPARAMS]; + Uint16 co_TPDO7_startBit[TPDO7NUMOFPARAMS]; + Uint16 co_TPDO8_startBit[TPDO8NUMOFPARAMS]; + // + + Uint16 co_TPDO1_numOfBits[TPDO1NUMOFPARAMS]; + Uint16 co_TPDO2_numOfBits[TPDO2NUMOFPARAMS]; + Uint16 co_TPDO3_numOfBits[TPDO3NUMOFPARAMS]; + Uint16 co_TPDO4_numOfBits[TPDO4NUMOFPARAMS]; + Uint16 co_TPDO5_numOfBits[TPDO5NUMOFPARAMS]; + Uint16 co_TPDO6_numOfBits[TPDO6NUMOFPARAMS]; + Uint16 co_TPDO7_numOfBits[TPDO7NUMOFPARAMS]; + Uint16 co_TPDO8_numOfBits[TPDO8NUMOFPARAMS]; + + //данные для работы с энергонезависимой памятью + T_UserMemoryContext UM; + + Uint16 ParamRestorationError; + Uint16 co_requestCANInit; + Uint16 co_callbackTag; //передается в колбэк функции драйвера (соответствует 1 для 1го CAN и 2 для 2го CAN) + Uint32 ISRDroppingCounter; + //данные из coodedit-а + //Uint16 co_numOfInd; + int16* OD_TBL1; + Uint16* OD_TBL2; + int32* OD_TBL3; + Uint16* TYPE_DEF_TABLE; + int32* OD_CALLBACK_TBL; + + Uint16 co_SPIrange1rw; + Uint16 co_SPIrange1rwCRC; + Uint16 co_SPIrange1rwp; + Uint16 co_SPIrange1rwpCRC; + Uint16 co_SPIrange1rwps; + Uint16 co_SPIrange1rwpsCRC; + Uint16 co_SPIrange2rw; + Uint16 co_SPIrange2rwCRC; + Uint16 co_SPIrange2rwp; + Uint16 co_SPIrange2rwpCRC; + Uint16 co_SPIrange2rwps; + Uint16 co_SPIrange2rwpsCRC; + Uint16 co_SPIrange3rw; + Uint16 co_SPIrange3rwCRC; + Uint16 co_SPIrange3rwp; + Uint16 co_SPIrange3rwpCRC; + Uint16 co_SPIrange3rwps; + Uint16 co_SPIrange3rwpsCRC; + Uint16 co_SPIrange4rw; + Uint16 co_SPIrange4rwCRC; + Uint16 co_SPIrange4rwp; + Uint16 co_SPIrange4rwpCRC; + Uint16 co_SPIrange4rwps; + Uint16 co_SPIrange4rwpsCRC; + Uint16 co_SPIrange5rw; + Uint16 co_SPIrange5rwCRC; + Uint16 co_SPIrange5rwp; + Uint16 co_SPIrange5rwpCRC; + Uint16 co_SPIrange5rwps; + Uint16 co_SPIrange5rwpsCRC; + Uint16 co_first1000; + Uint16 co_first2000; + Uint16 co_first3000; + Uint16 co_first4000; + Uint16 co_first5000; + //указатели для работы с регистрами и функциями, привязанными к аппаратной части + _CAN_Node_TypeDef* CAN_NODE_REGS; + CAN_TypeDef* CAN_REGS; + Uint16 CAN_NODE_MO_OFFSET; + Uint16 CAN_NODE_LIST; + Uint16 CAN_MO_ISR_LINE; + Uint16 CAN_NVIC_ISR_LINE; + void (*GpioInit)(); + void (*CANINTDisable)(); + void (*CANINTEnable)(); + TBlockTransfer* BT; //указатель делаем чтоб легко инициализировать структуру TBlockTransfer + T_CANOPEN_DRV_SETTINGS settings; +}; + +typedef volatile struct SCo_OdVars TCo_OdVars; + +extern TCo_OdVars co1_vars; +extern TCo_OdVars co2_vars; +extern TBlockTransfer CAN1BlockTransfer; +extern TBlockTransfer CAN2BlockTransfer; + +//*************************************************************************************************************************************************** +#ifdef __cplusplus +} +#endif +#endif + + + +/*@}*/ + diff --git a/Vinclude/cood1.h b/Vinclude/cood1.h new file mode 100644 index 0000000..31bbdce --- /dev/null +++ b/Vinclude/cood1.h @@ -0,0 +1,78 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file cood2.h + \brief Объявляет некоторые служебные переменные, соторые должны быть определены в cood2.c + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 2017_01_25 + + @{ +*/ + +#include "DSP.h" + +//******************************************************************************************************** +//глобальные переменные 1-го CAN-а +extern int16 const CO1_OD_TBL1[]; +extern Uint16 const CO1_OD_TBL2[]; +extern long const CO1_OD_TBL3[]; +extern Uint16 const CO1_TYPE_DEF_TABLE[]; +extern long const CO1_OD_CALLBACK_TBL[]; + +extern Uint16 const co1_first1000; +extern Uint16 const co1_first2000; +extern Uint16 const co1_first3000; +extern Uint16 const co1_first4000; +extern Uint16 const co1_first5000; + +extern Uint16 const co1_SPIrange1rw; +extern Uint16 const co1_SPIrange1rwCRC; +extern Uint16 const co1_SPIrange1rwp; +extern Uint16 const co1_SPIrange1rwpCRC; +extern Uint16 const co1_SPIrange1rwps; +extern Uint16 const co1_SPIrange1rwpsCRC; + +extern Uint16 const co1_SPIrange2rw; +extern Uint16 const co1_SPIrange2rwCRC; +extern Uint16 const co1_SPIrange2rwp; +extern Uint16 const co1_SPIrange2rwpCRC; +extern Uint16 const co1_SPIrange2rwps; +extern Uint16 const co1_SPIrange2rwpsCRC; + +extern Uint16 const co1_SPIrange3rw; +extern Uint16 const co1_SPIrange3rwCRC; +extern Uint16 const co1_SPIrange3rwp; +extern Uint16 const co1_SPIrange3rwpCRC; +extern Uint16 const co1_SPIrange3rwps; +extern Uint16 const co1_SPIrange3rwpsCRC; + +extern Uint16 const co1_SPIrange4rw; +extern Uint16 const co1_SPIrange4rwCRC; +extern Uint16 const co1_SPIrange4rwp; +extern Uint16 const co1_SPIrange4rwpCRC; +extern Uint16 const co1_SPIrange4rwps; +extern Uint16 const co1_SPIrange4rwpsCRC; + +extern Uint16 const co1_SPIrange5rw; +extern Uint16 const co1_SPIrange5rwCRC; +extern Uint16 const co1_SPIrange5rwp; +extern Uint16 const co1_SPIrange5rwpCRC; +extern Uint16 const co1_SPIrange5rwps; +extern Uint16 const co1_SPIrange5rwpsCRC; + +extern Uint16 const co1_numOfInd; + +/*@}*/ + diff --git a/Vinclude/cood2.h b/Vinclude/cood2.h new file mode 100644 index 0000000..643813c --- /dev/null +++ b/Vinclude/cood2.h @@ -0,0 +1,78 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file cood2.h + \brief Объявляет некоторые служебные переменные, соторые должны быть определены в cood2.c + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 2017_01_25 + + @{ +*/ + +#include "DSP.h" + +//******************************************************************************************************** +//глобальные переменные 2-го CAN-а +extern int16 const CO2_OD_TBL1[]; +extern Uint16 const CO2_OD_TBL2[]; +extern long const CO2_OD_TBL3[]; +extern Uint16 const CO2_TYPE_DEF_TABLE[]; +extern long const CO2_OD_CALLBACK_TBL[]; + +extern Uint16 const co2_first1000; +extern Uint16 const co2_first2000; +extern Uint16 const co2_first3000; +extern Uint16 const co2_first4000; +extern Uint16 const co2_first5000; + +extern Uint16 const co2_SPIrange1rw; +extern Uint16 const co2_SPIrange1rwCRC; +extern Uint16 const co2_SPIrange1rwp; +extern Uint16 const co2_SPIrange1rwpCRC; +extern Uint16 const co2_SPIrange1rwps; +extern Uint16 const co2_SPIrange1rwpsCRC; + +extern Uint16 const co2_SPIrange2rw; +extern Uint16 const co2_SPIrange2rwCRC; +extern Uint16 const co2_SPIrange2rwp; +extern Uint16 const co2_SPIrange2rwpCRC; +extern Uint16 const co2_SPIrange2rwps; +extern Uint16 const co2_SPIrange2rwpsCRC; + +extern Uint16 const co2_SPIrange3rw; +extern Uint16 const co2_SPIrange3rwCRC; +extern Uint16 const co2_SPIrange3rwp; +extern Uint16 const co2_SPIrange3rwpCRC; +extern Uint16 const co2_SPIrange3rwps; +extern Uint16 const co2_SPIrange3rwpsCRC; + +extern Uint16 const co2_SPIrange4rw; +extern Uint16 const co2_SPIrange4rwCRC; +extern Uint16 const co2_SPIrange4rwp; +extern Uint16 const co2_SPIrange4rwpCRC; +extern Uint16 const co2_SPIrange4rwps; +extern Uint16 const co2_SPIrange4rwpsCRC; + +extern Uint16 const co2_SPIrange5rw; +extern Uint16 const co2_SPIrange5rwCRC; +extern Uint16 const co2_SPIrange5rwp; +extern Uint16 const co2_SPIrange5rwpCRC; +extern Uint16 const co2_SPIrange5rwps; +extern Uint16 const co2_SPIrange5rwpsCRC; + +extern Uint16 const co2_numOfInd; + +/*@}*/ + diff --git a/Vinclude/filter.h b/Vinclude/filter.h new file mode 100644 index 0000000..96f94dd --- /dev/null +++ b/Vinclude/filter.h @@ -0,0 +1,74 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file filter.h + \brief Инерционное звено в IQ математике (см. TFilter) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup filter Инерционный фильтр (см. TFilter) + + @{ +*/ + + +#ifndef FILTER_H +#define FILTER_H + +#ifdef __cplusplus +extern "C" +{ +#endif + + +/*! \class TFilter + \brief Инерционное звено в IQ математике + + Класс \a TFilter, основанный на структуре SFilter, представляет из себя + инерционное звено в терминах ТАУ, а именно W(p)=1/(Tfiltra*p+1). + Обычно оно используется в качестве инерционно фильтра, на вход которого + подается зашумленный сигнал, а на выходе оказывается отфильтрованный.*/ + +//! см. TFilter + struct SFilter + { + long input;//! Вход + long output;//! Выход + long T; //! T=Ts/Tfiltra где - Tfiltra постоянная времени фильтра + void (*calc)(volatile struct SFilter*);//указатель на функцию расчета + }; + + typedef volatile struct SFilter TFilter; + + //! инициализатор по-умолчанию +#define FILTER_DEFAULTS {0,0,_IQ(0.01), \ + TFilter_Calc} + + //! \memberof TFilter +void TFilter_Calc(TFilter*); + +#ifdef __cplusplus +} +#endif + + +#endif + +/*@}*/ + + + + + diff --git a/Vinclude/ipark.h b/Vinclude/ipark.h new file mode 100644 index 0000000..065236f --- /dev/null +++ b/Vinclude/ipark.h @@ -0,0 +1,69 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file ipark.h + \brief Модуль инверсных координатных преобразований координат (см. TIPark) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup IPark Инверсные координатные преобразования (см. TIPark) + @{ +*/ + +#ifndef IPARK_H +#define IPARK_H + +#ifdef __cplusplus +extern "C" { +#endif + + /*! \class TIPark + \brief Инверсные координатные преобразования + + Класс \a TIPark, основанный на структуре SIPark, обеспечивает + поворот вектора, заданного в ортогональных осях, на требуемый угол + поворота ang. Инверсия заключается в обратном угле поворота по сравнению + с модулем TPark.*/ + +//! см. TIPark +struct SIPark{ _iq ds;//!< Output: stationary d-axis stator variable + _iq qs;//!< Output: stationary q-axis stator variable + _iq ang;//!< Input: rotating angle (pu) + _iq de;//!< Input: rotating d-axis stator variable + _iq qe;//!< Input: rotating q-axis stator variable + void (*calc)(struct SIPark*); //!< Pointer to calculation function + }; + +typedef struct SIPark TIPark; + + //! инициализатор по-умолчанию +#define IPARK_DEFAULTS { 0, \ + 0, \ + 0, \ + 0, \ + 0, \ + ipark_calc } + + //! \memberof TIPark +void ipark_calc(TIPark*); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ + diff --git a/Vinclude/main.h b/Vinclude/main.h new file mode 100644 index 0000000..94f2d37 --- /dev/null +++ b/Vinclude/main.h @@ -0,0 +1,227 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file main.h + \brief Главный заголовочный файл проекта. +Подключает в себе все заголовочные файлы всех модулей, +Содержит объявления (extern) всех наиболее важных +глобальных структур и переменных. + + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup MAIN Главный файл проекта + +@{*/ + +#ifndef MAIN_H +#define MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + + +#include "DSP.h" +#include "build.h" +#include "V_common.h" +#include //для labs +#include "V_IQmath.h" +#include "SM_Sys.h" +#include "SM_Net.h" +#include "co_ODvars.h" +#include "CANOpen_drv.h" +#include "V_data_log.h" +#include "SM_Protect.h" +#include "V_bits_to_enum_numbers.h" +#include "SM_Ctrl.h" +#include "SM_CmdLogic.h" +#include "V_RTC_Clock.h" +#include "clarke.h" +#include "park.h" +#include "ipark.h" +#include "V_pid_reg3.h" +#include "V_pid_reg3_pos.h" +#include "V_rmp_ctrl.h" +#include "V_adc.h" +#include "V_PWM_Module.h" +#include "V_CurPar.h" +#include "V_hzprof.h" +#include "V_DPR_eCAP.h" +#include "V_QEP.h" +#include "V_led.h" +#include "DRV8301_SPI.h" +#include "V_AutoOffset.h" +#include "V_CANtoRS.h" +#include "V_SSI_Encoder.h" +#include "V_MotorModel.h" +#include "V_UserMemory.h" +#include "V_rotor_observer.h" +#include "V_relay_reg.h" +#include "V_ModBus.h" +#include "V_MBVarsConv.h" +#include "V_excitation.h" +#include "X_CANFlashProgData.h" +#include "X_CANFlashProgStarter.h" +#include "CANBlockTransferInterface.h" +#include "DRV_INTERFACE.h" +#include "V_event_log.h" +#include "Global_time.h" +#include "V_UdControl.h" +#include "V_DIO.h" +#include "V_fifo.h" +#include "V_usblib.h" +#include "V_Fan.h" +#include "V_watchdog.h" +#include "V_TMU.h" + +extern TClarke clarke; +#if defined (PARK_IPARK_IQMATH) +extern TPark park; +extern TIPark ipark; +#elif defined (PARK_IPARK_TMU) +extern TTMUPark park; +extern TTMUIPark ipark; +#endif +extern TPidReg3 pid_id; +extern TPidReg3 pid_iq; +extern TPidReg3 pid_ia; +extern TPidReg3 pid_spd; +extern TPidReg3_pos pid_pos; +extern TRelayReg i_a_reg; +extern TRelayReg i_b_reg; +extern TRelayReg i_c_reg; +extern TSM_Sys sm_sys; +extern Uint16 disp_group_number; +extern TDataLog dlog; +extern TSM_Protect sm_prot; +extern TCmd cmd; +extern TDrvStatus drv_status; +extern TBitsToEnumNums pult_faults_lister; +extern TSM_Ctrl sm_ctrl; +extern TSM_CmdLogic sm_cmd_logic; +extern TRefs refs; +extern TSM_Net sm_net; +extern TRMPCtrl rmp; +extern TDrvParams drv_params; +extern TAdcDrv adc; +extern TPWM_Module pwm; +extern TCurPar cur_par; +extern TVhzProf vhz; +extern TDPReCAP DPReCAP; +extern TposspeedEqep posspeedEqep; +extern TRTCClock RTCclock; +extern TAutoOffset AutoOffset; +extern TSSI_Encoder SSI_Encoder; +extern TMotorModel model; +extern Tmotor motor; +extern TRotorObserver RotorObserver; +extern TCANtoRS CANtoRS; +extern TModBus ModBus; +extern TMBVarsConv MBVarsConv; +extern Texcitation pwm_ex; +extern TDrvInterface drv_interface; +extern TLogger FaultLog; +extern TGlobalTime global_time; +extern TUdControl udControl; +extern TFanControl FanControl; +extern TTMU tmu; + +extern Uint16 msCounter; +extern Uint16 FastCounter; +extern Uint16 LoopCounter; +extern Uint16 TIsr10; +extern Uint16 TIsr1; +extern int drv_status_code; +extern Uint32 VendorToken; + +volatile extern long Debug1; +volatile extern long Debug2; +volatile extern Uint16 Debug3; +volatile extern Uint16 Debug4; +volatile extern long DebugW1; +volatile extern long DebugW2; +volatile extern long DebugW3; +volatile extern long DebugW4; +volatile extern float DebugF1; +volatile extern float DebugF2; +volatile extern float DebugF3; +volatile extern float DebugF4; + +//Счетчики прерываний модуля захвата +extern Uint16 CounterCAP_isr; +extern Uint16 cap0_counter; +extern Uint16 cap1_counter; +extern Uint16 cap2_counter; + +extern unsigned long CpuTimerIsr1; +extern TSysSwitches sw; + +extern TUserMemory UserMem; +extern Tled leds; +extern Tdrv8301interface drv8301; +extern TCanBTInterface Can1BTInterface; +extern TCanBTInterface Can2BTInterface; +extern TCANSpeedTableOptions canSpeedTable; + +void callback_dlog(Uint16 par, Uint16 tag_CANnum); +void callback_RTC(Uint16 par, Uint16 tag_CANnum); + +// Объявление ISR-ов. В CodeMaster-ском и GCC-шном стартапе они назиываются по-разному +#if defined (__GNUC__) +void TIM1_IRQHandler(void); +void TIM0_IRQHandler(void); +void EPWM_TZ_0_IRQHandler(void); +void ECAP0_IRQHandler(void); +void ECAP1_IRQHandler(void); +void ECAP2_IRQHandler(void); +void EQEP1_IRQHandler(void); +#elif defined (__CMCPPARM__) +void TIM1_IRQHandler(void); +void TIM0_IRQHandler(void); +void PWM0_TZ_IRQHandler(void); +void CAP0_IRQHandler(void); +void CAP1_IRQHandler(void); +void CAP2_IRQHandler(void); +void QEP1_IRQHandler(void); +#endif + +#if defined(TRUE) && (TRUE != 1) +#error "TRUE previously defined not equal to 1" +#endif +#if defined(FALSE) && (FALSE != 0) +#error "FALSE previously defined not equal to 0" +#endif +#ifndef TRUE +#define TRUE (1) +#endif +#ifndef FALSE +#define FALSE (0) +#endif + +// Функция ограничения переменной +inline float __fsat (float input, float max, float min) { + if (input > max) return max; + else if (input < min) return min; + else return input; +} + +#ifdef __cplusplus +} +#endif + +#endif +/*@}*/ + diff --git a/Vinclude/mbod.h b/Vinclude/mbod.h new file mode 100644 index 0000000..410a919 --- /dev/null +++ b/Vinclude/mbod.h @@ -0,0 +1,44 @@ +/* Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \author ООО "НПФ Вектор". http://motorcontrol.ru +*/ + +#ifndef MBOD_H +#define MBOD_H + +#include "DSP.h" + + + +#define MB_VAR_WRITE 1 // признак записи в ModBus-переменную +#define MB_VAR_READ 2 // признак чтения из ModBus-переменной + +typedef struct +{ + Uint16 index; // ModBus-адрес + Uint16 type_or_acc; // номер бита для битовых переменных или признак записи/чтения + // для HR/IR-переменных (должен сбрасываться пользователем): + // 1 - произошла запись + // 2 - произошло чтение + Uint32 addr; // адрес переменной в контроллере +} MB_Record; + +extern volatile MB_Record mbodHR[]; +extern volatile MB_Record mbodIR[]; +extern volatile MB_Record mbodC[]; +extern volatile MB_Record mbodDI[]; + +#endif + diff --git a/Vinclude/park.h b/Vinclude/park.h new file mode 100644 index 0000000..669f627 --- /dev/null +++ b/Vinclude/park.h @@ -0,0 +1,68 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file park.h + \brief Модуль координатных преобразований координат (см. TPark) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \defgroup Park Координатные преобразования (см. TPark) + @{ +*/ +#ifndef PARK_H +#define PARK_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "V_IQmath.h" + + /*! \class TPark + \brief Координатные преобразования + + Класс \a TPark, основанный на структуре SPark, обеспечивает + поворот вектора (ds,qs), заданного в ортогональных осях, на требуемый угол + поворота ang. Выходной повернутый вектор сохраняется в переменных de,qe. */ + +//! см. TPark +struct SPark{ _iq ds; //!< Input: stationary d-axis stator variable + _iq qs; //!< Input: stationary q-axis stator variable + _iq ang; //!< Input: rotating angle (pu) + _iq de; //!< Output: rotating d-axis stator variable + _iq qe; //!< Output: rotating q-axis stator variable + void (*calc)(volatile struct SPark*);//!< Pointer to calculation function + }; + +typedef volatile struct SPark TPark; + +//! инициализатор по-умолчанию +#define PARK_DEFAULTS { 0, \ + 0, \ + 0, \ + 0, \ + 0, \ + park_calc } + + //! \memberof TPark +void park_calc(TPark*); + +#ifdef __cplusplus +} +#endif + +#endif + +/*@}*/ diff --git a/Vsrc/CANBlockTransferInterface.c b/Vsrc/CANBlockTransferInterface.c new file mode 100644 index 0000000..8907f47 --- /dev/null +++ b/Vsrc/CANBlockTransferInterface.c @@ -0,0 +1,250 @@ +/* ================================================================================== + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + +//File name: CANBlockTransferInterface.c +// +//Originator: Aliamkin Dmitry I +// +//Description: все взаимодействия с блочной передачей по CAN осуществляются + в ДА данного файла +//ПРИМЕЧАНИЕ: +//===================================================================================== +//------------------------------------------------------------------------------------- + 01.09.2016 Release Rev 1.05 + Стэйт CAN прошиватора частично перенесен в фон для правильного перехода в другой проект (актуально для M4F) + 20.09.2012 Release Rev 1.04 + Добавил автоматическое освобождение инетрпретатора при простое в CANBT_INTERFACE_BUSY более 5 секунд + 20.09.2012 Release Rev 1.03 + Правильнее сделан выход из состояния CANBT_INTERFACE_DATALOG + 19.09.2012 Release Rev 1.02 + Добавлена поддержка скачки каналов даталоггера через блочную передачу +// 26.12.2011 Release Rev 1.01 +//----------------------------------------------------------------------------------*/ +#include "DSP.h" +#include "main.h" +#include "co_ODvars.h" +#include "CANOpen_drv.h" +#include "CANBlockTransferInterface.h" + +void SMCanBTInterface_ms(volatile struct SCanBTInterface* p, Uint32 time, TCo_OdVars* co_ptr) +{ + //отдельную функцию для инициализации не делаем, т.к. неизвестно, что пользователь раньше вызовет + //инит CANOpen-а или данного модуля, что делает поведение автомата непредсказуемым из-за того, что + //в SPI может быть что-то сохранено (например прожиг по CAN :)) + if(p->alreadyInit == 0) + { + co_ptr->co_blockTransferCommand = CANBT_INTERFACE_FREE; + p->time_prev = time; + p->alreadyInit = 1; + } + //считаем дискретный автомат + p->state_shadow = co_ptr->co_blockTransferCommand; //копируем переменную состояния, так как state может быть изменен извне внезапно + //далее всё анализируем по state_shadow + if (p->state_prev!=p->state_shadow) + { + p->E=1;//флаг первого вхождения (E - ENTRY) + p->state_time = 0; + } + else + p->E=0; + p->state_prev=p->state_shadow; + + //время нахождения в текущем состоянии + p->state_time += p->time_prev - time; + p->time_prev = time; + + switch (p->state_shadow)//в зависимости от состояния: + { + case CANBT_INTERFACE_FREE: + { + if (p->E) + { + //ENTRY + } + break; + } + case CANBT_INTERFACE_BUSY: + { + if (p->E) + { + //ENTRY + } + //если находимся в занятом состоянии слишком долго, значит кто то просто забыл очистить инетрпертатор + if(p->state_time > (150000*5000)) //5 секунд + co_ptr->co_blockTransferCommand = CANBT_INTERFACE_FREE; + break; + } + case CANBT_INTERFACE_FLASH_PROG: + {//кейз в мс нужен чтобы не попадать в данном свиче в default: + if (p->E) + { + //ENTRY + } + + //останавливаем управление ключами + FP_BLOCK_PWM; + //попутно непрерывно сбрасываем sm_ctrl и выставляем аварию, чтоб уж наверняка все стояло + FP_CTRL_STOP; + FP_FAULT_SET; + + //переход в прошивальщик будет выполнен в слоу калке. + + break; + } + case CANBT_INTERFACE_DATALOG1: + { + if (p->E) + { + // Копируем данные из массива осциллограммы в массив для отправки со смещением. +#if DLOG_DATA_SIZE == 16 + //DINT; + //Uint32 t0 = CpuTimer2Regs.TIM.all; + /* + // 'memcpy' копирует 16-битными словами, что позволяет использовать и нечётные значения + // 'dlog.first_point_written', но это работает медленнее, чем вариант с циклом 'for' + // (см. ниже) где копируются 32-битные слова. + size_t n = 256 - dlog.first_point_written; + memcpy((void*)&dlog.upload_buff[0], + (void*)&dlog.buff[dlog.first_point_written + (dlog.buff_num << 8)], n); + memcpy((void*)&dlog.upload_buff[n], + (void*)&dlog.buff[dlog.buff_num << 8], dlog.first_point_written); + //Uint32 t1 = t0 - CpuTimer2Regs.TIM.all; + */ + //t0 = CpuTimer2Regs.TIM.all; + Uint32* CopyPtrFrom = (Uint32*)(&dlog.buff[dlog.first_point_written + (dlog.buff_num << 8)]); + Uint32* CopyPtrTo = (Uint32*)(&dlog.upload_buff[0]); + for (register int i = 128 - (dlog.first_point_written >> 1); i > 0; i--) + *CopyPtrTo++ = *CopyPtrFrom++; + CopyPtrFrom = (Uint32*)(&dlog.buff[dlog.buff_num << 8]); //указатель массива-источника переносим на начало, для массива-приемника он и так, где надо + for (register int i = dlog.first_point_written >> 1; i > 0; i--) + *CopyPtrTo++ = *CopyPtrFrom++; + //Uint32 t2 = t0 - CpuTimer2Regs.TIM.all; + //EINT; +#endif +#if DLOG_DATA_SIZE == 32 + //DINT; + //Uint32 t0 = CpuTimer2Regs.TIM.all; + Uint32* CopyPtrFrom = (Uint32*)(&dlog.buff[dlog.first_point_written + (dlog.buff_num << 8)]); + Uint32* CopyPtrTo = (Uint32*)(&dlog.upload_buff[0]); + for (register int i = 256 - dlog.first_point_written; i > 0; i--) + *CopyPtrTo++ = *CopyPtrFrom++; + CopyPtrFrom = (Uint32*)(&dlog.buff[dlog.buff_num << 8]); + for (register int i = dlog.first_point_written; i > 0; i--) + *CopyPtrTo++ = *CopyPtrFrom++; + //Uint32 t1 = t0 - CpuTimer2Regs.TIM.all; + //EINT; +#endif + CANBlockTransferInitTX(co_ptr, 256, (Uint16*)&dlog.upload_buff[0]); + } + + // Если ДА блочной передачи освободился, освобождаем и интерфейс. + if (co_ptr->BT->tx_status != CANBT_STATUS_BUSY) + { + co_ptr->co_blockTransferCommand = CANBT_INTERFACE_FREE; + } + break; + } +#if DLOG_DATA_SIZE == 32 + case CANBT_INTERFACE_DATALOG2: + { + if (p->E) + { + // Инициируем передачу второй половины буфера даталоггера. + CANBlockTransferInitTX(co_ptr, 256, (Uint16*)&dlog.upload_buff[128]); + } + // Если ДА блочной передачи освободился, освобождаем и интерфейс. + if (co_ptr->BT->tx_status != CANBT_STATUS_BUSY) + { + co_ptr->co_blockTransferCommand = CANBT_INTERFACE_FREE; + } + break; + } +#endif + default: + co_ptr->co_blockTransferCommand = CANBT_INTERFACE_FREE; + } +} + +void SMCanBTInterface_slow(volatile struct SCanBTInterface* p) +{ + //считаем дискретный автомат + switch (p->state_shadow)//в зависимости от состоЯниЯ: + { + case CANBT_INTERFACE_FLASH_PROG: + { + if (p->E) + { + //ENTRY + } + + //останавливаем управление ключами + FP_BLOCK_PWM; + //попутно непрерывно сбрасываем sm_ctrl и выставлЯем аварию, чтоб уж навернЯка все стоЯло + FP_CTRL_STOP; + FP_FAULT_SET; + + //ждем маленько (100мс), чтоб все ДА одуплились и идем в прожиг + if(p->state_time > (150000*100)) + StartFlashProgrammer(); + + break; + } + } +} + +//колбэк для блочной передачи описан тут, чтобы избавить пользователя от них +void callback_BTcmd(Uint16 par, Uint16 tag_CANnum) +{ + #ifdef CAN_1_ENABLE + if(tag_CANnum == 1) + { + if(par==0) + { + if(co1_vars.co_blockTransferCommand == 0) + co1_vars.co_blockTransferCommand = 0x8000; + } + if(par==1) + { + if(co1_vars.co_blockTransferCommand == 1) + { //по 1-му CANу хотят прошиваться, отразим это в настройках прошивальщика + FPsettings.CANa_enable = 1; + FPsettings.CANb_enable = 0; + + } + } + } + #endif + + #ifdef CAN_2_ENABLE + if(tag_CANnum == 2) + { + if(par==0) + { + if(co2_vars.co_blockTransferCommand == 0) + co2_vars.co_blockTransferCommand = 0x8000; + } + if(par==1) + { + if(co2_vars.co_blockTransferCommand == 1) + { //по 2-му CANу хотят прошиваться, отразим это в настройках прошивальщика + FPsettings.CANb_enable = 1; + FPsettings.CANa_enable = 0; + } + } + } + #endif +} + + diff --git a/Vsrc/CANOpenUDfuncs.c b/Vsrc/CANOpenUDfuncs.c new file mode 100644 index 0000000..842214a --- /dev/null +++ b/Vsrc/CANOpenUDfuncs.c @@ -0,0 +1,406 @@ +/* ================================================================================== + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + +//File name: CANOpenUDfuncs.c + +//Description: В файл вынесены функции драйвера CANOpen определяемые пользователем (колбэк функции, функции инициализации и т.п.) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 2017_02_08 + +//=====================================================================================*/ +#include "DSP.h" +#include "co_ODvars.h" +#include "CANOpen_drv.h" +#include "main.h" + +//! Таблица с настройками скоростей CAN для микроконтроллеров фирмы НИИЭТ. Раскомментить нужное. + +// Вносить изменениЯ в нижеописанные переменные и массивы ЗАПРЕЩЕНО!!! + +//! Микроконтроллер К1921ВК01Т +/* +// kb/s: 125 50 125 250 500 1000 +TCANSpeedTableOptions canSpeedTable = { {1, 1, 1, 0, 0, 0 }, \ + {9, 24, 9, 39, 19, 9 }, \ + {6, 6, 6, 6, 6, 6 }, \ + {1, 1, 1, 1, 1, 1 }, \ + {1, 1, 1, 1, 1 , 1 }, \ + }; +// ^- настройка на 125, т.к. 10 kb/s не реализуемо +*/ +//! Микроконтроллер К1921ВК028 +// kb/s: 125 50 125 250 500 1000 +TCANSpeedTableOptions canSpeedTable = { {1, 1, 1, 1, 0, 0 }, \ + {19, 49, 19, 9, 39, 19}, \ + {6, 6, 6, 6, 6, 6 }, \ + {1, 1, 1, 1, 1, 1 }, \ + {1, 1, 1, 1, 1 , 1 }, \ + }; +// ^- настройка на 125, т.к. 10 kb/s не реализуемо +//! Микроконтроллер К1921ВК035 +/* +// kb/s: 125 50 125 250 500 1000 +TCANSpeedTableOptions canSpeedTable = { {1, 1, 1, 0, 0, 0 }, \ + {9, 24, 9, 39, 19, 9 }, \ + {6, 6, 6, 6, 6, 6 }, \ + {1, 1, 1, 1, 1, 1 }, \ + {1, 1, 1, 1, 1 , 1 }, \ + }; +// ^- настройка на 125, т.к. 10 kb/s не реализуемо +*/ + +//********************************************************************************************************************************************************************************************************** +//функция инициализации Gpio CAN1 +#ifdef CAN_1_ENABLE +void co_CAN1GpioInit() +{ +#ifdef HW_MOTORCONTROLBOARD + // CAN0: C12 / C13 + GPIOC->ALTFUNCNUM1_bit.PIN12 = 1; // CAN0_TX + GPIOC->ALTFUNCNUM1_bit.PIN13 = 1; // CAN0_RX + GPIOC->ALTFUNCSET = GPIO_PIN_12 | GPIO_PIN_13; +#endif + +#ifdef HW_VECTORCARD_SIMULATOR + // CAN0: C12 / C13 + GPIOC->ALTFUNCNUM1_bit.PIN12 = 1; // CAN0_TX + GPIOC->ALTFUNCNUM1_bit.PIN13 = 1; // CAN0_RX + GPIOC->ALTFUNCSET = GPIO_PIN_12 | GPIO_PIN_13; +#endif +} +#endif //CAN_1_ENABLE + +//функция инициализации Gpio CAN2 +#ifdef CAN_2_ENABLE +void co_CAN2GpioInit() +{ +#ifdef HW_MOTORCONTROLBOARD + // CAN1: C14 / C15 + GPIOC->ALTFUNCNUM1_bit.PIN14 = 1; // CAN0_TX + GPIOC->ALTFUNCNUM1_bit.PIN15 = 1; // CAN0_RX + GPIOC->ALTFUNCSET = GPIO_PIN_14 | GPIO_PIN_15; +#endif + +#ifdef HW_VECTORCARD_SIMULATOR + // CAN1: C14 / C15 + GPIOC->ALTFUNCNUM1_bit.PIN14 = 1; // CAN0_TX + GPIOC->ALTFUNCNUM1_bit.PIN15 = 1; // CAN0_RX + GPIOC->ALTFUNCSET = GPIO_PIN_14 | GPIO_PIN_15; +#endif +} +#endif //CAN_2_ENABLE +//********************************************************************************************************************************************************************************************************** +//Функции работы с энергонезависимой памятью (в качестве памяти может использоваться как пользовательская флэш на борту MCU, +// так и внешне подключаемая, например через SPI, eeprom). +//Функции используются драйвером CANopen при сохранении и восстановлении параметров словаря объектов +//С точки зрения драйвера CANOpen функции реализуют побайтовое чтение и запись из/в ЭнОЗУ +void co_UserMemoryRead (const T_UserMemoryContext *p) +{ + UserMem.MemStartAddr = p->MemStartAddr; + UserMem.MCUStartAddr = p->MCUStartAddr; + UserMem.data_length = p->data_length; + UserMem.read(&UserMem); +} + +void co_UserMemoryWrite (const T_UserMemoryContext *p) +{ + UserMem.MemStartAddr = p->MemStartAddr; + UserMem.MCUStartAddr = p->MCUStartAddr; + UserMem.data_length = p->data_length; + UserMem.write(&UserMem); +} +//********************************************************************************************************************************************************************************************************** + +//функция, которая вызывается драйвером CANOpen при необходимости отправки CAN сообщения во внешний интерфейс +//внутрь функции пользователем должен быть вставлен вызов соответствующей функции, осуществляющей передачу CAN пакета +void co_CANToExtInterface_Send(TZCanMsg* MSG, Uint16 tag_CANnum) +{ + CANtoRS.write(MSG,&CANtoRS); +} + + + +//колбэки по приему PDO +void co_RPDO1_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + case 2: + { + PDO_cntr2++; + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO2_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO3_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO4_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO5_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO6_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO7_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + +void co_RPDO8_Callback(Uint16 nodeID, Uint16 tag_CANnum) +{ + /* + switch(nodeID) + { + case 1: + { + //обрабатываем как-нибудь... + break; + } + default: + break; + } + */ +} + + + +//!Обращение по CANopen к часам реального времени. + +//!Если происходит запись в параметр [5139h.01h] Текущ. знач.Часы реального времени, +//то вызывается callback_RTC - там устанавливается запрос на коррекцию часов. + +void callback_RTC(Uint16 par, Uint16 tag_CANnum) { + if (par == 1) { + RTCclock.setTimeFlag = 1; //произошла запись в часы + + } +} + +//!Обращение к переменной dlog.next_value_var с данными цифрового осциллографа. + +//!Существует специальный интерфейс, позволяющий автоматизировать считывание оссциллографируемых переменных +//!модуля TDataLog. Эта функция вызывается при обращении к переменной, через которую возможно считать записанные +//!осциллограммы. Запись в эту переменную устанавливает требуемый номер буфера (один и 4х) и номер извлекаемой точки. +//!При чтении же в эту переменную выдвигатются сами отосциллограффированные данные. + +void callback_dlog(Uint16 par, Uint16 tag_CANnum) { + //если запись, то установим буфер на нужную точку + if (par == 1) { + //в переменную next_value_var записываетсЯ желаемое смещение, номер буфера, из которого хотим читать, + //а так же разреживание + dlog.buff_num = (long)((dlog.next_value_var >> 24) & 3); //извлекаетсЯ номер буфера +#if DLOG_DATA_SIZE == 32 + dlog.highPartOfValue = (int)((dlog.next_value_var >> 26) & 1); // отдавать старшую часть 32-битного значения? +#endif + dlog.Rcounter = (dlog.next_value_var >> 16) & 0xFF; //какую точку надо отдавать + + //проверЯем хотЯт ли использовать блочную передачу + if ((dlog.next_value_var & 0xffff) == 1) { + //хотЯт, говорим об этом интерфейсу блочной передачи +#ifdef CAN_1_ENABLE + if (co1_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE) + co1_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG1; +#endif +#ifdef CAN_2_ENABLE + if (co2_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE) + co2_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG1; +#endif + } +#if DLOG_DATA_SIZE == 32 + if ((dlog.next_value_var & 0xffff) == 2) { +#ifdef CAN_1_ENABLE + if (co1_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE) + co1_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG2; +#endif +#ifdef CAN_2_ENABLE + if (co2_vars.co_blockTransferCommand == CANBT_INTERFACE_FREE) + co2_vars.co_blockTransferCommand = CANBT_INTERFACE_DATALOG2; +#endif + } +#endif // DLOG_DATA_SIZE == 32 + + } + + //выдвигаем данные: +#if DLOG_DATA_SIZE == 16 + switch (dlog.buff_num) { //текущий номер буфера + case 0: { + dlog.next_value_var = dlog.dl_buffer1_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + break; + } + case 1: { + dlog.next_value_var = dlog.dl_buffer2_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + break; + } + case 2: { + dlog.next_value_var = dlog.dl_buffer3_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + break; + } + case 3: { + dlog.next_value_var = dlog.dl_buffer4_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + break; + } + default: { //если в buff_num что-то не то, по-дефолту пусть первый буфер + dlog.next_value_var = dlog.dl_buffer1_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + break; + } + } + //данные только в нижней части + dlog.next_value_var &= 0xFFFF; + dlog.next_value_var |= (((unsigned long) dlog.Rcounter) << 16); //в верхней части слова Rcounter длЯ контролЯ + dlog.next_value_var |= (((unsigned long) dlog.buff_num) << 24); //в верхней части слова (еще выше) buff_num длЯ контролЯ + + dlog.Rcounter++; //какую точку отдаем. инкрементируетсЯ само после чтениЯ текущей точки. + dlog.Rcounter &= 0xFF; //по кругу. ничего страшного, перед чтением обнулЯю. см. запись +#endif +#if DLOG_DATA_SIZE == 32 + int32 val32; + int varSizeIs16; + switch (dlog.buff_num) { //текущий номер буфера + default: + case 0: { + val32 = dlog.dl_buffer1_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + varSizeIs16 = (int)(dlog.object1Info.varSize == 16); + break; + } + case 1: { + val32 = dlog.dl_buffer2_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + varSizeIs16 = (int)(dlog.object2Info.varSize == 16); + break; + } + case 2: { + val32 = dlog.dl_buffer3_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + varSizeIs16 = (int)(dlog.object3Info.varSize == 16); + break; + } + case 3: { + val32 = dlog.dl_buffer4_adr[(dlog.Rcounter + dlog.first_point_written) & 0xFF]; + varSizeIs16 = (int)(dlog.object4Info.varSize == 16); + break; + } + } + dlog.next_value_var = (dlog.highPartOfValue != 0 ? val32 >> 16 : val32) & 0x0000FFFF; + dlog.next_value_var |= ((Uint32)dlog.Rcounter) << 16; + dlog.next_value_var |= ((Uint32)dlog.buff_num) << 24; + dlog.next_value_var |= ((Uint32)dlog.highPartOfValue) << 26; + dlog.next_value_var |= ((Uint32)varSizeIs16) << 27; + + if ((dlog.highPartOfValue != 0) || varSizeIs16) + { + // При следующем запросе отдадим младшую часть следующей точки. + dlog.Rcounter++; + dlog.Rcounter &= 0xFF; + dlog.highPartOfValue = 0; + } + else + { + // При следующем запросе отдадим старшую часть этой же точки. + dlog.highPartOfValue = 1; + } +#endif +} diff --git a/Vsrc/DRV8301_SPI.c b/Vsrc/DRV8301_SPI.c new file mode 100644 index 0000000..12a30fe --- /dev/null +++ b/Vsrc/DRV8301_SPI.c @@ -0,0 +1,195 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file DRV8301_SPI.c + \brief Драйвер для драйвера ключей инвертора DRV8301 + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + \addtogroup drv8301interface + @{ + */ + +#include "DSP.h" +#include "main.h" + +void DRV8301_Interface_Init(Tdrv8301interface*p) { +#ifdef HW_VECTORCARD_DRV8301_EVM + volatile long delay; + volatile Uint32 tempREG; + + // Настройка ног SPI + NT_GPIOC->ALTFUNCSET = (1 << 8) | (1 << 9) | (1 << 10) | (1 << 11); + NT_COMMON_REG->GPIOPCTLC_bit.PIN8 = 1; + NT_COMMON_REG->GPIOPCTLC_bit.PIN9 = 1; + NT_COMMON_REG->GPIOPCTLC_bit.PIN10 = 1; + NT_COMMON_REG->GPIOPCTLC_bit.PIN11 = 1; + + // Настройка тактирования SSP модуля + // Всего 4 модуля, на каждый модуль по 8 бит из регистра SSP_CLK_CTRL и по два бита из UART_SSP_CLK_SEL + + // UART_SSP_CLK_SEL + // Во втором байте слова на каждый из 4-ёх модулей SSP отводится по два бита для выбора источника тактирования 0x0000XX00 + // "00" - в качестве иточника тактирования модуля SSP выбирается системная частота 100 МГц, таким образом f_SSP_IN = SysClk = 100 MHz + + // SSP_CLK_CTRL + // Младший бит разрешает тактирование (1 - разрешить) + // Второй бит разрешает деление частоты f_SSP_IN источника тактового сигнала (0 - не делить, 1 - делить) + // Старшие шесть выбирают делитель частоты этого исотчника: + // X - деление по формуле SSPclk = f_SSP_IN /( 2 * (X +1) ) + // Из документации на блок SSP - минимальная частота для работы модуля в режимах и мастер и слейв, + // f_SSP_IN > 22.12 MHz, поэтому 25 МГц сделаем + tempREG = NT_COMMON_REG->UART_SPI_CLK_SEL;// Через tempREG, чтобы не задеть другие биты, отвечающие за тактирование UART'a + tempREG &= 0xFFFF00FF; + NT_COMMON_REG->UART_SPI_CLK_SEL = tempREG; + NT_COMMON_REG->SPI_CLK = 0x07070707;// Разрешить тактирование, разрешить деление частоты, делить на 4 - 25 МГц + + // Настройка самого модуля SPI + // Продолжение настройки тактирования. + // Полученная ранее частота f_SSP_IN проходит ещё через два делителя. + // SSPCPSR - первый делитель, в диапазоне 2 ... 254, может быть только чётным (младший бит всегда хардварно равен 0) + // SSPCR0.bit.SCR - второй делитель от 0 до 255. + // Битрейт в итоге BitRate = f_SSP_IN / ( SSPCPSR * (SCR + 1) ) + + NT_SPI0->SPI_CR1 = 0;// Режим - мастер, LoopBack отключён, сам модуль SSP тоже отключён + NT_SPI0->SPI_IMSC = 0x0; // Запретить все прерывания + NT_SPI0->SPI_DMACR = 0; // Запретить DMA + NT_SPI0->SPI_ICR = 0x3; // Очистка прерываний ("переполнение FIFO приёма" и "необслуженное FIFO приёма") + + NT_SPI0->SPI_CPSR = 4; // Деление входной частоты на 4 -> 6,25 MHz + NT_SPI0->SPI_CR0_bit.DSS = 0xF; // Размер данных - 16 бит + NT_SPI0->SPI_CR0_bit.SCR = 0x3F; // Второй делитель = 15 -> f_SPI = 416 kHz + NT_SPI0->SPI_CR0_bit.FRF = 0x0; // Какая-то "фаза" для протокола Motorola SPI + NT_SPI0->SPI_CR0_bit.SPH = 0x1; // Какая-то "полярность" для протокола Motorola SPI + NT_SPI0->SPI_CR0_bit.SPO = 0x0; // Выбор формата кадра Motorola/TI/Microwire. "0" - по протоколу Motorola SPI + NT_SPI0->SPI_CR1_bit.SSE = 1; // Разрешить работу + + // Настройка ног для приёма аварий от DRV8301: С4 - Fault, C5 - OCTW + NT_GPIOC->ALTFUNCCLR = (1 << 4) | (1 << 5); + NT_GPIOC->OUTENCLR = (1 << 4) | (1 << 5); + + // Настройка ноги для включения DRV8301: G8 - EN_GATE + NT_GPIOG->ALTFUNCCLR = (1 << 8); + NT_GPIOG->OUTENSET |= (1 << 8); //через ИЛИ, чтобы не попортить остальные ног порта G + NT_GPIOG->DATA |= (1 << 8); //DATA.bit.GPIO8 = 1 + + // Выждать 10 мс перед настройкой + delay = 10000000; + while (delay > 0) + delay--; + + // Настройка самого DRV8301 + p->CTRL1.bit.GATE_CURRENT = 0; // full current 1.7A +// p->CTRL1.bit.GATE_CURRENT = 1; // med current 0.7A +// p->CTRL1.bit.GATE_CURRENT = 2; // min current 0.25A + p->CTRL1.bit.GATE_RESET = 0; // Normal Mode + p->CTRL1.bit.PWM_MODE = 0; // six independant PWMs +// p->CTRL1.bit.OC_MODE = 0; // current limiting when OC detected + p->CTRL1.bit.OC_MODE = 1; // latched OC shutdown +// p->CTRL1.bit.OC_MODE = 2; // Report on OCTWn pin and SPI reg only, no shut-down +// p->CTRL1.bit.OC_MODE = 3; // OC protection disabled +// p->CTRL1.bit.OC_ADJ_SET = 0; // OC @ Vds=0.060V +// p->CTRL1.bit.OC_ADJ_SET = 4; // OC @ Vds=0.097V +// p->CTRL1.bit.OC_ADJ_SET = 6; // OC @ Vds=0.123V +// p->CTRL1.bit.OC_ADJ_SET = 9; // OC @ Vds=0.175V + p->CTRL1.bit.OC_ADJ_SET = 15; // OC @ Vds=0.358V +// p->CTRL1.bit.OC_ADJ_SET = 16; // OC @ Vds=0.403V +// p->CTRL1.bit.OC_ADJ_SET = 17; // OC @ Vds=0.454V +// p->CTRL1.bit.OC_ADJ_SET = 18; // OC @ Vds=0.511V + p->CTRL1.bit.Reserved = 0; + +// p->CTRL2.bit.OCTW_SET = 0; // report OT and OC + p->CTRL2.bit.OCTW_SET = 1; // report OT only + +// p->CTRL2.bit.GAIN = 0; // CS amplifier gain = 10 + p->CTRL2.bit.GAIN = 1; // CS amplifier gain = 20 +// p->CTRL2.bit.GAIN = 2; // CS amplifier gain = 40 +// p->CTRL2.bit.GAIN = 3; // CS amplifier gain = 80 + + p->CTRL2.bit.DC_CAL_CH1 = 0; // not in CS calibrate mode + p->CTRL2.bit.DC_CAL_CH2 = 0; // not in CS calibrate mode + p->CTRL2.bit.OC_TOFF = 0; // normal mode + p->CTRL2.bit.Reserved = 0; + + // Запишем + + p->write(p, CNTRL_REG_1_ADDR); + p->write(p, CNTRL_REG_2_ADDR); + p->read(p); +#endif +} + +void DRV8301_Interface_Write(Tdrv8301interface*p, Uint16 reg) { +#ifdef HW_VECTORCARD_DRV8301_EVM + Uint16 trash; + + p->writeWord.bit.R_W = 0; //we are initiating a write + p->writeWord.bit.ADDRESS = reg; //load the address + + if (reg == CNTRL_REG_1_ADDR) + p->writeWord.bit.DATA = p->CTRL1.all; //data to be written; + else + p->writeWord.bit.DATA = p->CTRL2.all; + NT_SPI0->SPI_DR = p->writeWord.all; //send out the data + + while (NT_SPI0->SPI_SR_bit.BSY == 1) + ; //wait for the packet to complete + + trash = NT_SPI0->SPI_DR;//read returned value of Status Register 1 and clear the INT_FLAG bit +#endif +} + +void DRV8301_Interface_Read(Tdrv8301interface*p) { +#ifdef HW_VECTORCARD_DRV8301_EVM + Uint16 trash; + // Сначала говорим, что хотим читать первый регистр + p->writeWord.bit.R_W = 1; //we are initiating a read + p->writeWord.bit.ADDRESS = STAT_REG_1_ADDR; //load the address + p->writeWord.bit.DATA = 0; //dummy data; + + NT_SPI0->SPI_DR = p->writeWord.all; //send out the data + + while (NT_SPI0->SPI_SR_bit.BSY == 1) + ; //wait for the packet to complete + + // В это время DRV нам прислал мусор (хотя это не совсем так) + trash = NT_SPI0->SPI_DR; //dummy read to clear the INT_FLAG bit + + // Теперь говорим, что почитаем второй регистр + p->writeWord.bit.R_W = 1; //we are initiating a read + p->writeWord.bit.ADDRESS = STAT_REG_2_ADDR; //load the address + p->writeWord.bit.DATA = 0; //dummy data; + + NT_SPI0->SPI_DR = p->writeWord.all; //send out the data + + while (NT_SPI0->SPI_SR_bit.BSY == 1) + ; //wait for the packet to complete + + // В это время DRV нам прислал ответ на прошлый запрос - то есть содержимое первого регистра + p->STS1.all = NT_SPI0->SPI_DR; //dummy read to clear the INT_FLAG bit + + // Теперь говорим, что угодно + p->writeWord.bit.R_W = 1; //we are initiating a read + p->writeWord.bit.ADDRESS = STAT_REG_2_ADDR; //load the address + p->writeWord.bit.DATA = 0; //dummy data; + + NT_SPI0->SPI_DR = p->writeWord.all; //send out the data + + while (NT_SPI0->SPI_SR_bit.BSY == 1) + ; //wait for the packet to complete + + // В это время DRV нам прислал ответ на прошлый запрос - то есть содержимое второго регистра + p->STS2.all = NT_SPI0->SPI_DR; +#endif +} diff --git a/Vsrc/DRV_INTERFACE.c b/Vsrc/DRV_INTERFACE.c new file mode 100644 index 0000000..17ed2b8 --- /dev/null +++ b/Vsrc/DRV_INTERFACE.c @@ -0,0 +1,108 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file DRV_INTERFACE.c + \brief Через данные модуль обеспечиваетсЯ работа с банком аварий (чтение, очистка). + //ПредполагаетсЯ, что модуль может расширЯть функциональность (скачивать каие-то другие данные)... + //ПРИМЕЧАНИЕ для программиста: + 1.для команд работающих по сети с автоматизированными системами (Юникон,, пульты и т.д.) после выполнения команды поле ans_data должно быть установлено значением запроса: + p->ans_data = temp; + что сообщит внешней системе, что запрос обработан. В этом случае поле p->ans_data обнуляется внешней автоматизированной системой после сбора информации с полей + p->data_Low + p->data_High + 2.для внутренних вызовов поле p->ans_data трогать не нужно + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.1 2017_07_24 + + */ + + +#include "main.h" +void DRV_INTERFACE_Calc(TDrvInterface *p) { + TEvent event; + + long temp = (p->req_data); //принЯтие запроса + + p->INTERFACE_delta_time_sec = global_time.relative_time1.second_counter - p->INTERFACE_time_sec; + // проверка "ухода" ответа + if ((p->ans_data != 0) && (p->INTERFACE_delta_time_sec < DRV_INTERFACE_RESET_TIME)) + return; + + //раз сюда попали значит либо таймаут длЯ анса истек, либо он нулевой + //в любом случае его обнулЯем + p->ans_data = 0; + //запрос обнулЯем только после выполнениЯ, чтобы внешние устройства могли контролить выполнение запроса + switch ((temp) >> 16) + { + case DATA_REQUEST_READ_FAULT: //запрос на чтение ошибки + { + FaultLog.read(&FaultLog, (temp & 0x0FFFF), &event); + //формируем ответ + p->data_Low = (((Uint32) (event.ev_num)) << 16) + event.ev_code; + p->data_High = event.ev_time; + + p->ans_data = temp; //говорим Юникону, что команда обработана + //фиксируем времЯ ответа + p->INTERFACE_time_sec = global_time.relative_time1.second_counter; + break; + } + case DATA_REQUEST_WRITE_FAULT: //запрос на запись ошибки + { + //!!! + //пока через интерфейс писать ошибку нельзЯ + break; + } + case DATA_REQUEST_WRITE_WORK_TIME: //запрос на запись work_time + { + global_time.relative_time1.relative_date.hour = 0; + global_time.relative_time1.relative_date.minute = 0; + global_time.WtiteSPI_flag = 1; + + break; + } + case DATA_REQUEST_READ_WORK_TIME: //запрос на чтение work_time + { + //Ma][: Бу! + break; + } + case DATA_REQUEST_WRITE_OPER_TIME: { //запрос на запись oper_time + global_time.relative_time2.relative_date.hour = 0; + global_time.relative_time2.relative_date.minute = 0; + global_time.WtiteSPI_flag = 1; + + break; + } + case DATA_REQUEST_READ_OPER_TIME: //запрос на чтение ошибки + { + //Ma][: Бу! + break; + } + case DATA_REQUEST_CLEAR_ALL: //запрос на очистку банка аварий + { + FaultLog.clear(&FaultLog); + //формируем ответ + p->data_High = 0; + p->data_Low = 0; + + p->ans_data = temp; //говорим Юникону, что команда обработана + //фиксируем времЯ ответа + p->INTERFACE_time_sec = global_time.relative_time1.second_counter; + break; + } + } + + p->req_data = 0;//обнулЯем поле запроса, чтобы не выполнить его повторно +} + diff --git a/Vsrc/SM_CmdLogic.c b/Vsrc/SM_CmdLogic.c new file mode 100644 index 0000000..d769976 --- /dev/null +++ b/Vsrc/SM_CmdLogic.c @@ -0,0 +1,155 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMCmdLogic.c + \brief Обработка команд и заданий, поступающих из различных источников. (см. TSM_CmdLogic) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup SMCmdLogic + @{*/ + +#include "DSP.h" +#include "V_IQmath.h" +#include "main.h" + +//!Инициализация + +//!Всякие обнуления... +//! \memberof TSM_CmdLogic +void SM_CmdLogicInit(TSM_CmdLogic *p) { + p->state = 0; + p->state_prev = 0xFF; + cmd.all = 0; + +#if defined (HW_VECTORCARD_DRV8301_EVM) || defined (HW_VECTORCARD_DRV8312_EVM) + /* Разрешить ногам работать на вход, это кнопки старт и стоп */ + NT_GPIOA->ALTFUNCCLR = (1 << 13) | (1 << 14);//выключить альт. функцию + NT_GPIOA->OUTENCLR = (1 << 13) | (1 << 14);//на вход +#endif + +#if defined (HW_MOTORCONTROLBOARD) + /* Разрешить ногам работать на вход, это кнопки старт и стоп */ + /* Для включения/выключения данного контроллера использованы внешние дискретные входы */ + + /* + * Здесь описываются (отключается альтернативная функция, + * разрешается работа на выход) ножки для работы с кнопками + * на самом контроллере. Но так как для данного контроллера + * мы используем внешние дискретные входы (см. V_DIO), оставим + * это место пустым. + */ +#endif +} + +//!Медленный расчет + +//! \memberof TSM_CmdLogic +void SM_CmdLogicSlow_Calc(TSM_CmdLogic *p) { + +} + +//!1кГц расчет + +//!Обработка различных источников команд и расчет ДА, +//!который переключает глобально режимы РАБОТА и ОСТАНОВ. +//! \memberof TSM_CmdLogic +void SM_CmdLogicms_Calc(TSM_CmdLogic *p) { + p->StartButton = STARTBUTTON;//обработка ножки старта + p->StopButton = STOPBUTTON;//обработка ножки стопа + p->ResetButton = RESETBUTTON; + + //Стандартная обработка дискретного автомата + if (p->state_prev != p->state) + p->E = 1; + else + p->E = 0; + p->state_prev = p->state; + +#if defined (HW_VECTORCARD_DRV8301_EVM) || defined (HW_VECTORCARD_DRV8312_EVM) || defined (HW_MOTORCONTROLBOARD) + if ((p->StartButton==1) && (p->StartButtonPrev==0)){ + cmd.bit.start=1;//команда на запуск. Она же ставится через CAN + } + if ((p->StopButton==1) && (p->StopButtonPrev==0)){ + cmd.bit.stop=1; + } + + + p->StartButtonPrev=p->StartButton; + p->StopButtonPrev=p->StopButton; + p->ResetButtonPrev = p->ResetButton; +#endif + //определяем режим работы + switch (p->state) { + case CMD_LOGIC_TURNED_OFF: { //состояние 0- ОТКЛЮЧЕН + if (p->E == 1) { + /*ENTRY*/ + sm_ctrl.state = CTRL_STOP; + drv_status.bit.ready = 1; + drv_status.bit.running = 0; + } + + if (sm_prot.state == PROT_ON_OK) {//если ДА защит включился, обрабатываем команды включения + if ((cmd.bit.start == 1) && (sm_sys.state == SYS_READY)) {//есть битовая команда старта + if (udControl.Enabled == 0) { //Если цепь плавного заряда ЗПТ отключена, то переходим к пуску + p->state = CMD_LOGIC_TURNED_ON; //поехали + } + else { + if (udControl.StateOn == 1) { //Если цепь плавного заряда ЗПТ включена, ждем срабатывания реле, а потом запускаем + p->state = CMD_LOGIC_TURNED_ON; //поехали + } + else { + udControl.fault_start = 1; //если пытаемся пустится при незашунтированном реле, попадаем в аварию + } + } + } + } + + //дискретный автомат со структурами управления в СТОПе всегда тоже принудительно переводим в стоп + sm_ctrl.state = CTRL_STOP; + //всегда сбрасываем битовые команды управления + cmd.bit.stop = 0; + cmd.bit.start = 0; + break; + } + + case CMD_LOGIC_TURNED_ON: { //состояние - РАБОТА + if (p->E == 1) { + /*ENTRY*/ + drv_status.bit.ready = 1; + drv_status.bit.running = 1; + sm_ctrl.state = CTRL_RUN;//поехали + } + //если АВАРИя или КОМАНДА СТОП то состояние стоп + if ((sm_prot.state == PROT_FAIL) || (cmd.bit.stop == 1) + || (sm_ctrl.state == CTRL_STOP)){ + p->state = CMD_LOGIC_TURNED_OFF; + } + + //всегда сбрасываем команду управления + cmd.bit.stop = 0; + cmd.bit.start = 0; + break; + } + + default: { //на всякий случай делаем режим по-умолчанию "выключен" + p->state = CMD_LOGIC_TURNED_OFF; + break; + } + + } // конец switch(p->state) +} + +/*@}*/ diff --git a/Vsrc/SM_Ctrl.c b/Vsrc/SM_Ctrl.c new file mode 100644 index 0000000..ccd4d74 --- /dev/null +++ b/Vsrc/SM_Ctrl.c @@ -0,0 +1,1078 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMCtrl.c + \brief Основной ДА переключения систем управления (см. TSM_Ctrl) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup SMCtrl */ +/*@{*/ + +#include "DSP.h" +#include "V_IQmath.h" +#include "main.h" + + +//!Инициализация +//!Всякие обнуления +//! \memberof TSM_Ctrl +void SM_Ctrl_Init(TSM_Ctrl *p) { + p->state_prev = 0xff; + p->state = 0x00; +} + +//!Фоновый расчет + +//! \memberof TSM_Ctrl +void SM_Ctrl_Slow_Calc(TSM_Ctrl *p) { + +} + +//!Миллисекундный расчет + +//! \memberof TSM_Ctrl +void SM_Ctrl_ms_Calc(TSM_Ctrl *p) { + +} + +//!Быстрый расчет + +//!Реализует все структуры управления (режимы работы), такие как +//!Векторное управление, скалярное, режим постоянного тока и т.п. +//!Здесь реализован основной ДА переключения систем управления. +//!Кроме того, происходит расчет некоторых вспомогательных модулей. +//!Можно сказать, здесь находится "ядро" всей системы управления, +//!и именно в этой функции происходит непосредственное управление двигателем с +//!использованием всех остальных модулей. + +//! \memberof TSM_Ctrl +void SM_Ctrl_Fast_Calc(TSM_Ctrl *p) { + long Temp1; + +//если система находится в перееинициализации, +//то пропускаем контур управления + if (sm_sys.state == SYS_INIT) { + return; + } + +//если команда остановить, то переходим +//в режим ОСТАНОВЛЕН + if (cmd.bit.stop == 1) + p->state = CTRL_STOP; +// если есть авария, то переходим в стоп + if (sm_prot.state == PROT_FAIL) + p->state = CTRL_STOP; + +//считаем дискретный автомат + if (p->state_prev != p->state) + p->E = 1; + else + p->E = 0; +//нужно для дискретного автомата, определение +//первого вхождения + p->state_prev = p->state; + + switch (p->state) { + case CTRL_STOP: { //Состояние ОСТАНОВ + if (p->E == 1) { //Если первое вхождение в состояние + cmd.bit.start = 0; + DPReCAP.speed = 0; + DPReCAP.Ts = 0; + DPReCAP.Tspeed = 0; + global_time.WtiteSPI_flag = 1; //записать времЯ работы + //при переходе в стоп и работающем + //осциллографе переводим его в режим + //однократной записи, чтобы зафиксир. возможную аварию. + if (dlog.StartBits & (1 << 8)) //Если пользователь задал этот бит + dlog.set_mode(1, &dlog); //запускаем осциллограф по этому событию + + if (sm_prot.state==PROT_FAIL)//если мы перешли в стоп, а модуль защит в аварии + if (dlog.mode_reset==2)//и даталоггер крутился + dlog.mode_reset=1;//то остановим осц, пусть будет осца аварии + } + pwm.Off(&pwm); //Выкл ШИМ + // refs.theta_elec=0; + + //Обнуление всего опасного + pwm.UalphaRef = 0; + pwm.UbetaRef = 0; + pwm.update(&pwm); + pid_id.reset(&pid_id); + pid_iq.reset(&pid_iq); + pid_ia.reset(&pid_ia); + pid_spd.reset(&pid_spd); + pid_pos.reset(&pid_pos); + cur_par.Is = 0; + cur_par.power = 0; + cur_par.speed = 0; + // cur_par.ThetaRefCurr=0; + + /* Конец */ + break; + } + + case CTRL_RUN: { //Состояние запуска + if (p->E == 1) { + /*ENTRY START*/ + drv_status.bit.running = 1; + pwm.On(&pwm);//Включение модуля ШИМ + p->ctrl_counter = 0; + if (dlog.StartBits & (1 << 0)) //Если пользователь задал этот бит + dlog.set_mode(1, &dlog); //запускаем осциллограф по этому событию + /*ENTRY END*/ + } + /*DO START*/ + + p->ctrl_counter++; + + if (p->ctrl_counter < 100) { //Задержка 10 мс для заряда бутстрепной ёмкости + pwm.ChargingMode = 1;//спец. режим заряда конденсаторов + pwm.update(&pwm); + break; + } + pwm.ChargingMode = 0; + + if (p->run_mode == CTRL_RUN_U2F) {//скалярный режим + p->state = CTRL_RUN_U2F; + } + if (p->run_mode == CTRL_FLUXING) {//режим удержания (постоянный ток) + p->state = CTRL_FLUXING; + } + if (p->run_mode == CTRL_RUN_I2F) {//частотно-токовый режим (вращение вектора тока) + p->state = CTRL_RUN_I2F; + } + if (p->run_mode == CTRL_RUN_VECTOR_SM) {//векторная СУ синхронной машины с двумя контурами + p->state = CTRL_RUN_VECTOR_SM; + } + if (p->run_mode == CTRL_RUN_VECTOR_SM_ENCODER_POS) {//векторная СУ синхронной машины с обратной связью по энкодеру и контуром положения + p->state = CTRL_RUN_VECTOR_SM_ENCODER_POS; + } + if (p->run_mode == CTRL_RUN_VECTOR_IM_ENCODER) {//векторная СУ синхронной машины с обратной связью по энкодеру и контуром положения + p->state = CTRL_RUN_VECTOR_IM_ENCODER; + } + if (p->run_mode == CTRL_RUN_VECTOR_IM_ENCODER_POS) {//векторная СУ синхронной машины с обратной связью по энкодеру и контуром положения + p->state = CTRL_RUN_VECTOR_IM_ENCODER_POS; + } + if (p->run_mode == CTRL_AUTO_SENSOR_TUNING) {//автоматическая настройка смещений в ДПР (частотно-токовая+доп. логика) + p->state = CTRL_AUTO_SENSOR_TUNING; + } + if (p->run_mode == CTRL_DC_DRIVE) {// ДПТ + p->state = CTRL_DC_DRIVE; + } + if (p->run_mode == CTRL_DC_DRIVE_FB) {// ДПТ замкн. + p->state = CTRL_DC_DRIVE_FB; + } + if (p->run_mode == CTRL_RUN_SRM_AUTOCOMMUTATION) { //автокоммутация SRM + p->state = CTRL_RUN_SRM_AUTOCOMMUTATION; + } + + /*DO END*/ + break; + } + + case CTRL_FLUXING: { //Режим постоянный ток + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); + pid_id.ui_reg3 = 0; //сбрасывем интегральные каналы + pid_iq.ui_reg3 = 0; //чтобы не накапливались + pid_spd.ui_reg3 = 0; + refs.theta_elec = 0;//заданный угол - 0. Но он есть в группе Задания, его можно менять на ходу! + + if (dlog.StartBits & (1 << 1)) + dlog.set_mode(1, &dlog); + /*ENTRY END*/ + } + /*DO START*/ + + //два тока фаз из АЦП в модуль фазных преобразований + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke);//расчет + + //из фазных преобразований в координатные преобразования. + //Поворачиваем вектор на заданный угол refs.theta_elec + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = refs.theta_elec; + park.calc(&park); + + //регулятор тока "как бы" оси d (на самом деле эта ось к двигателю к оси d не привязана, это свободная ось) + pid_id.pid_ref_reg3 = refs.i_flux_ref; //задание на ток намагничивания + pid_id.pid_fdb_reg3 = park.de;//обратная связь - то что пришло с фазных преобразований + pid_id.calc(&pid_id); + + //регулятор тока "как бы" оси q (на самом деле эта ось к двигателю к оси q не привязана, это свободная ось) + pid_iq.pid_ref_reg3 = 0;//задание - ноль + pid_iq.pid_fdb_reg3 = park.qe;//обратная связь - то что пришло с фазных преобразований + pid_iq.calc(&pid_iq); + + //обратные фазные преобразования. + //Крутим вектор напряжения, который выдают регуляторы токов обратно на угол refs.theta_elec + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = refs.theta_elec; + ipark.calc(&ipark); + + //получившиеся задания напряжения по осям альфа и бета отправляем на модуль ШИМ + pwm.UalphaRef = ipark.ds; + pwm.UbetaRef = ipark.qs; + pwm.update(&pwm); + + //в наблюдаемые переменные - текущий амплитудный ток в статоре (обратная связь регулятора d) + cur_par.Is = pid_id.pid_fdb_reg3; + + break; + } + + case CTRL_RUN_U2F: { //Режим скалярное управление U(f) + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); + rmp.output = 0; + + if (dlog.StartBits & (1 << 2)) //Если пользователь задал этот бит осциллографирования + dlog.set_mode(1, &dlog); //запускаем осциллограф по этому событию + + /*ENTRY END*/ + } + /*DO START*/ + //задание скорости на вход задатчика интенсивности + rmp.input = refs.speed_ref; + rmp.calc(&rmp);//расчет задатчика + cur_par.speed = rmp.output; //скорость (частоту вращения) показываем в налюдаемых параметрах, которая задана + + //угол refs.theta_elec - интеграл от скорости rmp.output. + //Константа FAST_CALC_TS - период дискретизации + //drv_params.freq_nom номинальная частота (базовый параметр частоты для относительных единиц измерения) + refs.theta_elec += _IQmpy(_IQmpyI32(drv_params.freq_nom,FAST_CALC_TS), + rmp.output); + refs.theta_elec &= 0x00FFFFFF; //отсечение лишней верхней части, если угол больше единицы в IQ (360 градусов) + //на вход кривой U/f подается текущая скорость (частота) + vhz.freq = rmp.output; + vhz.calc(&vhz); + + //в модуль координатных преоразований подаем заданную амплитуду напряжения vhz.vout с модуля U/f + //Используем фазные преобразования как "крутилку" вектора напряжения + ipark.de = vhz.vout; + ipark.qe = 0; + ipark.ang = refs.theta_elec; + ipark.calc(&ipark); + + //получившиеся задания напряжения по осям альфа и бета отправляем на модуль ШИМ + pwm.UalphaRef = ipark.ds; + pwm.UbetaRef = ipark.qs; + pwm.update(&pwm); + + /*DO END*/ + break; + } + + case CTRL_RUN_I2F: { //Режим частотно-токового управления - вращающийся вектор тока. + if (p->E == 1) { + /*ENTRY START*/ + pid_id.ui_reg3 = 0; //сбрасывем интегральные каналы + pid_iq.ui_reg3 = 0; //чтобы не накапливались + pid_spd.ui_reg3 = 0; + pid_id.pid_ref_reg3 = 0; + pid_iq.pid_ref_reg3 = 0; + + pwm.On(&pwm);//влючение ШИМ + rmp.output = 0; + if (dlog.StartBits & (1 << 3)) + dlog.set_mode(1, &dlog); + /*ENTRY END*/ + } + /*DO START*/ + { + + //два тока фаз из АЦП в модуль фазных преобразований + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke); + + //текущий вектор тока - в наблюдаемые параметры (чтобы на него смотреть) + cur_par.Ialpha = clarke.ds; + cur_par.Ibeta = clarke.qs; + + //задание скорости на вход задатчика интенсивности + rmp.input = refs.speed_ref; + rmp.calc(&rmp);//расчет задатчика + + //угол refs.theta_elec - интеграл от скорости rmp.output. + //Константа FAST_CALC_TS - период дискретизации + //drv_params.freq_nom номинальная частота (базовый параметр частоты для относительных единиц измерения) + refs.theta_elec += _IQmpy( + _IQmpyI32(drv_params.freq_nom,FAST_CALC_TS), rmp.output); + cur_par.ThetaRefCurr = refs.theta_elec; + refs.theta_elec &= 0x00FFFFFF;//отсечение лишней верхней части, если угол больше единицы в IQ (360 градусов) + + //текущий угол с датчика положения, переведенный в электрический из механического + //cur_par.ThetaCurr = posspeedEqep.theta_elecContinouos; + + //Текущий угол - заданный угол + cur_par.ThetaCurr = refs.theta_elec; + + //из фазных преобразований в координатные преобразования. + //Поворачиваем вектор на заданный угол refs.theta_elec + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = refs.theta_elec; + park.calc(&park); + + //регулятор тока "как бы" оси d (на самом деле эта ось к двигателю к оси d не привязана, это свободная ось) + pid_id.pid_ref_reg3 = refs.i_flux_ref; + pid_id.pid_fdb_reg3 = park.de; + pid_id.calc(&pid_id); + + //регулятор тока "как бы" оси q (на самом деле эта ось к двигателю к оси q не привязана, это свободная ось) + pid_iq.pid_ref_reg3 = 0; + pid_iq.pid_fdb_reg3 = park.qe; + pid_iq.calc(&pid_iq); + + //обратные фазные преобразования. + //Крутим вектор напряжения, который выдают регуляторы токов обратно на угол refs.theta_elec + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = refs.theta_elec; + ipark.calc(&ipark); + + //получившиеся задания напряжения по осям альфа и бета отправляем на модуль ШИМ + pwm.UalphaRef = ipark.ds; + pwm.UbetaRef = ipark.qs; + pwm.update(&pwm); + + //в наблюдаемые переменные - текущий амплитудный ток в статоре (обратная связь регулятора d) + cur_par.Is = pid_id.pid_fdb_reg3; + //и текущую частоту (скорость) + cur_par.speed = rmp.output; + + if (sw.excitation_ena) + { + pwm_ex.ref = refs.uf_ref; + pwm_ex.calc(&pwm_ex); + } + + /*DO END*/ + } + break; + } + + case CTRL_RUN_VECTOR_SM: { //Датчиковая СУ для синхронной машины + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); //Включение ШИМ + rmp.output = 0; //Обнуление задатчика интенсивности + if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования + dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию + /*ENTRY END*/ + } + /*DO START*/ + { + if (drv_params.sens_type == POS_SENSOR_TYPE_HALL){ //В типе датчика выбран ДПР на элементах Холла + cur_par.speed = DPReCAP.speed; //Текущая скорость - с ДПР + refs.theta_elec = DPReCAP.Angle; //текущее угловое положение - с ДПР + } + if (drv_params.sens_type == POS_SENSOR_TYPE_ENCODER){ //В типе датчика выбран ДПР на элементах Холла + cur_par.speed = posspeedEqep.speed_elec; //Текущая скорость - с ДПР + refs.theta_elec = posspeedEqep.theta_elec; //текущее угловое положение - с ДПР + } + if (drv_params.sens_type == POS_SENSOR_TYPE_SSI){ //В типе датчика выбран ДПР цифровой с SSI интерфейсом + cur_par.speed = SSI_Encoder.speed_elec; //Текущая скорость - с ДПР + refs.theta_elec = SSI_Encoder.theta_elec; //текущее угловое положение - с ДПР + } + + cur_par.Is = pid_iq.pid_fdb_reg3; //Текущий ток статора - ток по оси q + + //Преобразование токов из трехфазной системы координат в двухфазную + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke); + cur_par.Ialpha = clarke.ds; + cur_par.Ibeta = clarke.qs; + + // задание скорости от задатчика интенсивности (ЗИ) + rmp.input = refs.speed_ref; + rmp.calc(&rmp);//Расчет ЗИ + + pid_spd.pid_ref_reg3 = rmp.output; //на воход регулятора скорости - выход ЗИ + pid_spd.pid_fdb_reg3 = cur_par.speed; //обратная связь регулятора скорости - скорость ДПР + + + pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток + + if (sw.recuperation_ena & 1) //если разрешена рекуперация + pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток + else + //иначе + pid_spd.pid_out_min = 0; //нулевой ток не даст рекупераци при вращении в положительную сторону + pid_spd.calc(&pid_spd); //расчет регулятора скорости + + + cur_par.ThetaRefCurr = refs.theta_elec; + refs.theta_elec &= 0x00FFFFFF; //Ограничение угла на 1.0 в формате 8.24 + + //Поворот токов фаз на угол refs.theta_elec + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = refs.theta_elec; + park.calc(&park); //расчет преобразования координат + + //задание рег. тока по оси q (оси момента) - выход регулятора скорости + pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3; + pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси q - вычисленный ток по фазе q + pid_iq.calc(&pid_iq); //расчет регулятора тока оси q + + pid_id.pid_ref_reg3 = 0; //задание тока по оси d - оси возбудения + pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси d - вычисленный ток по фазе d + pid_id.calc(&pid_id); //расчет регулятора тока оси d + + //Обратный поворот на угол refs.theta_elec для + //выходов регуляторов тока (напряжений по осям d и q) + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = refs.theta_elec; + ipark.calc(&ipark); //расчет преобразования координат + + //Задание напряжение на модуль ШИМ после преобразования координат + pwm.UalphaRef = ipark.ds; //Ось альфа + pwm.UbetaRef = ipark.qs; //Ось бета + pwm.update(&pwm); //Расчет модуля ШИМ + + if (sw.excitation_ena) + { + pwm_ex.ref = refs.uf_ref; + pwm_ex.calc(&pwm_ex); + } + + /*DO END*/ + } + break; + } + + case CTRL_RUN_VECTOR_SM_ENCODER_POS: { //Датчиковая СУ с энкодером и с контуром положения + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); //Включение ШИМ + rmp.output = 0; //Обнуление задатчика интенсивности + if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования + dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию + /*ENTRY END*/ + } + /*DO START*/ + { + cur_par.Is = pid_iq.pid_fdb_reg3; //Текущий ток статора - ток по оси q + cur_par.speed = posspeedEqep.speed_elec; //Текущая скорость - с ДПР фильтрованная + + //Преобразование токов из трехфазной системы координат в двухфазную + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke); + cur_par.Ialpha = clarke.ds; + cur_par.Ibeta = clarke.qs; + + +/* //Для демо-режима контура положения сделаем задание положения, изменяющегося по синусу + //Как быстро менять задание - пусть управляется из переменной для отладки DebugW1 + + if (DebugW1!=0){//если какая-то скорость вращения задана + p->AngleDemo+=(DebugW1>>10);//инкрементируем переменную + if (p->AngleDemo>_IQ(2))//период равен 2, что в о.е. дает 360*2 градусов + p->AngleDemo=0; + + //задание угла в контур положения + //пусть будет синус от линейно увеличивающейся переменной, да еще и в 4 раза увеличим + refs.theta_elec=_IQsinPU(p->AngleDemo)<<2; + } +*/ + + /* +//Другой демо-режим контура положения - задавать положение от двигателя датчика, абсолютного энкодера с интерфейсом SSI +//Для работы датчика его нужно, собственно, подключить (в комплект поставки не входит!), +//а также выбрать его в настройках + +#define REVOLUTION_DROP_NUMBER 3 + //чтобы можно было вращать неограниченно в одну сторону и не переполнилась переменная по положению + //но чтобы нельзя было накрутить 100500 оборотов вперед привода и он крутил бы дальше и дальше + //ограничим максимальное расхождение в обототах числом REVOLUTION_DROP_NUMBER + if (labs(SSI_Encoder.RevolutionCounter-posspeedEqep.RevolutionCounter)>REVOLUTION_DROP_NUMBER){ + if (posspeedEqep.RevolutionCounter>SSI_Encoder.RevolutionCounter){ + posspeedEqep.RevolutionCounter=SSI_Encoder.RevolutionCounter+REVOLUTION_DROP_NUMBER; + } + if (SSI_Encoder.RevolutionCounter>posspeedEqep.RevolutionCounter){ + SSI_Encoder.RevolutionCounter=posspeedEqep.RevolutionCounter+REVOLUTION_DROP_NUMBER; + } + } + if ((posspeedEqep.RevolutionCounter>10) || (SSI_Encoder.RevolutionCounter>10)){ + posspeedEqep.RevolutionCounter-=10; + SSI_Encoder.RevolutionCounter-=10; + } + if ((posspeedEqep.RevolutionCounter<-10) || (SSI_Encoder.RevolutionCounter<-10)){ + posspeedEqep.RevolutionCounter+=10; + SSI_Encoder.RevolutionCounter+=10; + } + + //задание угла - от SSI энкодера + refs.theta_elec=SSI_Encoder.theta_elecContinouos; +*/ + + + //текущий угол с датчика положения, переведенный в электрический из механического + cur_par.ThetaCurr = posspeedEqep.theta_elecContinouos; + cur_par.ThetaRefCurr=refs.theta_elec;//заданный угол электрический (продублируем в эту переменную задание для удобства наблюдения) + + //ошибка - разница между заданием и текущим углом. Эта разница обычно считается внутри ПИД регулятора, + //однако в данном случае нужно после расчета произвести ограничение, чтобы в регуляторе ничего не переполнилось + long posRefError=refs.theta_elec - cur_par.ThetaCurr; + + + //ограничим ошибку - чтобы при расчете регулятора внутри него не было переполнения. + if (posRefError>_IQ(1)) + posRefError=_IQ(1); + if (posRefError<-_IQ(1)) + posRefError=-_IQ(1); + + + //обычно на ПИД регулятор подается задание и обратная связь, а внутри считается их разница. + //но разницу мы посчитали выше (и ограничили). Потому пусть задание на регулятор будет всё время нулевым, + //а в обратную связь подадим уже посчитанную и ограниченную ошибку (со знаком минус) + pid_pos.pid_ref_reg3 = 0;//задавать задание на положение надо через refs.theta_elec (группа задания) + pid_pos.pid_fdb_reg3 = -posRefError;//обратная связь + pid_pos.pid_out_max=refs.speed_ref;//ограничение рег. положения - максимум задаваемой скорости + pid_pos.pid_out_min=-refs.speed_ref;//и в минус + pid_pos.saterr_reg3Add=pid_spd.saterr_reg3;//это улучшайзер. Учитывает насыщение рег. скорости и передает его в рег. положения. + pid_pos.calc(&pid_pos); //расчет регулятора положения + + pid_spd.pid_ref_reg3 = pid_pos.pid_out_reg3; //на вход регулятора скорости - выход рег. положения +// pid_spd.pid_fdb_reg3 = posspeedEqep.speed_filter.output; //обратная связь регулятора скорости - скорость ДПР + pid_spd.pid_fdb_reg3 = cur_par.speed; + + pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток + pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток + pid_spd.calc(&pid_spd); //расчет регулятора скорости + + + //Поворот токов фаз на угол refs.theta_elec + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = posspeedEqep.theta_elec; + park.calc(&park); //расчет преобразования координат + + //задание рег. тока по оси q (оси момента) - выход регулятора скорости + pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3; + pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси q - вычисленный ток по фазе q + pid_iq.calc(&pid_iq); //расчет регулятора тока оси q + + pid_id.pid_ref_reg3 = 0; //задание тока по оси d - оси возбудения + pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси d - вычисленный ток по фазе d + pid_id.calc(&pid_id); //расчет регулятора тока оси d + + //Обратный поворот на угол refs.theta_elec для + //выходов регуляторов тока (напряжений по осям d и q) + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = posspeedEqep.theta_elec; + ipark.calc(&ipark); //расчет преобразования координат + + //Задание напряжение на модуль ШИМ после преобразования координат + pwm.UalphaRef = ipark.ds; //Ось альфа + pwm.UbetaRef = ipark.qs; //Ось бета + pwm.update(&pwm); //Расчет модуля ШИМ + + /*DO END*/ + } + break; + } + + + case CTRL_RUN_VECTOR_IM_ENCODER: { //Датчиковая СУ для АД с энкодером и контуром скорости + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); //Включение ШИМ + RotorObserver.psi_d=0; + RotorObserver.psi_q=0; + rmp.output = 0; //Обнуление задатчика интенсивности + if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования + dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию + /*ENTRY END*/ + } + /*DO START*/ + { + cur_par.Is = _IQmag(pid_iq.pid_fdb_reg3,pid_id.pid_fdb_reg3) ; //Текущий ток статора - амплитуда из токов d и q + cur_par.speed = posspeedEqep.speed_elec; //posspeedEqep.speed.output;//Текущая скорость - с ДПР фильтрованная + + //Преобразование токов из трехфазной системы координат в двухфазную + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke); + cur_par.Ialpha = clarke.ds; + cur_par.Ibeta = clarke.qs; + + // задание скорости от задатчика интенсивности (ЗИ) + rmp.input = refs.speed_ref; + rmp.calc(&rmp);//Расчет ЗИ + + pid_spd.pid_ref_reg3 = rmp.output; //на воход регулятора скорости - выход ЗИ + pid_spd.pid_fdb_reg3 = posspeedEqep.speed_elec; //обратная связь регулятора скорости - скорость ДПР + + + pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток + + if (sw.recuperation_ena & 1) //если разрешена рекуперация + pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток + else + //иначе + pid_spd.pid_out_min = 0; //нулевой ток не даст рекупераци при вращении в положительную сторону + pid_spd.calc(&pid_spd); //расчет регулятора скорости + + + //Поворот токов фаз на угол refs.theta_elec + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = posspeedEqep.theta_elec; + park.calc(&park); //расчет преобразования координат + + RotorObserver.id=park.de;//на наблюдатель ротора АД - токи статора, повернутый на угол ДПРа + RotorObserver.iq=park.qe; + RotorObserver.calc(&RotorObserver); + + refs.theta_elec = RotorObserver.theta_psi_elec+posspeedEqep.theta_elec; //текущее угловое положение - с ДПР и наблюдателя ротора (оси x,y) + refs.theta_elec &= 0x00FFFFFF; //Ограничение угла на 1.0 в формате 8.24 + cur_par.ThetaRefCurr = refs.theta_elec; + + + //Теперь refs.theta_elec - угол потокосцепления ротора. Повторяем векторную систему от синхронной машины для этого угла + park.ds = clarke.ds; + park.qs = clarke.qs; + //второе слагаемое - доворот для устойчивости регуляторов на высокой скорости. Дублироваться второй раз для ipark не должен! + park.ang = refs.theta_elec; + park.calc(&park); + + //регуляторы токов d, q используются для регулирования осей x, y (чтобы не делать разных названий) + //задание рег. тока по оси y (оси момента) - выход регулятора скорости + pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3; + pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси y - вычисленный ток по фазе y + pid_iq.calc(&pid_iq); //расчет регулятора тока оси y + + pid_id.pid_ref_reg3 = _IQmpy(RotorObserver.FluxCurrentRatio,labs(pid_iq.pid_ref_reg3)); //задание тока по оси x - оси возбудения. Пропорционально амплитуде задания тока статора + if (pid_id.pid_ref_reg3 < RotorObserver.FluxCurrentMin) + pid_id.pid_ref_reg3=RotorObserver.FluxCurrentMin; + pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси x - вычисленный ток по фазе x + pid_id.calc(&pid_id); //расчет регулятора тока оси x + + + //Обратный поворот на угол refs.theta_elec для + //выходов регуляторов тока (напряжений по осям x и y) + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = refs.theta_elec; + ipark.calc(&ipark); //расчет преобразования координат + + //Задание напряжение на модуль ШИМ после преобразования координат + pwm.UalphaRef = ipark.ds; //Ось альфа + pwm.UbetaRef = ipark.qs; //Ось бета + pwm.update(&pwm); //Расчет модуля ШИМ + + /*DO END*/ + } + break; + } + + case CTRL_RUN_VECTOR_IM_ENCODER_POS: { //Датчиковая СУ для АД с энкодером и контурами скорости и положения + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); //Включение ШИМ + RotorObserver.psi_d=0; + RotorObserver.psi_q=0; + rmp.output = 0; //Обнуление задатчика интенсивности + if (dlog.StartBits & (1 << 4)) //Если пользователь задал этот бит осциллографирования + dlog.set_mode(1, &dlog); //Запуск осциллографа по этому событию + /*ENTRY END*/ + } + /*DO START*/ + { + cur_par.Is = _IQmag(pid_iq.pid_fdb_reg3,pid_id.pid_fdb_reg3) ; //Текущий ток статора - амплитуда из токов d и q + cur_par.speed = posspeedEqep.speed_elec; //posspeedEqep.speed.output;//Текущая скорость - с ДПР фильтрованная + + //Преобразование токов из трехфазной системы координат в двухфазную + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke); + cur_par.Ialpha = clarke.ds; + cur_par.Ibeta = clarke.qs; + + +/* //Для демо-режима контура положения сделаем задание положения, изменяющегося по синусу + //Как быстро менять задание - пусть управляется из переменной для отладки DebugW1 + + if (DebugW1!=0){//если какая-то скорость вращения задана + p->AngleDemo+=(DebugW1>>10);//инкрементируем переменную + if (p->AngleDemo>_IQ(2))//период равен 2, что в о.е. дает 360*2 градусов + p->AngleDemo=0; + + //задание угла в контур положения + //пусть будет синус от линейно увеличивающейся переменной, да еще и в 4 раза увеличим + refs.theta_elec=_IQsinPU(p->AngleDemo)<<2; + } +*/ + + /* +//Другой демо-режим контура положения - задавать положение от двигателя датчика, абсолютного энкодера с интерфейсом SSI +//Для работы датчика его нужно, собственно, подключить (в комплект поставки не входит!), +//а также выбрать его в настройках + +#define REVOLUTION_DROP_NUMBER 3 + //чтобы можно было вращать неограниченно в одну сторону и не переполнилась переменная по положению + //но чтобы нельзя было накрутить 100500 оборотов вперед привода и он крутил бы дальше и дальше + //ограничим максимальное расхождение в обототах числом REVOLUTION_DROP_NUMBER + if (labs(SSI_Encoder.RevolutionCounter-posspeedEqep.RevolutionCounter)>REVOLUTION_DROP_NUMBER){ + if (posspeedEqep.RevolutionCounter>SSI_Encoder.RevolutionCounter){ + posspeedEqep.RevolutionCounter=SSI_Encoder.RevolutionCounter+REVOLUTION_DROP_NUMBER; + } + if (SSI_Encoder.RevolutionCounter>posspeedEqep.RevolutionCounter){ + SSI_Encoder.RevolutionCounter=posspeedEqep.RevolutionCounter+REVOLUTION_DROP_NUMBER; + } + } + if ((posspeedEqep.RevolutionCounter>10) || (SSI_Encoder.RevolutionCounter>10)){ + posspeedEqep.RevolutionCounter-=10; + SSI_Encoder.RevolutionCounter-=10; + } + if ((posspeedEqep.RevolutionCounter<-10) || (SSI_Encoder.RevolutionCounter<-10)){ + posspeedEqep.RevolutionCounter+=10; + SSI_Encoder.RevolutionCounter+=10; + } + + //задание угла - от SSI энкодера + refs.theta_elec=SSI_Encoder.theta_elecContinouos; + + refs.theta_elec=adc.ref_meas<<2; //задание положения от потенциометра +*/ + + + + //текущий угол с датчика положения, переведенный в электрический из механического + cur_par.ThetaCurr = posspeedEqep.theta_elecContinouos; + cur_par.ThetaRefCurr=refs.theta_elec;//заданный угол электрический (продублируем в эту переменную задание для удобства наблюдения) + + //ошибка - разница между заданием и текущим углом. Эта разница обычно считается внутри ПИД регулятора, + //однако в данном случае нужно после расчета произвести ограничение, чтобы в регуляторе ничего не переполнилось + long posRefError=refs.theta_elec - cur_par.ThetaCurr; + + + //ограничим ошибку - чтобы при расчете регулятора внутри него не было переполнения. + if (posRefError>_IQ(1)) + posRefError=_IQ(1); + if (posRefError<-_IQ(1)) + posRefError=-_IQ(1); + + + //обычно на ПИД регулятор подается задание и обратная связь, а внутри считается их разница. + //но разницу мы посчитали выше (и ограничили). Потому пусть задание на регулятор будет всё время нулевым, + //а в обратную связь подадим уже посчитанную и ограниченную ошибку (со знаком минус) + pid_pos.pid_ref_reg3 = 0;//задавать задание на положение надо через Temp1 (группа задания) + pid_pos.pid_fdb_reg3 = -posRefError;//обратная связь + pid_pos.pid_out_max=refs.speed_ref;//ограничение рег. положения - максимум задаваемой скорости + pid_pos.pid_out_min=-refs.speed_ref;//и в минус + pid_pos.saterr_reg3Add=pid_spd.saterr_reg3;//это улучшайзер. Учитывает насыщение рег. скорости и передает его в рег. положения. + pid_pos.calc(&pid_pos); //расчет регулятора положения + + pid_spd.pid_ref_reg3 = pid_pos.pid_out_reg3; //на вход регулятора скорости - выход рег. положения +// pid_spd.pid_fdb_reg3 = posspeedEqep.speed_filter.output; //обратная связь регулятора скорости - скорость ДПР + pid_spd.pid_fdb_reg3 = cur_par.speed; + + pid_spd.pid_out_max = refs.Iq_ref; //Максимум выхода регулятора скорости - заданный ток + pid_spd.pid_out_min = -refs.Iq_ref; //минимум рег. скор. - отрицательный ток + pid_spd.calc(&pid_spd); //расчет регулятора скорости + + + //Поворот токов фаз на угол Temp1 + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = posspeedEqep.theta_elec; + park.calc(&park); //расчет преобразования координат + + RotorObserver.id=park.de;//на наблюдатель ротора АД - токи статора, повернутый на угол ДПРа + RotorObserver.iq=park.qe; + RotorObserver.calc(&RotorObserver); + + Temp1 = RotorObserver.theta_psi_elec+posspeedEqep.theta_elec; //текущее угловое положение - с ДПР и наблюдателя ротора (оси x,y) + Temp1 &= 0x00FFFFFF; //Ограничение угла на 1.0 в формате 8.24 + cur_par.ThetaRefCurr = Temp1; + + + //Теперь Temp1 - угол потокосцепления ротора. Повторяем векторную систему от синхронной машины для этого угла + park.ds = clarke.ds; + park.qs = clarke.qs; + //второе слагаемое - доворот для устойчивости регуляторов на высокой скорости. Дублироваться второй раз для ipark не должен! + park.ang = Temp1; + park.calc(&park); + + //регуляторы токов d, q используются для регулирования осей x, y (чтобы не делать разных названий) + //задание рег. тока по оси y (оси момента) - выход регулятора скорости + pid_iq.pid_ref_reg3 = pid_spd.pid_out_reg3; + pid_iq.pid_fdb_reg3 = park.qe; //обратная связь рег. тока оси y - вычисленный ток по фазе y + pid_iq.calc(&pid_iq); //расчет регулятора тока оси y + + pid_id.pid_ref_reg3 = _IQmpy(RotorObserver.FluxCurrentRatio,labs(pid_iq.pid_ref_reg3)); //задание тока по оси x - оси возбудения. Пропорционально амплитуде задания тока статора + if (pid_id.pid_ref_reg3 < RotorObserver.FluxCurrentMin) + pid_id.pid_ref_reg3=RotorObserver.FluxCurrentMin; + pid_id.pid_fdb_reg3 = park.de; //обратная связь рег. тока оси x - вычисленный ток по фазе x + pid_id.calc(&pid_id); //расчет регулятора тока оси x + + + //Обратный поворот на угол Temp1 для + //выходов регуляторов тока (напряжений по осям x и y) + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = Temp1; + ipark.calc(&ipark); //расчет преобразования координат + + //Задание напряжение на модуль ШИМ после преобразования координат + pwm.UalphaRef = ipark.ds; //Ось альфа + pwm.UbetaRef = ipark.qs; //Ось бета + pwm.update(&pwm); //Расчет модуля ШИМ + + /*DO END*/ + } + break; + } + case CTRL_DC_DRIVE: { // ДПТ разомкнутый + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); + rmp.output = 0; + if (dlog.StartBits & (1 << 3)) + dlog.set_mode(1, &dlog); + /*ENTRY END*/ + } + + pwm.UalphaRef = refs.ua_ref; + pwm.UbetaRef = refs.uf_ref; + pwm.update(&pwm); + + break; + } + + case CTRL_DC_DRIVE_FB: { // ДПТ замкнутый + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); + rmp.output = 0; + if (dlog.StartBits & (1 << 3)) + dlog.set_mode(1, &dlog); + /*ENTRY END*/ + } + + pid_spd.pid_ref_reg3 = refs.DCMspeed_ref; //задание + pid_spd.pid_fdb_reg3 = posspeedEqep.speed_elec; //обратная связь регулятора скорости - скорость ДПР +/* + pid_spd.pid_out_max = sm_prot.Imax_protect; //Максимум выхода регулятора скорости - заданный ток + if (sw.recuperation_ena & 1) //если разрешена рекуперация + pid_spd.pid_out_min = -sm_prot.Imax_protect; //минимум рег. скор. - отрицательный ток + else + pid_spd.pid_out_min = 0; //нулевой ток не даст рекупераци при вращении в положительную сторону +*/ + pid_spd.calc(&pid_spd); //расчет регулятора скорости + + pid_ia.pid_ref_reg3 = pid_spd.pid_out_reg3; + pid_ia.pid_fdb_reg3 = adc.Imeas_a; //обратная связь рег. тока оси y - вычисленный ток по фазе y + pid_ia.calc(&pid_ia); //расчет регулятора тока оси y + + pwm.UalphaRef = pid_ia.pid_out_reg3; + pwm.UbetaRef = refs.uf_ref; + pwm.update(&pwm); + + break; + } + + + case CTRL_AUTO_SENSOR_TUNING: { //Авто настройка ДПР + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); + rmp.output = 0; + DPReCAP.AngleOffset = 0; + if (dlog.StartBits & (1 << 3)) + dlog.set_mode(1, &dlog); + /*ENTRY END*/ + } + /*DO START*/ + { + //по структуре это тоже самое, что частотно-токовая система управления + cur_par.Is = pid_id.pid_fdb_reg3; + cur_par.speed = rmp.output; + + clarke.as = adc.Imeas_a; + clarke.bs = adc.Imeas_b; + clarke.calc(&clarke); + cur_par.Ialpha = clarke.ds; + cur_par.Ibeta = clarke.qs; + + rmp.input = refs.speed_ref; + rmp.calc(&rmp); + refs.theta_elec += _IQmpy( + _IQmpyI32(drv_params.freq_nom,FAST_CALC_TS), rmp.output); + cur_par.ThetaRefCurr = refs.theta_elec; + refs.theta_elec &= 0x00FFFFFF; + + park.ds = clarke.ds; + park.qs = clarke.qs; + park.ang = refs.theta_elec; + park.calc(&park); + + pid_iq.pid_ref_reg3 = 0; + pid_iq.pid_fdb_reg3 = park.qe; + pid_iq.calc(&pid_iq); + + pid_id.pid_ref_reg3 = refs.i_flux_ref; + pid_id.pid_fdb_reg3 = park.de; + pid_id.calc(&pid_id); + + ipark.de = pid_id.pid_out_reg3; + ipark.qe = pid_iq.pid_out_reg3; + ipark.ang = refs.theta_elec; + ipark.calc(&ipark); + + pwm.UalphaRef = ipark.ds; + pwm.UbetaRef = ipark.qs; + + pwm.update(&pwm); + + //автоматическая настрока смещения для датчика Холла + if (p->AnglePrev != DPReCAP.Angle6) { + if (((DPReCAP.Angle6 == _IQ(5.0 / 6.0)) && (p->AnglePrev == 0)) + || ((p->AnglePrev == _IQ(5.0 / 6.0)) + && (DPReCAP.Angle6 == 0))) { + DPReCAP.AngleOffset = + DPReCAP.AngleOffset + + _IQmpy(_IQ(0.5), + ((refs.theta_elec-DPReCAP.AngleOffset+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5)); + DPReCAP.AngleOffset &= 0x00FFFFFF; + } + p->AnglePrev = DPReCAP.Angle6; + } + + //автоматическая настрока смещения для энкодера + posspeedEqep.AngleOffset = + posspeedEqep.AngleOffset + + _IQmpy(_IQ(0.0001), + ((refs.theta_elec-posspeedEqep.theta_elec+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5)); + posspeedEqep.AngleOffset &= 0x00FFFFFF; + /*DO END*/ + } + break; + } + + case CTRL_RUN_SRM_AUTOCOMMUTATION: { //Режим автокоммутации SRM + if (p->E == 1) { + /*ENTRY START*/ + pwm.On(&pwm); //влючение ШИМ + rmp.output = 0; + if (dlog.StartBits & (1 << 3)) + dlog.set_mode(1, &dlog); + /*ENTRY END*/ + } + /*DO START*/ + { + cur_par.speed = DPReCAP.speed; //Текущая скорость - с ДПР + + // задание скорости от задатчика интенсивности (ЗИ) + rmp.input = refs.speed_ref; + rmp.calc(&rmp); //Расчет ЗИ + + pid_spd.pid_ref_reg3 = rmp.output;//на вход регулятора скорости - выход ЗИ + pid_spd.pid_fdb_reg3 = DPReCAP.speed;//обратная связь регулятора скорости - скорость ДПР Холла + + pid_spd.pid_out_max = refs.Iq_ref;//Максимум выхода регулятора скорости - заданный ток + pid_spd.pid_out_min = 0; //Минимум выхода регулятора скорости - 0 + pid_spd.calc(&pid_spd); //расчет регулятора скорости + + //выдача задания тока в фазы с положительным моментом, исходя из угла + switch (DPReCAP.Angle6) + { + case _IQ(0.0 / 6.0): + { + i_a_reg.ref = pid_spd.pid_out_reg3; + i_b_reg.ref = _IQ(-1); + i_c_reg.ref = pid_spd.pid_out_reg3; + break; + } + case _IQ(1.0 / 6.0): + { + i_a_reg.ref = pid_spd.pid_out_reg3; + i_b_reg.ref = _IQ(-1); + i_c_reg.ref = _IQ(-1); + break; + } + case _IQ(2.0 / 6.0): + { + i_a_reg.ref = pid_spd.pid_out_reg3; + i_b_reg.ref = pid_spd.pid_out_reg3; + i_c_reg.ref = _IQ(-1); + break; + } + case _IQ(3.0 / 6.0): + { + i_a_reg.ref = _IQ(-1); + i_b_reg.ref = pid_spd.pid_out_reg3; + i_c_reg.ref = _IQ(-1); + break; + } + case _IQ(4.0 / 6.0): + { + i_a_reg.ref = _IQ(-1); + i_b_reg.ref = pid_spd.pid_out_reg3; + i_c_reg.ref = pid_spd.pid_out_reg3; + break; + } + default: + { + i_a_reg.ref = _IQ(-1); + i_b_reg.ref = _IQ(-1); + i_c_reg.ref = pid_spd.pid_out_reg3; + break; + } + } + + i_a_reg.fdb = adc.Imeas_a; + i_b_reg.fdb = adc.Imeas_b; + i_c_reg.fdb = adc.Imeas_c; + + i_a_reg.calc(&i_a_reg); + i_b_reg.calc(&i_b_reg); + i_c_reg.calc(&i_c_reg); + + pwm.UPhARef = i_a_reg.out; + pwm.UPhBRef = i_b_reg.out; + pwm.UPhCRef = i_c_reg.out; + pwm.update(&pwm); + + /*DO END*/ + } + break; + } + + default: { + break; + } + } + +} + +/*@}*/ + diff --git a/Vsrc/SM_Net.c b/Vsrc/SM_Net.c new file mode 100644 index 0000000..d0c9206 --- /dev/null +++ b/Vsrc/SM_Net.c @@ -0,0 +1,225 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMNet.c + \brief Модуль общего назначения для работы с сетью. (см. TSM_Net) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup SMNet */ +/*@{*/ + +#include "DSP.h" +#include "V_IQmath.h" +#include "main.h" + +//!Инициализация. + +//!Присвоение масштабирующих коэффициентов, инициализация других модулей. +//! \memberof TSM_Net +void SM_Net_Init(TSM_Net *p) { + + p->state = 0; + p->state_prev = 0xff; + + //Настройка драйвера CANOpen + UserMem.init(&UserMem); + + co1_vars.settings.LoadParamsFromUserMemory_ena = 1;//Разрешить загружать значения параметров из ЭНОЗУ + co1_vars.CAN_REGS = (CAN_TypeDef *)CAN_BASE;//Передаем драйверу адрес структуры регистров CAN + co1_vars.settings.CAN_ISR_priority = IRQ_PRIORITY_CAN;//Присвоение приоритета перывания CAN (обработчик внутри библиотеки) + co1_vars.settings.CAN_IRQn = CAN1_IRQn;//Передаем номер прерывания CAN1 из таблицы прерываний в драйвер CANOpen + co1_vars.settings.MultiPDO_ena = 0;//Отключение обработки PDO без учета номера узла (спец. функция) + co1_vars.settings.RX_PDO_Callback_ena = 0; //Не вызывать функции обратного вызова при приеме PDO + co1_vars.settings.AutoBusON_ena = 1; //Автоматически перезапускать CAN при ошибках на линии + co1_vars.settings.BlockTransfer_ena = 1;//Разрешить блочную передачу (нужна для осциллографа) + co1_vars.settings.speedCANTablePointer = &canSpeedTable;//Передаем драйверу параметры для настройки скорости CAN + co1_vars.settings.resetCPU = Watchdog.resetCPU;//Передаем драйверу адрес функции ресета микроконтроллера + co1_Init(&co1_vars); //Инициализация драйвера CANOpen + + co2_vars.settings.LoadParamsFromUserMemory_ena = 1;//Разрешить загружать значения параметров из ЭНОЗУ + co2_vars.CAN_REGS = (CAN_TypeDef *)CAN_BASE;//Передаем драйверу адрес структуры регистров CAN + co2_vars.settings.CAN_ISR_priority = IRQ_PRIORITY_CAN;//Присвоение приоритета перывания CAN (обработчик внутри библиотеки) + co2_vars.settings.CAN_IRQn = CAN2_IRQn;//Передаем номер прерывания CAN2 из таблицы прерываний в драйвер CANOpen + co2_vars.settings.MultiPDO_ena = 0;//Отключение обработки PDO без учета номера узла (спец. функция) + co2_vars.settings.RX_PDO_Callback_ena = 0; //Не вызывать функции обратного вызова при приеме PDO + co2_vars.settings.AutoBusON_ena = 1; //Автоматически перезапускать CAN при ошибках на линии + co2_vars.settings.BlockTransfer_ena = 1;//Разрешить блочную передачу (нужна для осциллографа) + co2_vars.settings.speedCANTablePointer = &canSpeedTable;//Передаем драйверу параметры для настройки скорости CAN + co2_vars.settings.resetCPU = Watchdog.resetCPU;//Передаем драйверу адрес функции ресета микроконтроллера + co2_Init(&co2_vars); //Инициализация драйвера CANOpen + + //логгер событий: + // размер буфера: 50 + // стартовый адрес в SPI: 3000 + FaultLog.init((TLogger*)&FaultLog, 50, 3000,(Uint32*) &RTCclock.packed_time);//ниже указатель на время может быть переопределен в зависимости от работы часов + + + +#if (defined(CANTORS_ENA)) || (defined(CANTOUSB_ENA)) +//Работа с CANopen через UART (параллельно с CAN, нет конфликта) + CANtoRS.nodeID = (Uint16*)&co1_vars.co_nodeID; //Номер узла из CANopen + CANtoRS.callback = Z_co_receiveSDOrequest;//Указатель на функцию обратного вызова из драйвера CANopen по приходу SDO сообщения + CANtoRS.init(&CANtoRS); +#endif +#ifdef MODBUS_ENA + // Настраиваем MODBUS + ModBus.ExecutionFreq = 10000;//Частота вызова расчета модуля модбас в кГц + ModBus.Init(&ModBus); + MBVarsConv.init(&MBVarsConv); +#endif +} + +//!Медленный расчет. + +//! Присвоение масштабирующих коэффициентов, фоновый расчет некоторых модулей. + +//! \memberof TSM_Net +void SM_Net_Slow_Calc(TSM_Net *p) { + + co1_vars.co_scaleNum0 = 1; //без масштабирования + co1_vars.co_scaleNum1 = 100; // % + co1_vars.co_scaleNum2 = drv_params.freq_nom; //Гц + co1_vars.co_scaleNum3 = drv_params.U_nom;//напряжение фазное номинальное амплитудное + co1_vars.co_scaleNum4 = drv_params.I_nom; //Ток фазный базовый + co1_vars.co_scaleNum5 = 1; + co1_vars.co_scaleNum6 = 1; + co1_vars.co_scaleNum7 = drv_params.Udc_nom; //напряжение ЗПТ базовое + co1_vars.co_scaleNum8 = drv_params.power; //18 в формате 9.6 //Мощность + co1_vars.co_scaleNum9 = 1; + co1_vars.co_scaleNumA = 20; //температура + co1_vars.co_scaleNumB = 1; + co1_vars.co_scaleNumC = 1; + co1_vars.co_scaleNumD = 1; + co1_vars.co_scaleNumE = 1; + co1_vars.co_scaleNumF = 1; + co1_vars.co_scaleNum10 = 1; // + co1_vars.co_scaleNum11 = 1; // + co1_vars.co_scaleNum12 = drv_params.power; //18 в формате 10.6 //Мощность + co1_vars.co_scaleNum13 = 360; // + co1_vars.co_scaleNum14 = drv_params.speed_nom; //номинальная частота вращения + co1_vars.co_scaleNum15 = 1; // + co1_vars.co_scaleNum16 = 1; // + co1_vars.co_scaleNum17 = ((((long) drv_params.Udc_nom) << 6) + / (long) drv_params.I_nom); //Rбаз 10.6 + co1_vars.co_scaleNum18 = 1000; + co1_vars.co_scaleNum19 = 1; + co1_vars.co_scaleNum1A = 1; + co1_vars.co_scaleNum1B = 1; + co1_vars.co_scaleNum1C = 1; + co1_vars.co_scaleNum1D = 1; + co1_vars.co_scaleNum1E = 1; + co1_vars.co_scaleNum1F = 1; + + co2_vars.co_scaleNum0 = 1; //без масштабирования + co2_vars.co_scaleNum1 = 100; // % + co2_vars.co_scaleNum2 = drv_params.freq_nom; //Гц + co2_vars.co_scaleNum3 = drv_params.U_nom;//напряжение фазное номинальное амплитудное + co2_vars.co_scaleNum4 = drv_params.I_nom; //Ток фазный базовый + co2_vars.co_scaleNum5 = 1; + co2_vars.co_scaleNum6 = 1; + co2_vars.co_scaleNum7 = drv_params.Udc_nom; //напряжение ЗПТ базовое + co2_vars.co_scaleNum8 = drv_params.power; //18 в формате 9.6 //Мощность + co2_vars.co_scaleNum9 = 1; + co2_vars.co_scaleNumA = 20; //температура + co2_vars.co_scaleNumB = 1; + co2_vars.co_scaleNumC = 1; + co2_vars.co_scaleNumD = 1; + co2_vars.co_scaleNumE = 1; + co2_vars.co_scaleNumF = 1; + co2_vars.co_scaleNum10 = 1; // + co2_vars.co_scaleNum11 = 1; // + co2_vars.co_scaleNum12 = drv_params.power; //18 в формате 10.6 //Мощность + co2_vars.co_scaleNum13 = 360; // + co2_vars.co_scaleNum14 = drv_params.speed_nom; //номинальная частота вращения + co2_vars.co_scaleNum15 = 1; // + co2_vars.co_scaleNum16 = 1; // + co2_vars.co_scaleNum17 = ((((long) drv_params.Udc_nom) << 6) + / (long) drv_params.I_nom); //Rбаз 10.6 + co2_vars.co_scaleNum18 = 1000; + co2_vars.co_scaleNum19 = 1; + co2_vars.co_scaleNum1A = 1; + co2_vars.co_scaleNum1B = 1; + co2_vars.co_scaleNum1C = 1; + co2_vars.co_scaleNum1D = 1; + co2_vars.co_scaleNum1E = 1; + co2_vars.co_scaleNum1F = 1; + + drv_params.U_nom = 0.5759 * drv_params.Udc_nom;//номинальное фазное напряжение + drv_params.power = ((long) 300) << 6; //приведем к формату 10.6 + drv_params.freq_nom = ((float) drv_params.speed_nom * drv_params.p) / 60 + 0.5; //номин частота + + co_background_calc(&co1_vars); //Расчет драйвера CANOpen фоновый + co_background_calc(&co2_vars); //Расчет драйвера CANOpen фоновый + drv_interface.calc(&drv_interface); + FaultLog.background_calc(&FaultLog); +#ifdef MODBUS_ENA + MBVarsConv.slow_calc(&MBVarsConv); +#endif + + if (RTCclock.ClockOk)//часы работают? + FaultLog.time_ptr = (Uint32*) &RTCclock.packed_time; //время для банка аварий из часов + else + FaultLog.time_ptr = (Uint32*) &global_time.PowerOn_time;//если не работают, то из модуля подсчета времени наработки +} + +//!Быстрый расчет + +//!Быстрый расчет некоторых сетевых модулей, вызов методов "пролистывания" кодов аварий и предупреждений +//! \memberof TSM_Net +void SM_Net_ms_Calc(TSM_Net *p) { + //Перевод битового состояния системы управления в константу. + //По drv_status_code отображается статус привода в UniCON + if (drv_status.bit.ready == 1) + drv_status_code = DRV_STATUS_READY; + if (drv_status.bit.running == 1) + drv_status_code = DRV_STATUS_RUNNING; + if (drv_status.bit.testing == 1) + drv_status_code = DRV_STATUS_TESTING; + if (drv_status.bit.fault == 1) + drv_status_code = DRV_STATUS_FAULT; + if (drv_status.bit.alarm == 1) + drv_status_code |= DRV_STATUS_ALARM; + else + drv_status_code &= ~DRV_STATUS_ALARM; + if (drv_status.bit.overheat == 1) + drv_status_code = DRV_STATUS_OVERHEAT; + else + drv_status_code &= ~DRV_STATUS_OVERHEAT; + //функция листания аварий для пульта (UniCON) + pult_faults_lister.calc(&pult_faults_lister); + sm_prot.Main_ErrorCode = 0xFF & pult_faults_lister.output; + + co_1ms_calc(&co1_vars); //Расчет драйвера CANOpen + co_1ms_calc(&co2_vars); //Расчет драйвера CANOpen +#if (defined(CANTORS_ENA)) || (defined(CANTOUSB_ENA)) + CANtoRS.calc(&CANtoRS); +#endif +#ifdef MODBUS_ENA + MBVarsConv.calc(&MBVarsConv); +#endif + +} + +void SM_Net_fast_Calc(TSM_Net *p) { + +#ifdef MODBUS_ENA + ModBus.Execute(&ModBus); +#endif +} + +/*@}*/ diff --git a/Vsrc/SM_Protect.c b/Vsrc/SM_Protect.c new file mode 100644 index 0000000..02ba361 --- /dev/null +++ b/Vsrc/SM_Protect.c @@ -0,0 +1,277 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMProtect.c + \brief Модуль защит. (см. TSM_Protect) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup SMProtect + @{ */ + +#include "DSP.h" +#include "main.h" +#include "stdlib.h" + +int16 WriteCounter = 0; + +//!Инициализация + +//!Присваивание всяких переменных +//! \memberof TSM_Protect +void SM_Protect_Init(TSM_Protect *p) { + p->state_prev = 0xff; + p->state = 0x00; + +#if defined (HW_MOTORCONTROLBOARD) +/* + * Инициализация кнопки СБРОС АВАРИЙ не требуется, так как мы используем для этого дискретный вход + */ +#endif + +} + +//! Быстрый расчет. + +//!Обрабатывает все аварии и при их возникновении останавливает привод. +//! \memberof TSM_Protect +void SM_Protect_Fast_Calc(TSM_Protect *p) { + + //аппаратная авария от инвертора + if (pwm.PDP_Fault) { + if ((sm_ctrl.state != CTRL_STOP) && (sm_ctrl.state != CTRL_RUN)) + sm_prot.bit_fault1 |= F_PDPINT; + } + + if (!DRV_FAULT) { + //имеется какая-то аппаратная авария + sm_prot.bit_fault1 |= F_PDPINT; + } + +#if defined (HW_MOTORCONTROLBOARD) + if (!DRV_FAULT1) { + //имеется какая-то аппаратная авария + sm_prot.bit_fault2 |= F_PDP_SWITCH_A0; + } + + if (!DRV_FAULT2) { + //имеется какая-то аппаратная авария + sm_prot.bit_fault2 |= F_PDP_SWITCH_A1; + } + + if (!DRV_FAULT3) { + //имеется какая-то аппаратная авария + sm_prot.bit_fault2 |= F_PDP_SWITCH_A2; + } + + if (!DRV_FAULT4) { + //имеется какая-то аппаратная авария + sm_prot.bit_fault2 |= F_PDP_SWITCH_LOWER; + } +#endif + + /*Защита от пуска при незашунтированном реле плавного заряда ЗПТ*/ + if (udControl.Enabled == 1) { //Если есть цепь шунтирования ЗПТ, то выставляем аварии по выполнению условий + if (udControl.fault_start == 1) + sm_prot.bit_fault1 |= F_RELAY_START; + } + + /*Авария, если программа записана в загрузочную область памяти (BFLASH)*/ + if (programMemType == 0x4) { + sm_prot.bit_fault1 |= F_PROGRAM_IS_ON_BFLASH; + } + + /*Защита по максимальному току*/ + if (adc.Imeas_a > sm_prot.Imax_protect) + sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_A; + if (adc.Imeas_a < -sm_prot.Imax_protect) + sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_A; + if (adc.Imeas_b > sm_prot.Imax_protect) + sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_B; + if (adc.Imeas_b < -sm_prot.Imax_protect) + sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_B; + if (adc.Imeas_c > sm_prot.Imax_protect) + sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_C; + if (adc.Imeas_c < -sm_prot.Imax_protect) + sm_prot.bit_fault2 |= F_CTRL_MAX_I_PH_C; + + //при превышении скорости выше аварийной нормы + if (labs(cur_par.speed) > sm_prot.speed_max) { + sm_prot.bit_fault2 |= F_CTRL_SPEED_MAX; // максиммальное Ud + } + + //при превышении напряжения выше аварийной нормы + if (adc.Udc_meas > sm_prot.Umax_protect) { + sm_prot.bit_fault1 |= F_CTRL_HI_UDC; // максиммальное Ud + } + + //снижение напряжения + if (adc.Udc_meas < sm_prot.Umin_protect) { //если привод работал то ловим аварию + if (sm_ctrl.state != CTRL_STOP) { + sm_prot.bit_fault1 |= F_CTRL_LOW_UDC; + } + } + + //при превышении температуры выше аварийной нормы + if (adc.T_meas > sm_prot.T_max) { + sm_prot.bit_fault1 |= F_CTRL_HI_TEMP; // максимальная температура + } + +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + if(model.fault){ + sm_prot.bit_fault1 |= F_MODEL_FAULT; + } +#endif + + + DINT; //Запрещение прерываний + //Аварии, требующие полного останова + p->masked_bit_fault1 = p->bit_fault1 & p->mask_fault1;//маскирование флагов аварий + p->masked_bit_fault2 = p->bit_fault2 & p->mask_fault2; + EINT; //Разрешение прерываний + + + //считаем дискретный автомат защит + if (p->state_prev != p->state) //смена состояния? + p->E = 1;//Возводим флаг первого вхождения "entry" + else + p->E = 0;//иначе сбрасываем + p->state_prev = p->state; + + switch (p->state) {//в зависимости от текущего состояния + case PROT_OFF: { //Защита выключена + if (p->E == 1) { //Первое вхождение + } + + //Обнуляем все аварии + p->bit_fault1 = 0; + p->bit_fault2 = 0; + + //Пропускаем некоторый таймаут после включения контроллера + //чтобы не ловить ложные срабатывания аварий АЦП + if (p->powered_okCounter++ > 30000) { + p->state = PROT_ON_OK; + } + break; + } + + case PROT_ON_OK: { //Норма + if (p->E == 1) { //Первое вхождение + drv_status.bit.fault = 0; + } + //есть аварии? + if ((p->masked_bit_fault1 | p->masked_bit_fault2) != 0) { + p->state = PROT_FAIL; //переходим в состояние аварии + } + break; + } + + case PROT_FAIL: { //состояние аварии (сработала защита) + if (p->E == 1) { + cmd.all = 0; + } + drv_status.bit.fault = 1; + //Выключение ШИМ. Пока там все остальные дискретные автоматы пробурлятся, чтобы их не ждать + pwm.Off(&pwm); + //логика сбороса аварии + if ((cmd.bit.trip_reset == 1) || (RESET_FAULT_BUTTON == 1)) {//команда на сброс аварии + p->state = PROT_ON_OK;//идем в "норма" + p->clearDrvFault = 1; //отправить драйверу ключей команду сброса + //обнуляем все флаги аварий + p->bit_fault1 = 0; + p->bit_fault2 = 0; + cmd.all = 0;//командное слово + + if (udControl.Enabled == 1) { //Если есть цепь шунтирования ЗПТ, то сбрасываем возможные состояния аварий + udControl.fault_start = 0; + } + + //в самом низу!!! пытаемся сбросить флаг pdp аппаратный + //если авария все еще имеется, то сразу произойдет прерывание + //и возведется флаг аварии + if (PWM0->TZFLG_bit.OST == 1) { //имеется флаг аппаратной аварии + //флаг можно сбрасывать + PWM0->TZCLR = 0x7; + PWM1->TZCLR = 0x7; + PWM2->TZCLR = 0x7; + } + + #if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + model.fault=0; + #endif + + } + break; + } + } +} + +//! \memberof TSM_Protect +void SM_Protect_ms_Calc(TSM_Protect *p) { + if (WriteCounter <= 15) //если первое слово + { + if (((sm_prot.masked_bit_fault1 >> WriteCounter) & 0x1) != 0) //стоит ii-й флаг аварии + { + if (((sm_prot.bit_fault_written1 >> WriteCounter) & 0x1) == 0) //и она не записана + { + FaultLog.write(&FaultLog, WriteCounter + 1); + sm_prot.bit_fault_written1 |= (1 << WriteCounter); + } + } + else + sm_prot.bit_fault_written1 &= ~(1 << WriteCounter); + } + else if (WriteCounter <= 31) //второе слово + { + if (((sm_prot.masked_bit_fault2 >> (WriteCounter - 16)) & 0x1) != 0) //стоит ii-й флаг аварии + { + if (((sm_prot.bit_fault_written2 >> (WriteCounter - 16)) & 0x1) == 0) //и она только что поЯвилась + { + FaultLog.write(&FaultLog, WriteCounter + 1); + sm_prot.bit_fault_written2 |= (1 << (WriteCounter - 16)); + } + } + else + sm_prot.bit_fault_written2 &= ~(1 << (WriteCounter - 16)); + } + WriteCounter++; + if (WriteCounter >= (33 - 1)) + WriteCounter = 0; +} + +//! Медленный расчет. + +//! \memberof TSM_Protect +void SM_Protect_Slow_Calc(TSM_Protect *p) { + /* Проверка аппаратных защит драйвера. Он автоматически вырубает ключи при авариях, + * и опускает сигналы /FAULT и /OCTW, но чтобы понять, что именно случилось, надо по SPI прочитать статусы. + * Поэтому, видимо, можно в фоне. + */ + if (p->readDrvSts == 1) { + p->readDrvSts = 0; + drv8301.read(&drv8301); + + } + + /* Чтобы сбросить аварию, надо прописать ему битик GATE_RESET */ + if (p->clearDrvFault == 1) { + p->clearDrvFault = 0; + drv8301.CTRL1.bit.GATE_RESET = 1; + drv8301.write(&drv8301, CNTRL_REG_1_ADDR); + drv8301.write(&drv8301, CNTRL_REG_2_ADDR); + } +} + +/*@}*/ diff --git a/Vsrc/SM_Sys.c b/Vsrc/SM_Sys.c new file mode 100644 index 0000000..ae2f4f1 --- /dev/null +++ b/Vsrc/SM_Sys.c @@ -0,0 +1,302 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file SMSys.c + \brief Модуль-обертка для расчета остальных модулей. (см. TSM_Sys) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup SMSys */ +/*@{*/ +#include "main.h" + +/* Объявление адреса размещения таблицы векторов прерываний */ +#if defined ( __CMCPPARM__ ) + extern const Uint32 __Vectors; +#elif defined (__GNUC__) + +#endif + +//! Инициализация системы управления после включения + +//!Инициализация некоторых модулей и настройка прерываний системы. +//!Здесь настраивается большинство прерываний +//! \memberof TSM_Sys +void SM_Sys_Init(TSM_Sys *p) { +#if defined (HW_VECTORCARD_DRV8301_EVM) + sw.HardwareType = 0; +#elif defined (HW_VECTORCARD_DRV8312_EVM) + sw.HardwareType = 1; +#elif defined (HW_VECTORCARD_SIMULATOR) + sw.HardwareType = 2; +#elif defined (HW_MOTORCONTROLBOARD) + sw.HardwareType = 3; +#endif + cmd.all = 0; + drv_status.all = 0; + adc.init(&adc); //Инициализация АЦП + sm_net.init(&sm_net); //Сетевая часть + sm_prot.init(&sm_prot); //Защиты + drv8301.init(&drv8301);//драйвер ключей + sm_cmd_logic.init(&sm_cmd_logic); //Логика включения/выключения + sm_ctrl.init(&sm_ctrl); //Структура системы управления + pwm.init(&pwm); //Модуль ШИМ + cur_par.init(&cur_par); //Расчет текущих показателей привода + leds.init(&leds);//светодиоды + udControl.init(&udControl); //плавная зарядка ЗПТ через термисторы + DIO_Init(); //дискретные входы/выходы + FanControl.init(&FanControl); //вентилятор + //глобальное времЯ (внешние или внутр. часы) + global_time.init(&global_time); + if (drv_params.sens_type == POS_SENSOR_TYPE_HALL){ //В типе датчика выбран ДПР на элементах Холла + DPReCAP.Init(&DPReCAP); //ДПР иниц. + } + if (drv_params.sens_type == POS_SENSOR_TYPE_ENCODER){ //В типе датчика выбран энкодер + //настроим квадратурный декодер + posspeedEqep.speed_nom = drv_params.speed_nom; //базовая скорость + posspeedEqep.pole_pairs = drv_params.p; //кол-во пар полюсов дригателя + posspeedEqep.Posspeed_CTL.bit.dir = 1; //направление движения + posspeedEqep.RevolutionCounter=0; + posspeedEqep.init(&posspeedEqep);//инициализация модуля энкодера + } + if (drv_params.sens_type == POS_SENSOR_TYPE_SSI){ //В типе датчика выбран датчик с SSI интерфейсом. Читайте заголовочник модуля перед использованием! + //настроим модуль датчика положения SSI + SSI_Encoder.speed_nom = drv_params.speed_nom; //базовая скорость + SSI_Encoder.pole_pairs = drv_params.p; //кол-во пар полюсов дригателя + SSI_Encoder.rotation_dir = 0; //направление движения + SSI_Encoder.RevolutionCounter=0; + SSI_Encoder.init(&SSI_Encoder);//Датчик положения SSI + } + if (drv_params.sens_type == POS_SENSOR_TYPE_ENC_HALL){ + //настроим квадратурный декодер + DPReCAP.Init(&DPReCAP); //ДПР иниц. + posspeedEqep.speed_nom = drv_params.speed_nom; //базовая скорость + posspeedEqep.pole_pairs = drv_params.p; //кол-во пар полюсов дригателя + posspeedEqep.Posspeed_CTL.bit.dir = 1; //направление движения + posspeedEqep.RevolutionCounter=0; + posspeedEqep.init(&posspeedEqep);//инициализация модуля энкодера + } + + //листалка аварий для отображения на пульте управления (UniCON) + pult_faults_lister.num_of_words = 2; + pult_faults_lister.out_refresh_devisor = 1000; //при вызове в мс таймере период обновления будет равен 1сек + pult_faults_lister.w_ptrs[0] = (Uint16*) &sm_prot.masked_bit_fault1;//перебираются эти флаги аварий модуля защит + pult_faults_lister.w_ptrs[1] = (Uint16*) &sm_prot.masked_bit_fault2; + + AutoOffset.FilterK = _IQ(0.00001);//постоянная времени фильтра для автосмещения АЦП + AutoOffset.init(&AutoOffset); //авто смещение некоторых каналов АЦП (токи) + +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + //model.motorInternals.udc = 540; //задается через словарь объектов + model.tpr = _IQ10div(_IQ10(APB0BusClock/1000.0), pwm.Frequency << 1) >> 10; //период частоты ШИМ + model.dt = _IQ4mpy(_IQ4(150 / 4), pwm.DeadBand >> 20) >> 4; //величина мертвого времени + model.Init(&model); //Модель двигателя +#endif + + // Настройка таймера 0 на 10 кГц + TMR0->INTSTATUS_bit.INT = 1; + TMR0->LOAD_bit.VAL = (APB0BusClock / 10000L) - 1; //9999 надо чтобы не плыло отностильно прерывания ШИМа, когда у того частота 10кГц + TMR0->CTRL = ((1 << 0) | (1 << 3)); // Запуск и разрешение прерываний + + // Настройка таймера 1 на 1 кГц + TMR1->INTSTATUS_bit.INT = 1; + TMR1->LOAD_bit.VAL = (APB0BusClock / 1000L) - 1; + TMR1->CTRL = ((1 << 0) | (1 << 3)); // Запуск и разрешение прерываний + + //Для подсчета тактов + TMR2->LOAD_bit.VAL = 0xFFFFFFFF; + TMR2->CTRL = (1 << 0); // Запуск + + extern int *g_pfnVectors; //там, где-то в стартап файле есть такой символ + //Надо показать в этом регистре, где лежит таблица прерываний. + //А лежит она там, куда записал её линкер, в зависимости от файла компоновки. + //Поэтому берем адрес от массива g_pfnVectors и кладем туда +#if defined (__CMCPPARM__) + SCB->VTOR = (uint32_t) (&__Vectors); +#elif defined (__GNUC__) + extern int *g_pfnVectors; + SCB->VTOR = (uint32_t) (&g_pfnVectors); +#endif + NVIC_SetPriorityGrouping(3); // 4 bit preemption, 0 bit of subprio + + NVIC_DisableIRQ(TMR0_IRQn); + NVIC_DisableIRQ(TMR1_IRQn); + NVIC_DisableIRQ(ECAP0_IRQn); + NVIC_DisableIRQ(ECAP1_IRQn); + NVIC_DisableIRQ(ECAP2_IRQn); + NVIC_DisableIRQ(PWM0_TZ_IRQn); + NVIC_DisableIRQ(QEP0_IRQn); + + NVIC_ClearPendingIRQ(TMR0_IRQn); + NVIC_ClearPendingIRQ(TMR1_IRQn); + NVIC_ClearPendingIRQ(ECAP0_IRQn); + NVIC_ClearPendingIRQ(ECAP1_IRQn); + NVIC_ClearPendingIRQ(ECAP2_IRQn); + NVIC_ClearPendingIRQ(PWM0_TZ_IRQn); + NVIC_ClearPendingIRQ(QEP0_IRQn); + + /* Прерывание 10 кГц */ + NVIC_EnableIRQ(TMR0_IRQn); + NVIC_SetPriority(TMR0_IRQn, IRQ_PRIORITY_10K); + + /* Прерывание 1 кГц */ + NVIC_EnableIRQ(TMR1_IRQn); + NVIC_SetPriority(TMR1_IRQn, IRQ_PRIORITY_1K); + + NVIC_EnableIRQ(ECAP0_IRQn); //CAP0 + NVIC_SetPriority(ECAP0_IRQn, IRQ_PRIORITY_CAP); + + NVIC_EnableIRQ(ECAP1_IRQn); //CAP1 + NVIC_SetPriority(ECAP1_IRQn, IRQ_PRIORITY_CAP); + + NVIC_EnableIRQ(ECAP2_IRQn); //CAP2 + NVIC_SetPriority(ECAP2_IRQn, IRQ_PRIORITY_CAP); + + NVIC_EnableIRQ(PWM0_TZ_IRQn); //PDP (в инверторе тексас нету такого пина) + NVIC_SetPriority(PWM0_TZ_IRQn, IRQ_PRIORITY_TZ); + + NVIC_EnableIRQ(QEP0_IRQn); //QEP + NVIC_SetPriority(QEP0_IRQn, IRQ_PRIORITY_EQEP); + + sm_sys.state = SYS_READY; + + gpioPeripheralInit(); +#ifdef WATCHDOG_ON + WatchDog.init(WATCHDOG_PERIOD); //если сторожевой таймер используется, инициализируем +#endif //WATCHDOG_ON +} + + +//!Быстрый расчет (обычно 10кГц). + +//!Вызов быстрых расчетов модулей системы управления +//! \memberof TSM_Sys +void SM_Sys_Fast_Calc(TSM_Sys *p) { + sm_net.fast_calc(&sm_net);//расчет коммуникационных драйверов + if (drv_params.sens_type == POS_SENSOR_TYPE_ENCODER) //В типе датчика выбран энкодер + posspeedEqep.calc(&posspeedEqep); //ДПР энкодер + if (drv_params.sens_type == POS_SENSOR_TYPE_HALL){ //В типе датчика выбран ДПР Холла + DPReCAP.AngleCalc(&DPReCAP); //ДПР Холл, интерполяция угла положения (результат в DPReCAP.Angle) + DPReCAP.Angle6Calc(&DPReCAP); //ДПР Холл, получение угла с точнгстью 60 градусов (результат в DPReCAP.Angle6) + DPReCAP.SpeedCalc(&DPReCAP); //ДПР Холл, расчет скорости вращения (DPReCAP.speed) + DPReCAP.calc_10k(&DPReCAP); //ДПР Холл, служебные функции + } + if (drv_params.sens_type == POS_SENSOR_TYPE_SSI){ //Датчик с интерфейсом SSI. Перед употреблением читайте заголовочный файл! + SSI_Encoder.calc(&SSI_Encoder);//Датчик положения SSI + } + +// adc.fast_calc(&adc); //АЦП + dlog.update(&dlog); //Осциллографирование данных + sm_prot.fast_calc(&sm_prot); //Защиты + sm_ctrl.fast_calc(&sm_ctrl); //Главный дискретный автомат системы управления + udControl.calc(&udControl);//Плавная зарядка ЗПТ через термисторы + +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + //Передача текущих скважностей таймеров ШИМ в модель + model.cmpr0 = PWM0->CMPA_bit.CMPA; + model.cmpr1 = PWM1->CMPA_bit.CMPA; + model.cmpr2 = PWM2->CMPA_bit.CMPA; + model.InvertorEna=pwm.Enabled;//Флаг разрешения работы инвертора + model.Execute(&model); +#endif + + global_time.calc(&global_time); + + cur_par.calc(&cur_par); //Расчет текущих показателей привода + drv_params.sens_type = drv_params.sens_type & 7; //Отсекаем верхнюю часть переменной, там мусор + +#ifdef WATCHDOG_ON + WatchDog.calc();//если сторожевой таймер используется, сбрасываем его здесь +#endif //WATCHDOG_ON +} + +//!Миллисекундный расчет 1кГц. + +//!Вызов расчетов модулей системы управления, требующих миллисекундной дискретизации +//! \memberof TSM_Sys +void SM_Sys_ms_Calc(TSM_Sys* p) { + sm_cmd_logic.ms_calc(&sm_cmd_logic); //Обработка команд управления + sm_net.ms_calc(&sm_net); //обертка для вызова коммуникационных драйверов + adc.ms_calc(&adc); //АЦП + sm_prot.ms_calc(&sm_prot); //Защиты + AutoOffset.ms_calc(&AutoOffset); //авто смещение некоторых каналов АЦП + //блочная передача драйвера CANopen. Через неё, в частности, грузятся осциллограммы dlog + Can1BTInterface.ms_calc(&Can1BTInterface, TMR2->VALUE, &co1_vars); + Can2BTInterface.ms_calc(&Can2BTInterface, TMR2->VALUE, &co2_vars); + leds.msCalc(&leds);//светодиоды + RTCclock.msCalc(&RTCclock);//часы + UserMem.ms_calc(&UserMem);//пользовательская память в МК + if ((drv_params.sens_type == 2) || (drv_params.sens_type == 3)){ //В типе датчика выбран ДПР Холла + DPReCAP.ms_calc(&DPReCAP); + } + global_time.ms_calc(&global_time); + + DIO_fast_calc(); //дискретные входы/выходы +} + +//!Медленный расчет (фоновый). + +//!Вызов медленных расчетов остальных модулей +//! \memberof TSM_Sys +void SM_Sys_Slow_Calc(TSM_Sys *p) { + Can1BTInterface.slow_calc(&Can1BTInterface);//интерфейс блочной передачи CANopen, медленный расчет + Can2BTInterface.slow_calc(&Can2BTInterface);//интерфейс блочной передачи CANopen, медленный расчет + UserMem.slow_calc(&UserMem);//пользовательская память в МК + RTCclock.slowCalc(&RTCclock);//часы реального времени + sm_prot.slow_calc(&sm_prot);//модуль защит + sm_net.slow_calc(&sm_net); //обертка для вызова коммуникационных драйверов + dlog.background_analizer(&dlog); //фоновый обработчик модуля осциллографирования + global_time.slow_calc(&global_time); + rmp.slow_calc(&rmp); //пересчет интенсивности разгона из пользовтельской во внутреннее представление + pwm.slow_calc(&pwm); //фоновый обработчик модуля ШИМ (пересчет пользовательских заданий) + adc.slow_calc(&adc); //Фоновый обработчик АЦП + cur_par.slow_calc(&cur_par); //Расчет текущих показателей привода + AutoOffset.slow_calc(&AutoOffset); + posspeedEqep.slow_calc(&posspeedEqep);//инициализация модуля энкодера + RotorObserver.slow_calc(&RotorObserver);//наблюдатель потока ротора АД + DIO_slow_calc(); //дискретные входы/выходы + FanControl.slow_calc(&FanControl);//вентилятор + + + //Пересчет коэффициентов для масштабирования токов и напряжений + drv_params._1_Udc_nom = _IQdiv(_IQ16(1), _IQ16(drv_params.Udc_nom)); + drv_params._1_I_nom = _IQdiv(_IQ16(1), _IQ16(drv_params.I_nom)); + drv_params._1_U_nom = _IQdiv(_IQ16(1), _IQ16(drv_params.U_nom)); + + if (sw.Reboot & 1) { //команда перезагрузки + sw.Reboot = 0; //сбрасываем её + if (sm_ctrl.state == CTRL_STOP) { //перезагружаемся только в останове + //выполняем сброс проца + //Перезагружает во флеш! + Watchdog.resetCPU(); + } + } + + //вызов расчета смещения АЦП для токов фаз + //Делаем расчет только в останове и отсутствии аварии + if ((sw.AutoOffset & 1) && +#ifdef HW_VECTORCARD_DRV8301_EVM + (sm_prot.state==PROT_ON_OK) && //условие отсутствия аварии проверяем только на железе HW_VECTORCARD_DRV8301_EVM, потому что там нельзя измерять токи при аварии +#endif + (sm_ctrl.state == CTRL_STOP)){ + AutoOffset.Enabled=1; + } else + AutoOffset.Enabled=0; + +} +/*@}*/ + diff --git a/Vsrc/V_AutoOffset.c b/Vsrc/V_AutoOffset.c new file mode 100644 index 0000000..f8d67e8 --- /dev/null +++ b/Vsrc/V_AutoOffset.c @@ -0,0 +1,73 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_AutoOffset.c + \brief Автосмещение АЦП (см. TAutoOffset) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + @{ + */ + +/** \addtogroup TAutoOffset */ +/*@{*/ + +#include "DSP.h" +#include "v_IQmath.h" +#include "V_adc.h" +#include "V_AutoOffset.h" +#include "V_common.h" + +extern TAdcDrv adc; +extern TDrvParams drv_params; + +void AutoOffset_init(TAutoOffset *p) { + p->FilterK = _IQ(0.001); +} + +void AutoOffset_calc(TAutoOffset *p) { + //интеграторы для токов фаз. Когда модуль вызывается, токи должны быть нулевыми. + //если это не так, то интеграторы пойдут считать + p->IA_int = p->IA_int + _IQmpy(p->FilterK, adc.Imeas_a); + p->IB_int = p->IB_int + _IQmpy(p->FilterK, adc.Imeas_b); + p->IC_int = p->IC_int + _IQmpy(p->FilterK, adc.Imeas_c); +} + +void AutoOffset_slow_calc(TAutoOffset *p) { + + long IA_pu; + long IB_pu; + long IC_pu; + + if (p->Enabled){//если модуль авторасчета смещения токов включен + //пересчитываем из о.е. обратно в значения АЦП + IA_pu = -p->IA_int / (_IQ16mpy(adc.Imeas_a_gain, drv_params._1_I_nom)); + adc.Imeas_a_offset = IA_pu >> 1; + + IB_pu = -p->IB_int / (_IQ16mpy(adc.Imeas_b_gain, drv_params._1_I_nom)); + adc.Imeas_b_offset = IB_pu >> 1; + + IC_pu = -p->IC_int / (_IQ16mpy(adc.Imeas_c_gain, drv_params._1_I_nom)); + adc.Imeas_c_offset = IC_pu >> 1; + } else {//модуль выключен, инициализируем интеграторы текущими значенями смещений + p->IA_int=-(((long)adc.Imeas_a_offset)<<1)*_IQ16mpy(adc.Imeas_a_gain, drv_params._1_I_nom); + p->IB_int=-(((long)adc.Imeas_b_offset)<<1)*_IQ16mpy(adc.Imeas_b_gain, drv_params._1_I_nom); + p->IC_int=-(((long)adc.Imeas_c_offset)<<1)*_IQ16mpy(adc.Imeas_c_gain, drv_params._1_I_nom); + } + +} + +/*@}*/ + diff --git a/Vsrc/V_CANtoRS.c b/Vsrc/V_CANtoRS.c new file mode 100644 index 0000000..26904a4 --- /dev/null +++ b/Vsrc/V_CANtoRS.c @@ -0,0 +1,410 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_CANtoRS.c + \brief Преобразователь посылок CAN в RS/USB и обратно. Работает +совместно с драйвером CANOpen + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 3.0 08/08/2017 + + \addtogroup v_CANtoRS +@{ +*/ +#include "DSP.h" +#include "main.h" + + +void usb_irq_en(void); +void usb_irq_dis(void); +//! \memberof TCANtoRS +void CANtoRS_init(TCANtoRS *p) { +#ifdef CANTORS_ENA +#ifdef HW_NIIET_BOARD_SIMULATOR +//UART TX - плата микроконтроллера разъем XP6 пин 57 (соответствует обозначению UART_TXD1 в шелкографии на основной плате) +//UART RX - плата микроконтроллера разъем XP6 пин 59 (соответствует обозначению UART_RXD1 в шелкографии на основной плате) + NT_COMMON_REG->GPIOPCTLA_bit.PIN3 = 1; //UART_TxD1] + NT_COMMON_REG->GPIOPCTLA_bit.PIN4 = 1; //UART_RxD[1] + NT_GPIOA->ALTFUNCSET = (1 << 3); + NT_GPIOA->ALTFUNCSET = (1 << 4); + + NT_COMMON_REG->GPIOPCTLA_bit.PIN3 = 0; + NT_COMMON_REG->GPIOPCTLA_bit.PIN4 = 0; + + p->NT_UART=NT_UART1;//Используемый в драйвере номер UART (1,2,3) + +#elif defined (HW_MOTORCONTROLBOARD) + p->NT_UART=UART2;//Используемый в драйвере номер UART (1,2,3) + + p->NT_UART->CR_bit.UARTEN = 1; // Разрешить работу UART +#else + p->NT_UART=UART2;//Используемый в драйвере номер UART (1,2,3) + p->NT_UART->CR_bit.UARTEN = 1; // Разрешить работу UART +#endif + + + p->NT_UART->CR_bit.UARTEN = 1; // Разрешить работу UART + + // Настройка частоты в двух регистрах: + // задание делителя частоты для получения BaudRate + // Т.к. блок UART тактируется с частотой 25 МГц (так настроено в ините микроконтроллера), + // то для получения частоты 57600 бит/с необходим + // делитель 25000000 / (16 * 57600) = 27,126736111111111111111111111111 + // Целая часть I = 27 + // Дробная часть F = (int)( 0.126736111*64 + 0.5 ) = 8 + // Формулы см. в документации + p->NT_UART->IBRD_bit.DIVINT= 27; + p->NT_UART->FBRD_bit.DIVFRAC = 8; + + + + p->NT_UART->LCRH_bit.SPS = 0; // Нет проверки четности + p->NT_UART->LCRH_bit.WLEN = 3; // Длина посылки 8 бит + p->NT_UART->LCRH_bit.FEN = 1; // Использовать FIFO + p->NT_UART->CR_bit.TXE = 1; // Разрешить приём + p->NT_UART->CR_bit.RXE = 1; // Разрешить передачу + p->NT_UART->LCRH_bit.STP2 = 0; // 1 стоп-бит +#endif +#ifdef CANTOUSB_ENA + USB_init_hardware(); + +#endif + p->CounterWrongCRC=0; + p->CounterRes=0; + p->CounterSended=0; + p->PacketInWait=0; + +} + + + +//! Из заданного для передачи массива функция формирует +//!API пакет, а затем вызывает функцию +//!побайтовой отправки + + //! \memberof TCANtoRS +Uint16 CANtoRS_SendP(Uint16* Data, int16 len, TCANtoRS *p) { + volatile int16 i; + Uint16 MyCRC; + p->buf_out[0]=0x7E; + for (i=0;ibuf_out[i+1]=Data[i]; + MyCRC=CANtoRS_C_CRC(p,Data,len); + p->buf_out[len+1]=MyCRC & 0xFF;//первый байт + p->buf_out[len+2]=(MyCRC>>8) & 0xFF;//второй байт + p->all_len=1+len+2;//полная длина=сигнатура+данные + контрольная сумма + + i = 0; + +#ifdef CANTORS_ENA + // Если буфер TX не заполнен, то отправляем все байты из буфера + while ((p->NT_UART->FR_bit.TXFF != 1) && (i < p->all_len)){ + p->NT_UART->DR = p->buf_out[i]; + i++; + } +#endif + +#ifdef CANTOUSB_ENA + usb_irq_dis(); + if (usbTxBuf.busy == 0 && usbTxBuf.availSpace(&usbTxBuf) > p->all_len){ + usbTxBuf.put(&usbTxBuf, p->all_len, (Uint8*)p->buf_out); + } + usb_irq_en(); +#endif + + return 1; +} + + + +#define CRC_MAGIC_NUMBER 0xA001 +//! Функция считает контрольную сумму пакета +//! и сравнивает с принятой. Если все верно, то возвращает 1 + //! \memberof TCANtoRS +#if defined (__GNUC__) +__attribute__((section(".fastcode"))) +#endif +Uint16 CANtoRS_C_CRC(TCANtoRS *p,Uint16 *Data,Uint16 len) { //проверка контрольной суммы принятого API пакета + int16 i,j; + Uint16 MyCalcCRC=0xFFFF; + + for (j=0;j>1); + MyCalcCRC=MyCalcCRC^CRC_MAGIC_NUMBER; + } else + MyCalcCRC=(MyCalcCRC>>1); + } + + return MyCalcCRC; +} + + + +/*! Функция вызывается, когда пришли какие-то данные, +и обрабатывает их как переданный CAN пакет. Выделяет +идентификатор, длину и прочее. Рез-т помещает в структуру +p->MSG */ + //! \memberof TCANtoRS +void CANtoRS_Analysis(TCANtoRS *p) { + int16 i,j; + //посылка данных начинается с 12го байта, + //до этого служебная информация API пакета + p->MSG.id=0; + p->MSG.id=(p->ReadPackData[0] & 7)<<8; //нижние 3 бита сдвигаем наверх; + p->MSG.id|=p->ReadPackData[1]; + p->MSG.dlc=(p->ReadPackData[0]>>4) & 0xF; //верхние 4 бита сдвигаем вниз; длина посылки + for (i=2,j=0;iMSG.data[j]=p->ReadPackData[i]; + p->callback_go=1; +} + +/*! Функция вызывается, когда пришли какие-то данные, + * и проверяет, что эти данные корректны и могут быть обработаны + * драйвером CANopen. Если это так - данные отправляются на + * обработку + */ + //! \memberof TCANtoRS +#if defined (__GNUC__) +__attribute__((section(".fastcode"))) +#endif +void CANtoRS_CheckPacketValid(TCANtoRS *p) { + Uint8 i; + Uint16 readCRC, calcCRC; // Расчётная и пришедшая контрольные суммы + + // Сначала проверим, не хотел ли предыдуищй принятый пакет запустить колбэк + // Если хотел - то выполним, а уже при следующем вызове проверим, пришли ли данные, чтобы не сильно загружать процессор + if (p->callback_go) { + p->callback_go = 0; + p->CounterRes++; + p->callback(&co1_vars, (TZCanMsg*)&(p->MSG)); + return; + } + // Посмотрим, сколько байт начитали в буфер. Если меньше, чем нужно (13) - выходим и ждём следующего раза. + // Если насчитали - сбрасываем счётчик принятых байт и идём проверять посылку + if (p->ReadPackDataCounter < 13) + return; + + p->ReadPackDataCounter = 0; + + // Сначала проверяем сигнатуру, первый байт посылки (должна быть 0x7E) + // Если сигнатура не сошлась - сбрасываем счётчик начитанных байтов, и увеличиваем число потерянных пакетов + if (p->tempBuf[0] != 0x7E){ + p->MessDrop3++; + return; + } + + // Если сигнатура сошлась - следующие 10 байт кладём в DATA + for (i = 0; i < CANTORS_READ_DATA_MAX_LEN; i++){ + p->ReadPackData[i] = p->tempBuf[i + 1]; + } + + // Теперь забираем последние два байт посылки - CRC. Сраниваем пришедшую CRC и расчётную. + // Если не сошлось - выходим отседова. + readCRC = ((Uint16)(p->tempBuf[12]) << 8) | ((Uint16)(p->tempBuf[11])); + calcCRC = CANtoRS_C_CRC(p, (Uint16*)p->ReadPackData, CANTORS_READ_DATA_MAX_LEN); + if (readCRC != calcCRC) { + p->CounterWrongCRC++; + return; + } + + // Контрольная сумма сошлась - анализируем пакет + CANtoRS_Analysis(p); + + // Может получится, что в результате обработки пакета мы увидели необходимость вызвать коллбэк. + // В таком случае будет взведён флаг "callback_go". Если это так - мы его обработаем при следующем + // вызове функции, чтобы не тратить слишком много времени. А пока выходим. + return; + +} + +//! Функция для приёма данных от периферии RS +//! \memberof TCANtoRS +#if defined (__GNUC__) +__attribute__((section(".fastcode"))) +#endif +void CANtoRS_ReceiveRS(TCANtoRS *p) { + // Читаем из фифо данные, пока они там есть, либо пока фифо не опустеет + while ((p->NT_UART->FR_bit.RXFE != 1) && (p->ReadPackDataCounter < 13)) { + // Если что-то пришло по RS, а в прошлый раз приходило по USB - надо обнулить ReadDataCounter + if (p->lastActiveConnection == CANTOUSB_ACTIVE) + p->ReadPackDataCounter = 0; + + p->tempBuf[p->ReadPackDataCounter] = p->NT_UART->DR_bit.DATA; + p->ReadPackDataCounter++; + + // Указываем, что сейчас активен RS + p->lastActiveConnection = CANTORS_ACTIVE; + } +} + +//! Функция для приёма данных от периферии USB +//! \memberof TCANtoRS +#if defined (__GNUC__) +__attribute__((section(".fastcode"))) +#endif +void CANtoRS_ReceiveUSB(TCANtoRS *p) { +// Uint16 neededBytes; +// Uint16 tempLen; +// // Проверяем, сколько есть данных в буфере. +// // Если больше, чем нам надо - читаем сколько надо. +// // Если меньше, чем надо - читаем всё. +// usb_irq_dis(); +// tempLen = usbRxBuf.filledSpace(&usbRxBuf); +// if (tempLen > 0){ +// // Если что-то пришло по USB, а в прошлый раз приходило по RS - надо обнулить ReadDataCounter +// if (p->lastActiveConnection == CANTORS_ACTIVE) +// p->ReadPackDataCounter = 0; +// +// neededBytes = 13 - p->ReadPackDataCounter; +// +// if (tempLen >= neededBytes) { +// usbRxBuf.get(&usbRxBuf, neededBytes, (Uint8*)(p->tempBuf + p->ReadPackDataCounter)); +// p->ReadPackDataCounter += neededBytes; +// } else { +// usbRxBuf.get(&usbRxBuf, tempLen, (Uint8*)(p->tempBuf + p->ReadPackDataCounter)); +// p->ReadPackDataCounter += tempLen; +// } +// +// // Указываем, что у нас был активен USB +// p->lastActiveConnection = CANTOUSB_ACTIVE; +// } +// usb_irq_en(); +} + +//! Функция для приёма и обработки данных от периферии/ +//! Работает сразу и с USB, и с RS +//! \memberof TCANtoRS +#if defined (__GNUC__) +__attribute__((section(".fastcode"))) +#endif +void CANtoRS_Receive(TCANtoRS *p) { + +#ifdef CANTORS_ENA + // Если RS-модуль задействован - обрабатываем UART + CANtoRS_ReceiveRS(p); +#endif + +#ifdef CANTOUSB_ENA + // Если USB задействован - обрабатываем USB + CANtoRS_ReceiveUSB(p); +#endif + + // Проверяем пришедшие данные + CANtoRS_CheckPacketValid(p); +} + + +/*! Должна вызываться каждую секунду и отсылает +CAN пакеты HeartBeat. Если отослать не выходит (передача занята), +то сокращает последующий таймаут и, немного обождав, пытается +отправить заново */ + //! \memberof TCANtoRS +void CANtoRS_HeartBeat(TCANtoRS *p) { + TZCanMsg MSG; + int16 i; + MSG.id = 0xE << 7; //heartbeat + MSG.id |= *p->nodeID; //номер узла + MSG.dlc = 1; //длина + for (i = 0; i < 8; MSG.data[i++] = 0); //очистка + MSG.data[0] = 5; //данные heartbeat + if (!CANtoRS_Write(&MSG, p)) { //если не получилось отправить + p->HeartCounter = (CANTORS_HEART_COUNTER_MAX - 3); //вскоре пробуем сделать это еще раз + p->HeartBeatGo = 1; //и если будет событие на отправку SDO, но будет знать, что надо пропустить + } else { + p->HeartBeatGo = 0; + } +} + + + //! \memberof TCANtoRS +Uint16 CANtoRS_WriteHelper(TZCanMsg* MSG,TCANtoRS *p) { + if (p->HeartBeatGo) { //хочет отправиться HeartBeat + CANtoRS_HeartBeat(p); + p->MessDrop1++; + return 0;//сообщение теряем... + } + if (CANtoRS_Write(MSG,p)) + p->CounterSended++; + else { + p->MessDrop2++; + + return 0; + } + return 1; +} + + +/*! Из структуры CAN пакета формирует массив-посылку, +где вначале 4 бита - длина, потом 1 бит пропуск и 11 идентификатор. +Далее непосредственно данные. После конструирования посылка отправляется*/ + //! \memberof TCANtoRS +Uint16 CANtoRS_Write(TZCanMsg* MSG,TCANtoRS *p) { + if (!p->PacketInWait) { //нет пакета в буфере + //копируем во временный буфер + p->bufMSG=*MSG; + p->PacketInWait=1;//флаг, что в буфере что-то есть + return 1; + //считается, что буфера на 1 позицию должно хватать + } else + return 0; +} + + //! \memberof TCANtoRS +Uint16 CANtoRS_Write_Real(TZCanMsg* MSG,TCANtoRS *p) { + int16 i; + + p->TempData[0]=(MSG->dlc & 0xF)<<4; + p->TempData[0]|=(MSG->id >> 8) & 7; + p->TempData[1]=MSG->id & 0xFF; + for (i=0;i<8;i++) p->TempData[i+2]=MSG->data[i]; + CANtoRS_SendP((Uint16*)p->TempData,10,p); + return 1; +} + +/*! Вызывается из миллисекундного таймера, отсчитывает 1 секунду +и вызывает функцию отправки HeartBeat. Заодно проверяет, +если в SCI возникла какая-то ошибка и он остановился, перезапускает. + */ + + //! \memberof TCANtoRS +#if defined (__GNUC__) +__attribute__((section(".fastcode"))) +#endif +void CANtoRS_calc(TCANtoRS *p) { + + //если в буфере есть пакет, ожидающий отправки и передатчик свободен и не ждет heartbeat + if (p->PacketInWait) { + if (!CANtoRS_Write_Real((TZCanMsg*)&p->bufMSG, p))//отправить не удалось? + p->MessDrop2++; + p->PacketInWait=0;//очищаем буфер + } + else{//если пакета на отправк нет, обрабатывается всё остальное. Можно бы и обрабатывать сразу, но не хватает ресурсов + CANtoRS_Receive(p); + p->HeartCounter++; //счетчик для HeartBeat + + //не пора ли отправить HeartBeat? + if (p->HeartCounter>=(CANTORS_HEART_COUNTER_MAX-1)) { + p->HeartCounter=0; + CANtoRS_HeartBeat(p); + } + + } +} + + + +/*@}*/ diff --git a/Vsrc/V_CurPar.c b/Vsrc/V_CurPar.c new file mode 100644 index 0000000..c140b90 --- /dev/null +++ b/Vsrc/V_CurPar.c @@ -0,0 +1,89 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_CurPar.c + \brief Расчет наблюдаемых текущих параметров (см. TCurPar) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup V_CurPar */ +/*@{*/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "DSP.h" // Device Headerfile and Examples Include File +#include "V_IQmath.h" // библиотека IQmath +#include "V_CurPar.h" // заголовочный файл +#include "main.h" +#ifdef __cplusplus +} +#endif + +//! Инициализация модуля + +//! Так, всяие обнуления... +//! \memberof TCurPar +void CurPar_init(TCurPar* p) { + //фильтры + p->fPower.T = _IQ(0.001); //фильтр мощности для вывода на экран + +} + +//!Расчет мощности из данных фаз + +//!Расчет происходит в двухфазной системе координат, привязанной к статору +//!Для расчета используются мгнованнеые напряжения фаз UalphaRef, UbetaRef, +//!мгнованные токи фаз Ialpha, Ibeta. Для каждой из осей напряжение умножается на ток, +//!полученная мгновенная мощность суммируется с аналогичной мощностью по другой оси, +//!а затем полученная суммартная мгновенная мощность фильтруется инерционным звеном первого порядка. +//! \memberof TCurPar +void CurPar_PowerCalcUf(TCurPar* p) { + p->Ualpha = pwm.UalphaRef; //Напряжение заданное оси альфа + p->Ubeta = pwm.UbetaRef; //Напряжение заданное оси бета + + //мгновенная мощность по осям альфа и бета подается на вход фильтра + p->fPower.input = _IQmpy(p->PowerK, + _IQmpy(p->Ualpha,p->Ialpha)+_IQmpy(p->Ubeta,p->Ibeta)); + + //расчет фильтра + p->fPower.calc(&p->fPower); + //результат работы фильтра - текущая активная мощность. + p->power = p->fPower.output; +} + +//!Расчет текущих параметров привода + +//! \memberof TCurPar +void CurPar_calc(TCurPar* p) { + + CurPar_PowerCalcUf(p); //Расчет мощности +} + +//! \memberof TCurPar +//Расчет внутреннего масштабирующего коэффицента мощности +//для приведения различных типов расчетов мощности к базовой мощности drv_params.power +void CurPar_slow_calc(TCurPar* p) { + float PowerMaxReal; + float PowerMaxScale; + PowerMaxReal = (float) drv_params.I_nom * drv_params.U_nom; + PowerMaxScale = _IQ6toF(drv_params.power); + p->PowerK = _IQmpy(_IQ(PowerMaxReal / PowerMaxScale), _IQ(3.0/2));//дробь 3/2 нужна для преобразования мощности от 2х фазного представления к 3х фазному +} + +/*@}*/ + diff --git a/Vsrc/V_DIO.c b/Vsrc/V_DIO.c new file mode 100644 index 0000000..2274dca --- /dev/null +++ b/Vsrc/V_DIO.c @@ -0,0 +1,128 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_DIO.c + \brief Модуль дискретных входов/выходов + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 25/08/2017 + + \addtogroup + @{*/ + + + +#include "main.h" +#include "filter.h" + + + +// Вектор состоЯниЯ дискретных выходов +volatile Uint16 output_vect = 0; +// Маска инвертированиЯ вектора состоЯниЯ дискретных выходов +volatile Uint16 output_mask = 0; + +// Вектор состоЯниЯ дискретных входов +volatile Uint16 input_vect = 0; +// Маска инвертированиЯ вектора состоЯниЯ дискретных входов +volatile Uint16 input_mask = 0; +// Коэффициент фильтрации дискретных входов Kf = 0.001/Tф +// (Tф - постоЯннаЯ времени фильтра, сек) +volatile _iq inputKf = _IQ(0.03); //Время срабатывания составляется 60мс при inputKf=_IQ(0.03) и inputOn = _IQ(0.8) в 1кГц прерывании; +// Порог перехода дискретного входа в состоЯние OFF (0) +volatile _iq inputOff = _IQ(0.3); +// Порог перехода дискретного входа в состоЯние ON (1) +volatile _iq inputOn = _IQ(0.8); +// Промежуточный вектор состоЯниЯ дискретных входов (без учёта маски инвертированиЯ) +Uint16 input = 0; + +// Фильтры дискретных входов +TFilter fIn1 = FILTER_DEFAULTS; +TFilter fIn2 = FILTER_DEFAULTS; +TFilter fIn3 = FILTER_DEFAULTS; + + +void DIO_Init() +{ +#if defined (HW_MOTORCONTROLBOARD) + //Проинитим дискретные входы +// NT_GPIOB->ALTFUNCCLR = (1 << 5); //выключить альт. функцию +// NT_GPIOA->ALTFUNCCLR = (1 << 14) | (1 << 15); //выключить альт. функцию +// NT_GPIOB->OUTENCLR = (1 << 5); //на вход +// NT_GPIOA->OUTENCLR = (1 << 14) | (1 << 15); //на вход +// +// //Проинитим дискретные выходы +// NT_GPIOB->ALTFUNCCLR = (1 << 6) | (1 << 15) | (1 << 4); //выключить альт. функцию +// NT_GPIOB->OUTENSET = (1 << 6) | (1 << 15) | (1 << 4); //на выход +#endif + +} + + +void DIO_slow_calc() +{ + + // Получаем вектор состоЯниЯ дискретных выходов с учётом маски инвертированиЯ + Uint16 output = output_vect ^ output_mask; + // Выводим управлЯющее воздействие по Выходу 1 + if (BIT_IS_SET(output, 0)) + D_OUT1_OFF; + else + D_OUT1_ON; + // Выводим управлЯющее воздействие по Выходу 2 + if (BIT_IS_SET(output, 1)) + D_OUT2_OFF; + else + D_OUT2_ON; + // Выводим управлЯющее воздействие по Выходу 3 + if (BIT_IS_SET(output, 2)) + D_OUT3_OFF; + else + D_OUT3_ON; + + + // ОбновлЯем коэффициенты фильтрации дискретных входов + fIn1.T = inputKf; + fIn2.T = inputKf; + fIn3.T = inputKf; + // Получаем состоЯние Входа 1 с учётом фильтрации + if (fIn1.output > inputOn) SET_BIT(input, 0); + if (fIn1.output < inputOff) CLEAR_BIT(input, 0); + // Получаем состоЯние Входа 2 с учётом фильтрации + if (fIn2.output > inputOn) SET_BIT(input, 1); + if (fIn2.output < inputOff) CLEAR_BIT(input, 1); + // Получаем состоЯние Входа 3 с учётом фильтрации + if (fIn3.output > inputOn) SET_BIT(input, 2); + if (fIn3.output < inputOff) CLEAR_BIT(input, 2); + + input_vect = input ^ input_mask; + +} + + +void DIO_fast_calc() +{ + // Инерционный фильтр дискретного Входа 1 + fIn1.input = (D_IN1 == 1) ? _IQ(1.0) : 0; + fIn1.calc(&fIn1); + // Инерционный фильтр дискретного Входа 2 + fIn2.input = (D_IN2 == 1) ? _IQ(1.0) : 0; + fIn2.calc(&fIn2); + // Инерционный фильтр дискретного Входа 3 + fIn3.input = (D_IN3 == 1) ? _IQ(1.0) : 0; + fIn3.calc(&fIn3); +} + +/*@}*/ + diff --git a/Vsrc/V_DPR_eCAP.c b/Vsrc/V_DPR_eCAP.c new file mode 100644 index 0000000..2d8f230 --- /dev/null +++ b/Vsrc/V_DPR_eCAP.c @@ -0,0 +1,599 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_DPR_eCAP.c + \brief Модуль датчика абсолютного положения ротора с использованием модулей CAP TDPReCAP (см. TDPReCAP) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.1 03/01/2013 + + */ + +/** \addtogroup V_DPR_eCAP */ +/*@{*/ + +#include "DSP.h" // Device Headerfile and Examples Include File +#include "V_IQmath.h" // библиотека IQmath +#include "V_DPR_eCAP.h" // заголовочный файл модуля +#include "main.h" + +extern TDrvParams drv_params; +//! Инициализация + +//!Модули CAP_3, CAP_4, CAP_5 инициализируются +//!для захвата времени между событиями нарастающего и спадающего +//!фронтов, а также генерации прерываний по этим событиям. + +//! \memberof TDPReCAP +void DPReCAP_Init(TDPReCAP* p) { + + //Инициализация ECAP1 + ECAP0->ECEINT = 0x0000; // Disable all capture interrupts + ECAP0->ECCLR = 0xFFFF; // Clear all CAP interrupt flags + ECAP0->ECCTL0_bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads + ECAP0->ECCTL1_bit.TSCTRSTOP = 0; // Make sure the counter is stopped + ECAP0->ECCTL0_bit.PRESCALE = 0; // DIV1 + + // Configure peripheral registers + ECAP0->ECCTL1_bit.CONTOST = 0; // continuous mode + ECAP0->ECCTL0_bit.CAP0POL = 0; // rising edge + ECAP0->ECCTL0_bit.CAP1POL = 1; // falling edge + ECAP0->ECCTL0_bit.CTRRST0 = 0; // absolute time stamp + ECAP0->ECCTL0_bit.CTRRST1 = 0; // absolute time stamp + ECAP0->ECCTL1_bit.STOPWRAP = 1; // Wrap after Capture Event 2 +// ECAP0->ECCTL1_bit.SYNCI_EN = 1; // Enable sync in + ECAP0->ECCTL1_bit.SYNCOSEL = 0; // Pass through + ECAP0->ECCTL0_bit.CAPLDEN = 1; // Enable capture units + + + + ECAP0->ECCTL1_bit.TSCTRSTOP = 1; // Start Counter + ECAP0->ECCTL1_bit.REARM = 0; // Has no effect (Не очень понимаю этот регистр) + ECAP0->ECCTL0_bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads + ECAP0->ECEINT_bit.CEVT0 = 1; // 1 events = interrupt + ECAP0->ECEINT_bit.CEVT1 = 1; // 2 events = interrupt + + //Инициализация ECAP2 + ECAP1->ECEINT = 0x0000; // Disable all capture interrupts + ECAP1->ECCLR = 0xFFFF; // Clear all CAP interrupt flags + ECAP1->ECCTL0_bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads + ECAP1->ECCTL1_bit.TSCTRSTOP = 0; // Make sure the counter is stopped + ECAP1->ECCTL0_bit.PRESCALE = 0; // DIV1 + + // Configure peripheral registers + ECAP1->ECCTL1_bit.CONTOST = 0; // continuous mode + ECAP1->ECCTL0_bit.CAP0POL = 0; // rising edge + ECAP1->ECCTL0_bit.CAP1POL = 1; // falling edge + ECAP1->ECCTL0_bit.CTRRST0 = 0; // absolute time stamp + ECAP1->ECCTL0_bit.CTRRST1 = 0; // absolute time stamp + ECAP1->ECCTL1_bit.STOPWRAP = 1; // Wrap after Capture Event 2 +// ECAP1->ECCTL1_bit.SYNCI_EN = 1; // Enable sync in + ECAP1->ECCTL1_bit.SYNCOSEL = 0; // Pass through + ECAP1->ECCTL0_bit.CAPLDEN = 1; // Enable capture units + + ECAP1->ECCTL1_bit.TSCTRSTOP = 1; // Start Counter + ECAP1->ECCTL1_bit.REARM = 0; // Has no effect (Не очень понимаю этот регистр) + ECAP1->ECCTL0_bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads + ECAP1->ECEINT_bit.CEVT0 = 1; // 1 events = interrupt + ECAP1->ECEINT_bit.CEVT1 = 1; // 2 events = interrupt + + //Инициализация ECap3 + ECAP2->ECEINT = 0x0000; // Disable all capture interrupts + ECAP2->ECCLR = 0xFFFF; // Clear all CAP interrupt flags + ECAP2->ECCTL0_bit.CAPLDEN = 0; // Disable CAP1-CAP4 register loads + ECAP2->ECCTL1_bit.TSCTRSTOP = 0; // Make sure the counter is stopped + ECAP2->ECCTL0_bit.PRESCALE = 0; // DIV1 + + // Configure peripheral registers + ECAP2->ECCTL1_bit.CONTOST = 0; // continuous mode + ECAP2->ECCTL0_bit.CAP0POL = 0; // rising edge + ECAP2->ECCTL0_bit.CAP1POL = 1; // falling edge + ECAP2->ECCTL0_bit.CTRRST0 = 0; // absolute time stamp + ECAP2->ECCTL0_bit.CTRRST1 = 0; // absolute time stamp + ECAP2->ECCTL1_bit.STOPWRAP = 1; // Wrap after Capture Event 2 +// ECAP2->ECCTL1_bit.SYNCI_EN = 1; // Enable sync in + ECAP2->ECCTL1_bit.SYNCOSEL = 0; // Pass through + ECAP2->ECCTL0_bit.CAPLDEN = 1; // Enable capture units + + ECAP2->ECCTL1_bit.TSCTRSTOP = 1; // Start Counter + ECAP2->ECCTL1_bit.REARM = 0; // Has no effect (Не очень понимаю этот регистр) + ECAP2->ECCTL0_bit.CAPLDEN = 1; // Enable CAP1-CAP4 register loads + ECAP2->ECEINT_bit.CEVT0 = 1; // 1 events = interrupt + ECAP2->ECEINT_bit.CEVT1 = 1; // 2 events = interrupt + + p->TsNom = ((APB0BusClock / (drv_params.speed_nom * drv_params.p)) * 15*2); + //коэффициент для пересчета времени между метками в мс в скорость в об/мин + //60 - об/мин, 1000 мс в секунде, 6 меток на эл. оборот + p->TsNomMilsec = (60.0*1000 / (6*drv_params.speed_nom * drv_params.p)); + +#if (!defined(HW_VECTORCARD_SIMULATOR)) && (!defined(HW_NIIET_BOARD_SIMULATOR)) + // Настройка ножек в GpioPeripheralInit +#endif + + DPReCAP_Angle6Calc(p); + p->CAP_WrongEdgeCnt = 0; + p->SimulatorOmega2IQ_factor=_IQ(60.0/(2*MOTOR_MODEL_PI*drv_params.speed_nom)); + +} + + +//! Определение углового положения с дискретностью 60 градусов + +//!Определение углового положения происходит исходя из опроса трех каналов датчика +//!через GPIO. Результат попадает в переменную Angle6. + +//! \memberof TDPReCAP +void DPReCAP_Angle6Calc(TDPReCAP* p) { + // На момент расчёта, запрещаем прерывания по датчикам. + //Если этого не сделать, то эта функция может вызваться в 10к, + //на половне прерваться прерыванием CAP, в котором она вызовется второй раз, + //потом управление вернется к этой функции в 10к и в p->Angle6 попадет старый результат + ECAP0->ECEINT = 0x0000; + ECAP1->ECEINT = 0x0000; + ECAP2->ECEINT = 0x0000; + + // Формируем код по состоянию ножек. + p->HallCode = 0; + +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + p->HallCode = model.hallSensor; + +#else + if (p->UserDirection == 0) { + if (GPIOM->DATA & (1 << 5)) + p->HallCode = p->HallCode + 1; + if (GPIOM->DATA & (1 << 6)) + p->HallCode = p->HallCode + 2; + if (GPIOM->DATA & (1 << 7)) + p->HallCode = p->HallCode + 4; + } else { + if (GPIOM->DATA & (1 << 5)) + p->HallCode = p->HallCode + 4; + if (GPIOM->DATA & (1 << 6)) + p->HallCode = p->HallCode + 2; + if (GPIOM->DATA & (1 << 7)) + p->HallCode = p->HallCode + 1; + } +#endif + + + + + switch (p->HallCode) { + case 5: // 0 + p->Angle6 = 0; + break; + case 4: // 60 + p->Angle6 = _IQ(1.0 / 6.0); + break; + case 6: // 120 + p->Angle6 = _IQ(1.0 / 3.0); + break; + case 2: //180 + p->Angle6 = _IQ(1.0 / 2.0); + break; + case 3: // 240 + p->Angle6 = _IQ(2.0 / 3.0); + break; + case 1: // 300 + p->Angle6 = _IQ(5.0 / 6.0); + break; + } + + // Разрешаем прерывания назад. + ECAP0->ECEINT = 6; + ECAP1->ECEINT = 6; + ECAP2->ECEINT = 6; +} + +void DPReCAP_AngleErrorCalc(TDPReCAP* p) { + long AngleDiff = 0; + AngleDiff = (labs( + ((p->Angle6 - p->AnglePrev + _IQ(0.5)) & 0x00FFFFFF) - _IQ(0.5))) + & 0x00FFFFFF; + p->AnglePrev = p->Angle6; + + if (AngleDiff > _IQ(61.0 / 360)) { //если угол с прошлого раза изменился больше, чем на 60 градусов, то датчик косячит + p->WrongCodeCounter++; + p->WrongCodeCounterPerSec++; + + } +} + +//! Определение углового положения с учетом работы интерполятора углового положения + +//!Интерполятор углового положения (а вернее даже экстраполятор) +//!использует дискретное угловое положение Angle6, выдаваемое функцией DPReCAP_Angle6Calc. +//!Функция "сглаживает" угловое положение во времени, делая из степенчатой смены угла "лесенкой" +//!непрерывную "пилу" (переменная Angle). Для этого используется сохраненное время между двумя любыми +//!предыдущими фронтами с каналов датчика положения (PrevTs). Считая, что скорость вращения постоянна, +//!следующий фронт (а значит смену углового положения) можно прогнозировать через то же самое время. +//!Таким образом, у текущему дискретному угловому положению Angle6 прибавляется +//!добавка, рассчитываемая по формуле 60*(Текущее время/Период). +//!Так, в момент прихода фронта с датчика переменная Angle равна Angle6. Через некоторый момент времени +//! Angle станет равным Angle6+60*(delta/Ts), где delta - текущее время с момента события последнего фронта с датчика, +//! а Ts - период, время между предыдущими двумя событиями фронров датчика. +//! Функция также учитывает направление вращения, а также добавляет пользовательское смещение +//! AngleOffset к результирующему угловому положению. + +//! \memberof TDPReCAP +void DPReCAP_AngleCalc(TDPReCAP* p) { + Uint32 delta, Timer; + Uint32 PrevTs; + _iq Angle; + _iq Angle6; + + // Фиксируем значения переменных на момент начала расчёта + Angle6 = p->Angle6; + +#if (!defined(HW_VECTORCARD_SIMULATOR)) && (!defined(HW_NIIET_BOARD_SIMULATOR)) + + PrevTs = p->PrevTs; + // На момент расчёта, запрещаем прерывания по датчикам. + ECAP0->ECEINT = 0x0000; + ECAP1->ECEINT = 0x0000; + ECAP2->ECEINT = 0x0000; + + + + // Фиксируем значение одного из таймеров на момент начала выполнения модуля. + switch (p->DPReCAP_FLG1.bit.CAPnumber) { + case 1: + Timer = ECAP0->TSCTR; + break; + case 2: + Timer = ECAP1->TSCTR; + break; + case 3: + Timer = ECAP2->TSCTR; + break; + } + + // Если скорость равна нулю или выбран соответствующий режим, то угол не интеполируем. + if ((p->speed == 0) || (p->DPReCAP_FLG1.bit.AngleMode == 0) + || (p->Ts == 0)) { + Angle = _IQ(1.0 / 12); + } else { + delta = Timer - PrevTs; // Сколько натикал таймер с момента прошлого обновления периода. + Angle = _IQdiv(delta, p->Ts); // Интеполируем угол. Отношение прошлого перехода к текущим "тикам". + if (Angle >= _IQ(1.0 / 6.0)) // ограничиваем угол в приделах 1/6. + Angle = _IQ(1.0 / 6.0); + } +#else //симулятор + Angle=_IQ(model.hallSensorInterpAdd * (1/(2*MOTOR_MODEL_PI)));//приращение угла для интерполятора уже предпосчитано в модели двигателя с учетом дискретности +#endif + + if (p->DPReCAP_FLG1.bit.Dir == 1) + Angle = _IQ(1.0/6.0) - Angle; + + if (p->UserDirection) //пользовательская инверсия направления + Angle = -Angle + _IQ(1.0/6); + + p->Angle = Angle6 + Angle + p->AngleOffset; + + p->Angle &= 0x00FFFFFF; + + + // Разрешаем прерывания назад. + ECAP0->ECEINT = 6; + ECAP1->ECEINT = 6; + ECAP2->ECEINT = 6; +} + +//! Функция расчета скорости + +//!Для расчета скорости используется переменная Tspeed, +//!которая представляет собой время между событиями фронтов датчика положения +//!произошедших по одному и тому же каналу. Так, например, временем между нарастающим и спадающим фронтом +//!канала CAP3, затем между спадающим и нарастающим фронтом CAP4 и т.п. +//!На основе этого времени, направления вращения и предпосчитанной константой TsNom +//!рассчитывается скорость вращения. + +//! \memberof TDPReCAP +void DPReCAP_SpeedCalc(TDPReCAP* p) { +#if (!defined(HW_VECTORCARD_SIMULATOR)) && (!defined(HW_NIIET_BOARD_SIMULATOR)) + + _iq speed; + + // Считаем скорость в относительных единицах относительно номинальной. + if ((p->Tspeed != 0) && (p->DPReCAP_FLG1.bit.ZeroFLG == 0)) { + + // Знак скорости опрделяется в зависимости от направления. + if (p->DPReCAP_FLG1.bit.Dir == 0) + speed = _IQdiv(p->TsNom, p->Tspeed); + else + speed = -_IQdiv(p->TsNom, p->Tspeed); + if (p->UserDirection) { //задается пользователем + speed = -speed; + } + } else { + speed = 0; + } + + p->speed = speed; + + + DINT;//нужно для потокобезопасного обращения к переменной DPReCAP_FLG1 (чтобы не перетереть присваивание в прерывании захвата) + // Обнуление скорости, если привысили заданное время между двумя соседними событиями. + if (p->milsec > p->milsecFIX) { + p->speed = 0; + p->DPReCAP_FLG1.bit.ZeroFLG = 1; +// p->cnt1 = 0; // Надо обнулять при стопе и hold'е. Здесь не надо, только для теста. + } + EINT; + + DINT;//нужно для потокобезопасного обращения к переменной DPReCAP_FLG1 (чтобы не перетереть присваивание в прерывании захвата) + + // При скорости меньше заданной, отключаем интерполяцию угла. + if ((labs(p->speed)) <= (p->speedMIN)) + p->DPReCAP_FLG1.bit.SpeedMinFLG = 0; + else + p->DPReCAP_FLG1.bit.SpeedMinFLG = 1; + EINT; + +#else //симулятор + p->speed=p->SimulatorOmega2IQ_factor*model.hallSensorOmega;//Частота вращения уже предпосчитана в модели двигателя с учетом дискретности +#endif +} + +//! Функция, вызываемая в прерывании по нарастающему и спадающему фронту канала датчика 1 + +//! В функции запоминается время таймера модуля CAP в переменную Timer1. +//! Исходя из этого считаются две переменные - p->Ts, время между двумя ближайшими фронтами, +//!необходимое для интерполятора углового положения, и переменная p->Tspeed, +//!время между двумя фронтами одного и того же канала, неободимое для расчета скорости. +//! \memberof TDPReCAP +void DPReCAP_CAP1Calc(TDPReCAP* p) { + Uint32 Timer=0; + if (p->cnt >= 2) { + p->cnt=2; + p->HelpCalc(p); + + // В зависимости от номера предудыщего CAP определяем направление вращения. + if (p->DPReCAP_FLG1.bit.CAPnumber == 3) + p->DPReCAP_FLG1.bit.Dir = 0; + if (p->DPReCAP_FLG1.bit.CAPnumber == 2) + p->DPReCAP_FLG1.bit.Dir = 1; + if (p->DPReCAP_FLG1.bit.CAPnumber == 1) { + if (p->DPReCAP_FLG1.bit.PrevDir == 0) + p->DPReCAP_FLG1.bit.Dir = 1; + else + p->DPReCAP_FLG1.bit.Dir = 0; + } + if (p->DPReCAP_FLG1.bit.Dir != p->DPReCAP_FLG1.bit.PrevDir) { + p->DPReCAP_FLG1.bit.PrevDir = p->DPReCAP_FLG1.bit.Dir; + p->cnt2 = 1; + } + + if (ECAP0->ECFLG_bit.CEVT0==1)//Фронт вверх + { + Timer = ECAP0->CAP0; + } + if (ECAP0->ECFLG_bit.CEVT1==1)//Фронт вниз + { + Timer = ECAP0->CAP1; + } + + // считаем периоды для расчёта угла и скорости. + p->Ts = (Timer - p->PrevTs) * 6; + p->PrevTs = Timer; + + p->Tspeed = Timer - p->PrevTspeed1; + p->PrevTspeed1 = Timer; + + } else { + p->Ts = 0; + p->Tspeed = 0; + } + + + p->cnt++; + p->milsec = 0; + p->DPReCAP_FLG1.bit.CAPnumber = 1; + +} + +//! Функция, вызываемая в прерывании по нарастающему и спадающему фронту канала датчика 2 + +//! В функции запоминается время таймера модуля CAP в переменную Timer1. +//! Исходя из этого считаются две переменные - p->Ts, время между двумя ближайшими фронтами, +//!необходимое для интерполятора углового положения, и переменная p->Tspeed, +//!время между двумя фронтами одного и того же канала, неободимое для расчета скорости. +//! \memberof TDPReCAP +void DPReCAP_CAP2Calc(TDPReCAP* p) { + Uint32 Timer=0; + if (p->cnt >= 2) { + p->cnt=2; + p->HelpCalc(p); + + // В зависимости от номера предудыщего CAP определяем направление вращения. + if (p->DPReCAP_FLG1.bit.CAPnumber == 1) + p->DPReCAP_FLG1.bit.Dir = 0; + if (p->DPReCAP_FLG1.bit.CAPnumber == 3) + p->DPReCAP_FLG1.bit.Dir = 1; + if (p->DPReCAP_FLG1.bit.CAPnumber == 2) { + if (p->DPReCAP_FLG1.bit.PrevDir == 0) + p->DPReCAP_FLG1.bit.Dir = 1; + else + p->DPReCAP_FLG1.bit.Dir = 0; + } + + if (p->DPReCAP_FLG1.bit.Dir != p->DPReCAP_FLG1.bit.PrevDir) { + p->DPReCAP_FLG1.bit.PrevDir = p->DPReCAP_FLG1.bit.Dir; + p->cnt2 = 1; + } + + if (ECAP1->ECFLG_bit.CEVT0==1) + { + Timer = ECAP1->CAP0; + } + if (ECAP1->ECFLG_bit.CEVT1==1) + { + Timer = ECAP1->CAP1; + } + + // считаем периоды для расчёта угла и скорости. + p->Ts = (Timer - p->PrevTs) * 6; + p->PrevTs = Timer; + + p->Tspeed = Timer - p->PrevTspeed2; + p->PrevTspeed2 = Timer; + + } else { + p->Ts = 0; + p->Tspeed = 0; + } + + + p->cnt++; + p->milsec = 0; + p->DPReCAP_FLG1.bit.CAPnumber = 2; + +} + +//! Функция, вызываемая в прерывании по нарастающему и спадающему фронту канала датчика 3 + +//! В функции запоминается время таймера модуля CAP в переменную Timer1. +//! Исходя из этого считаются две переменные - p->Ts, время между двумя ближайшими фронтами, +//!необходимое для интерполятора углового положения, и переменная p->Tspeed, +//!время между двумя фронтами одного и того же канала, неободимое для расчета скорости. +//! \memberof TDPReCAP +void DPReCAP_CAP3Calc(TDPReCAP* p) { + Uint32 Timer; + if (p->cnt >= 2) { + p->cnt=2; + p->HelpCalc(p); + + // В зависимости от номера предудыщего CAP определяем направление вращения. + if (p->DPReCAP_FLG1.bit.CAPnumber == 2) + p->DPReCAP_FLG1.bit.Dir = 0; + if (p->DPReCAP_FLG1.bit.CAPnumber == 1) + p->DPReCAP_FLG1.bit.Dir = 1; + if (p->DPReCAP_FLG1.bit.CAPnumber == 3) { + if (p->DPReCAP_FLG1.bit.PrevDir == 0) + p->DPReCAP_FLG1.bit.Dir = 1; + else + p->DPReCAP_FLG1.bit.Dir = 0; + } + + if (p->DPReCAP_FLG1.bit.Dir != p->DPReCAP_FLG1.bit.PrevDir) { + p->DPReCAP_FLG1.bit.PrevDir = p->DPReCAP_FLG1.bit.Dir; + p->cnt2 = 1; + } + + if (ECAP2->ECFLG_bit.CEVT0==1) + { + Timer = ECAP2->CAP0; + } + if (ECAP2->ECFLG_bit.CEVT1==1) + { + Timer = ECAP2->CAP1; + } + + + // считаем периоды для расчёта угла и скорости. + p->Ts = (Timer - p->PrevTs) * 6; + p->PrevTs = Timer; + + p->Tspeed = Timer - p->PrevTspeed3; + p->PrevTspeed3 = Timer; + + } else { + p->Ts = 0; + p->Tspeed = 0; + } + + + p->cnt++; + p->milsec = 0; + p->DPReCAP_FLG1.bit.CAPnumber = 3; +} + +void DPReCAP_calc_10k(TDPReCAP* p) { + + DINT; + if (p->CAPCalcEna1==0){ + p->CAPCalcEna1=1; + ECAP0->ECCLR_bit.CEVT0 = 1; + ECAP0->ECCLR_bit.CEVT1 = 1; + ECAP0->ECCLR_bit.INT = 1; + } + if (p->CAPCalcEna2==0){ + p->CAPCalcEna2=1; + ECAP1->ECCLR_bit.CEVT0 = 1; + ECAP1->ECCLR_bit.CEVT1 = 1; + ECAP1->ECCLR_bit.INT = 1; + } + if (p->CAPCalcEna3==0){ + p->CAPCalcEna3=1; + ECAP2->ECCLR_bit.CEVT0 = 1; + ECAP2->ECCLR_bit.CEVT1 = 1; + ECAP2->ECCLR_bit.INT = 1; + } + EINT; + +} + + +void DPReCAP_HelpCalc(TDPReCAP* p) { + // Обнуляем скорость и выставляем флаг, + // если время между двумя событиями больше заданного. + if (p->milsec > p->milsecFIX) { + p->speed = 0; + p->DPReCAP_FLG1.bit.ZeroFLG = 1; + } else { + p->DPReCAP_FLG1.bit.ZeroFLG = 0; + } +} + +void DPReCAP_SlowCalc(TDPReCAP* p) { +//формула для расчета T=Ts/Tfiltra где - Tfiltra постоянная времени фильтра +// p->AngleFilter_1_T=_IQdiv(FAST_CALC_TS,AngleFilterT); +} + + +void DPReCAP_msCalc(TDPReCAP* p) { + p->milsec++;//счетчик времени отсутствия меток + if (p->milsecREF != p->milsecPrevREF) { + p->milsecFIX=p->milsecREF; + p->speedMinREF = _IQdiv(p->TsNomMilsec, p->milsecFIX); + p->milsecPrevREF = p->milsecREF; + } + + p->ErrorLevelTimeCounterBig++; + if (p->ErrorLevelTimeCounterBig > 10000) { + p->ErrorLevel = p->ErrorLevelCounter; + p->ErrorLevelCounter = 0; + p->ErrorLevelTimeCounterBig = 0; + } + + p->ErrorLevelTimeCounter++; + if (p->ErrorLevelTimeCounter > 1000) { + if (p->WrongCodeCounterPerSec > p->WrongCodeCounterLimitPerSec){ + p->SensorFault = 1; + } else + p->SensorFault = 0; + p->WrongCodeCounterPerSec=0; + p->ErrorLevelTimeCounter = 0; + } + + + if (p->CAP_WrongEdgeCntPrev != p->CAP_WrongEdgeCnt) + p->ErrorLevelCounter++; + p->CAP_WrongEdgeCntPrev = p->CAP_WrongEdgeCnt; + +} + +/*@}*/ + diff --git a/Vsrc/V_Fan.c b/Vsrc/V_Fan.c new file mode 100644 index 0000000..9910397 --- /dev/null +++ b/Vsrc/V_Fan.c @@ -0,0 +1,87 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_Fan.c + \brief Модуль работы вентилятора + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 25/08/2017 + + \addtogroup + @{*/ + + +#include "main.h" + + +//! \memberof TFanControl +void FanControl_init(TFanControl *p) +{ +#if defined (HW_MOTORCONTROLBOARD) + p->Enabled = 1; //Включаем блок вентилятора + //Проинитим выход для управления вентилятором в GpioPeripheralInit +#endif +} + +//! \memberof TFanControl +void FanControl_slow_calc(TFanControl *p) { + if (p->Enabled){//если есть вентилятор + //считаем дискретный автомат + p->state_shadow = p->state; + p->state_prev = p->state_shadow; + + switch (p->state_shadow) { + + + case FAN_CONTROL_STATE_OFF: //вентилятор не работает, температура инвертора меньше T_on + { + FAN_OFF; // + p->StateOn = 0; // + if (adc.T_meas > p->T_on) // + p->state = FAN_CONTROL_STATE_ON; // + break; + } + + case FAN_CONTROL_STATE_ON: //включение вентилятора, температура больше T_on и меньше T_alarm + { + FAN_ON; //включить вентилятор + p->StateOn = 1; //состояние работы + if (adc.T_meas > p->T_alarm) //если температура поднялась еще больше, переходим в режим перегрева + p->state = FAN_CONTROL_STATE_OVERHEAT; + if (adc.T_meas < p->T_off) //если температура опустилась ниже заданного уровня, переходим в обычный режим + p->state = FAN_CONTROL_STATE_OFF; + break; + } + + case FAN_CONTROL_STATE_OVERHEAT: //температура больше T_alarm, вентилятор работает, выводится предупреждение о перегреве + { + FAN_ON; //включить вентилятор + p->StateOn = 1; //состояние работы + drv_status.bit.overheat = 1; //вывод предупреждения о перегреве + if (adc.T_meas < p->T_alarm) { //если температура опустилась ниже заданного уровня, переходим в обычный режим + drv_status.bit.overheat = 0; //сброс предупреждения о перегреве + p->state = FAN_CONTROL_STATE_ON; + } + break; + + } + + } + } + + +} + +/*@}*/ + diff --git a/Vsrc/V_Global_time.c b/Vsrc/V_Global_time.c new file mode 100644 index 0000000..afc42ba --- /dev/null +++ b/Vsrc/V_Global_time.c @@ -0,0 +1,217 @@ + +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file Global_time.c + \brief Модуль работы со временем + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.2 2013_10_16 + +*/ + +/** \addtogroup Global_time */ +/*@{*/ + +#ifdef __cplusplus +extern "C" { +#endif + + +#include + + +//!ИнициализациЯ модулЯ + +//!Если есть часы реального времени, считывает из них времЯ. +//!Восстанавливает времЯ работы и времени включенного состоЯниЯ из SPI. + +//! \memberof TGlobalTime +void GlobalTime_init(TGlobalTime *p) +{ + p->read_PowerOn_time(p); + p->read_oper_time(p); + + + #ifdef USE_ABSOLUTE_TIME_CLOCK + //инициализациЯ абсолютного времени + if (p->time_type == 1) + { + //инициализациЯ из часов реального времени + p->absolute_time.day=spiclock.day; + p->absolute_time.hour=spiclock.hour; + p->absolute_time.minute=spiclock.minute; + p->absolute_time.second=spiclock.second; + p->absolute_time.year=spiclock.year; + } + #endif + //инициализациЯ относительного времени + p->relative_time1.ON = 1;//т.к. 1-е времЯ ЯвлЯетсЯ обЯзательным + + p->relative_time1.relative_date.hour = (p->PowerOn_time >> 6); + p->relative_time1.relative_date.minute = (p->PowerOn_time & 0x3f); + + p->relative_time2.relative_date.hour = (p->operational_time >> 6); + p->relative_time2.relative_date.minute = (p->operational_time & 0x3f); +} + + + + +//!Расчет относительного времени. + +//!Вызывает функции расчета относительно времени и, если есть, считывает времЯ +//!с модулЯ часов реального вермени в абсолютное времЯ. + +//! \memberof TGlobalTime +void GlobalTime_calc(TGlobalTime *p) +{ + //счет относительных времен + GlobalTime_REL_TIME_calc(&p->relative_time1); + GlobalTime_REL_TIME_calc(&p->relative_time2); +} + + +//!Расчет относительного времени. + +//!Вызывает функции расчета относительно времени и, если есть, считывает времЯ +//!с модулЯ часов реального вермени в абсолютное времЯ. + +//! \memberof TGlobalTime +void GlobalTime_ms_calc(TGlobalTime *p) { + + //управление счетом operational_time + if (sm_ctrl.state != 0) //Если в каком-то режиме работы + global_time.relative_time2.ON = TRUE; + else + global_time.relative_time2.ON = FALSE; + + //ВремЯ запитанного состоЯниЯ в минутах + p->PowerOn_time = (global_time.relative_time1.relative_date.hour << 6) + (global_time.relative_time1.relative_date.minute & 0x3f); + //ВремЯ в работе, в минутах + p->operational_time = (global_time.relative_time2.relative_date.hour << 6) + (global_time.relative_time2.relative_date.minute & 0x3f); + + p->PowerOn_time_min = p->relative_time1.relative_date.hour*60 +p->relative_time1.relative_date.minute; + p->operational_time_min = p->relative_time2.relative_date.hour*60 + p->relative_time2.relative_date.minute; + + +#ifdef USE_ABSOLUTE_TIME_CLOCK + if (global_time.time_type == 1) { + //времЯ - из часов реального времени + global_time.absolute_time.day = spiclock.day; + global_time.absolute_time.hour = spiclock.hour; + global_time.absolute_time.minute = spiclock.minute; + global_time.absolute_time.second = spiclock.second; + global_time.absolute_time.year = spiclock.year; + } +#endif +} + +//!Расчет относительного времени + +//!УчитываЯ, что функциЯ вызываетсЯ с какой-то определенной дискретизацией, +//!инкрементирует относительное времЯ, переденное ей в структуре типа RELATIVE_TIME +//! \memberof TGlobalTime +void GlobalTime_REL_TIME_calc(RELATIVE_TIME *p) { + if (p->ON == 0) + return; + if (p->tic_isr != 0) + p->tic_isr--; + p->delta_millisecond = 0; + p->delta_second = 0; + if (p->tic_isr == 0) { + //миллисекунда + p->tic_isr = GLOBAL_TIME_CALC_FREQ; + p->millisecond_counter++; + p->delta_millisecond = 1; + if (p->relative_date.millisecond == 999) { + //секунда + p->relative_date.millisecond = 0; + p->second_counter++; + p->delta_second = 1; + if (p->relative_date.second == 59) { + //минута + p->relative_date.second = 0; + if (p->relative_date.minute == 59) { + //час + p->relative_date.minute = 0; + p->relative_date.hour++; + } else + p->relative_date.minute++; + } else + p->relative_date.second++; + } else + p->relative_date.millisecond++; + } +} + + +//!Читает времЯ наработки. + +//! \memberof TCurPar +void GlobalTime_read_PowerOn_time(TGlobalTime *p) { //чтение work_time + UserMem.MemStartAddr = GLOBAL_TIME_POWER_ON_TIME_ADDR; + UserMem.MCUStartAddr = (Uint16*) (&(p->PowerOn_time)); + UserMem.data_length = 4; + UserMem.read(&UserMem); +} + + +//!записывает времЯ наработки. + +//! \memberof TCurPar +void GlobalTime_write_PowerOn_time(TGlobalTime *p) { //запись work_time + UserMem.MemStartAddr = GLOBAL_TIME_POWER_ON_TIME_ADDR; + UserMem.MCUStartAddr = (Uint16*) (&(p->PowerOn_time)); + UserMem.data_length = 4; + UserMem.write(&UserMem); +} + +//!Читает времЯ включенного сосотЯниЯ. +//! \memberof TCurPar +void GlobalTime_read_oper_time(TGlobalTime *p) { //чтение operational_time + UserMem.MemStartAddr = GLOBAL_TIME_OPERATIONAL_TIME_ADDR; + UserMem.MCUStartAddr = (Uint16*) (&(p->operational_time)); + UserMem.data_length = 4; + UserMem.read(&UserMem); +} + +//!записывает времЯ включенного сосотЯниЯ. +//! \memberof TCurPar +void GlobalTime_write_oper_time(TGlobalTime *p) { //запись operational_time + UserMem.MemStartAddr = GLOBAL_TIME_OPERATIONAL_TIME_ADDR; + UserMem.MCUStartAddr = (Uint16*) (&(p->operational_time)); + UserMem.data_length = 4; + UserMem.write(&UserMem); +} + + +void GlobalTime_slow_calc(TGlobalTime*p) { + //если стоит флаг на сохранение времен в SPI или с момент прошлой записи прошел час + if ((p->WtiteSPI_flag) || (p->PrevWriteSPIHour != global_time.relative_time1.relative_date.hour)) { + + p->write_PowerOn_time(p); //запись времени вкл. состоЯниЯ + p->write_oper_time(p); //запись рабочего времени + p->PrevWriteSPIHour = global_time.relative_time1.relative_date.hour; + p->WtiteSPI_flag = 0; + } +} + + + +#ifdef __cplusplus +} // Extern "C" +#endif +/*@}*/ + diff --git a/Vsrc/V_IQmath.c b/Vsrc/V_IQmath.c new file mode 100644 index 0000000..aba631f --- /dev/null +++ b/Vsrc/V_IQmath.c @@ -0,0 +1,280 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_IQmath.c + \brief Библиотека функций целочисленной математики + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup V_IQmath + @{*/ + +#include "V_IQmath.h" +#include "stdlib.h" +#include "math.h" + +#if defined (__GNUC__) || defined (CMCPPARM) +#if defined (__GNUC__) +// Count leading zeros, using processor-specific instruction if available. +#define clz(x) __builtin_clzl(x) +#endif +#if defined (CMCPPARM) //CodeMaster +#define clz(x) __CLZ(x) +#endif +#else +static uint8_t clz(uint32_t x) { + uint8_t result = 0; + if (x == 0) return 32; + while (!(x & 0xF0000000)) { + result += 4; + x <<= 4; + } + while (!(x & 0x80000000)) { + result += 1; + x <<= 1; + } + return result; +} +#endif + +//! Деление двух чисел в формате 22.10 + +//! \memberof V_IQmath +int32 _IQ10div(int32 a, int32 b) { + if (b == 0) + return 0; + return _IQ10((float )(a) / b); //32 такта +} + +//! Деление двух чисел в формате 8.24 +//! \memberof V_IQmath +int32 _IQ24div(int32 a, int32 b) { + if (b == 0) + return 0; + return _IQ24((float )a / b); //32 такта +} + + +//! Квадратный корень в формате 8.24. Работает через аппаратный float, занимает 43 такта. +//! В CodeMaster нет функции sqrtf, поэтому для него вызывается sqrt. Для GCC вызывать +//! sqrt нельзя, т.к. тогда он попытается работать с double, а не float. +int32 _IQ24sqrt(int32 number) { + return _IQ(sqrtf((float)_IQtoF(number))); +} + + + +static const int16 sinTableQ15[259] = { + 0xfcdc, 0x0, 0x324, 0x648, 0x96b, 0xc8c, 0xfab, 0x12c8, + 0x15e2, 0x18f9, 0x1c0c, 0x1f1a, 0x2224, 0x2528, 0x2827, 0x2b1f, + 0x2e11, 0x30fc, 0x33df, 0x36ba, 0x398d, 0x3c57, 0x3f17, 0x41ce, + 0x447b, 0x471d, 0x49b4, 0x4c40, 0x4ec0, 0x5134, 0x539b, 0x55f6, + 0x5843, 0x5a82, 0x5cb4, 0x5ed7, 0x60ec, 0x62f2, 0x64e9, 0x66d0, + 0x68a7, 0x6a6e, 0x6c24, 0x6dca, 0x6f5f, 0x70e3, 0x7255, 0x73b6, + 0x7505, 0x7642, 0x776c, 0x7885, 0x798a, 0x7a7d, 0x7b5d, 0x7c2a, + 0x7ce4, 0x7d8a, 0x7e1e, 0x7e9d, 0x7f0a, 0x7f62, 0x7fa7, 0x7fd9, + 0x7ff6, 0x7fff, 0x7ff6, 0x7fd9, 0x7fa7, 0x7f62, 0x7f0a, 0x7e9d, + 0x7e1e, 0x7d8a, 0x7ce4, 0x7c2a, 0x7b5d, 0x7a7d, 0x798a, 0x7885, + 0x776c, 0x7642, 0x7505, 0x73b6, 0x7255, 0x70e3, 0x6f5f, 0x6dca, + 0x6c24, 0x6a6e, 0x68a7, 0x66d0, 0x64e9, 0x62f2, 0x60ec, 0x5ed7, + 0x5cb4, 0x5a82, 0x5843, 0x55f6, 0x539b, 0x5134, 0x4ec0, 0x4c40, + 0x49b4, 0x471d, 0x447b, 0x41ce, 0x3f17, 0x3c57, 0x398d, 0x36ba, + 0x33df, 0x30fc, 0x2e11, 0x2b1f, 0x2827, 0x2528, 0x2224, 0x1f1a, + 0x1c0c, 0x18f9, 0x15e2, 0x12c8, 0xfab, 0xc8c, 0x96b, 0x648, + 0x324, 0x0, 0xfcdc, 0xf9b8, 0xf695, 0xf374, 0xf055, 0xed38, + 0xea1e, 0xe707, 0xe3f4, 0xe0e6, 0xdddc, 0xdad8, 0xd7d9, 0xd4e1, + 0xd1ef, 0xcf04, 0xcc21, 0xc946, 0xc673, 0xc3a9, 0xc0e9, 0xbe32, + 0xbb85, 0xb8e3, 0xb64c, 0xb3c0, 0xb140, 0xaecc, 0xac65, 0xaa0a, + 0xa7bd, 0xa57e, 0xa34c, 0xa129, 0x9f14, 0x9d0e, 0x9b17, 0x9930, + 0x9759, 0x9592, 0x93dc, 0x9236, 0x90a1, 0x8f1d, 0x8dab, 0x8c4a, + 0x8afb, 0x89be, 0x8894, 0x877b, 0x8676, 0x8583, 0x84a3, 0x83d6, + 0x831c, 0x8276, 0x81e2, 0x8163, 0x80f6, 0x809e, 0x8059, 0x8027, + 0x800a, 0x8000, 0x800a, 0x8027, 0x8059, 0x809e, 0x80f6, 0x8163, + 0x81e2, 0x8276, 0x831c, 0x83d6, 0x84a3, 0x8583, 0x8676, 0x877b, + 0x8894, 0x89be, 0x8afb, 0x8c4a, 0x8dab, 0x8f1d, 0x90a1, 0x9236, + 0x93dc, 0x9592, 0x9759, 0x9930, 0x9b17, 0x9d0e, 0x9f14, 0xa129, + 0xa34c, 0xa57e, 0xa7bd, 0xaa0a, 0xac65, 0xaecc, 0xb140, 0xb3c0, + 0xb64c, 0xb8e3, 0xbb85, 0xbe32, 0xc0e9, 0xc3a9, 0xc673, 0xc946, + 0xcc21, 0xcf04, 0xd1ef, 0xd4e1, 0xd7d9, 0xdad8, 0xdddc, 0xe0e6, + 0xe3f4, 0xe707, 0xea1e, 0xed38, 0xf055, 0xf374, 0xf695, 0xf9b8, + 0xfcdc, 0x0, 0x324 +}; + + + +//! Функция синуса, табличная, точная, с кубической интерполяцией между точками. + +//! Внутри работает с тоностью 16.16, но конвертируется в 8.24 +//! 83 такта +//!Взято из библиотеки DSP ARM +//! \memberof V_IQmath +int32 _IQ24sinPU_accurate( + int32 x) { + int32 sinVal; /* Temporary variables output */ + int16 *tablePtr; /* Pointer to table */ + int16 fract, in, in2; /* Temporary variables for input, output */ + int32 wa, wb, wc, wd; /* Cubic interpolation coefficients */ + int16 a, b, c, d; /* Four nearest output values */ + int16 fractCube, fractSquare; /* Temporary values for fractional value */ + int16 oneBy6 = 0x1555; /* Fixed point16 value of 1/6 */ + int16 tableSpacing = 0x80; /* Table spacing */ + int32 index; /* Index variable */ + + in = (x>>9)&0x7FFF; + + + /* Calculate the nearest index */ + index = (int32_t) in / tableSpacing; + + /* Calculate the nearest value of input */ + in2 = (int16) ((index) * tableSpacing); + + /* Calculation of fractional value */ + fract = (in - in2) << 8; + + /* fractSquare = fract * fract */ + fractSquare = (int16) ((fract * fract) >> 15); + + /* fractCube = fract * fract * fract */ + fractCube = (int16) ((fractSquare * fract) >> 15); + + /* Checking min and max index of table */ + if (index < 0) { + index = 0; + } else if (index > 256) { + index = 256; + } + + /* Initialise table pointer */ + tablePtr = (int16 *) & sinTableQ15[index]; + + /* Cubic interpolation process */ + /* Calculation of wa */ + /* wa = -(oneBy6)*fractCube + (fractSquare >> 1u) - (0x2AAA)*fract; */ + wa = (int32) oneBy6 *fractCube; + wa += (int32) 0x2AAA *fract; + wa = -(wa >> 15); + wa += ((int32) fractSquare >> 1u); + + /* Read first nearest value of output from the sin table */ + a = *tablePtr++; + + /* sinVal = a * wa */ + sinVal = a * wa; + + /* Calculation of wb */ + wb = (((int32) fractCube >> 1u) - (int32) fractSquare) - + (((int32) fract >> 1u) - 0x7FFF); + + /* Read second nearest value of output from the sin table */ + b = *tablePtr++; + + /* sinVal += b*wb */ + sinVal += b * wb; + + + /* Calculation of wc */ + wc = -(int32) fractCube + fractSquare; + wc = (wc >> 1u) + fract; + + /* Read third nearest value of output from the sin table */ + c = *tablePtr++; + + /* sinVal += c*wc */ + sinVal += c * wc; + + /* Calculation of wd */ + /* wd = (oneBy6)*fractCube - (oneBy6)*fract; */ + fractCube = fractCube - fract; + wd = ((int16) (((int32) oneBy6 * fractCube) >> 15)); + + /* Read fourth nearest value of output from the sin table */ + d = *tablePtr++; + + /* sinVal += d*wd; */ + sinVal += d * wd; + + + /* Return the output value */ + return sinVal>>6; +} + + + + + +//! Функция синуса, приближенная, быстрая. + +//!A sine approximation via a fourth-order cosine approx. +//! Внутри работает с точностью 16.16, но конвертируется в 8.24 +//! http://www.coranac.com/2009/07/sines/ +//! 30 тактов +//! \memberof V_IQmath + +int32 _IQ24sinPU(int32 x) { + int32 c, y; + static const int32 qN = 13, qA = 12, B = 19900, C = 3516; + x = x >> 9; //from 8.24 + c = x << (30 - qN); // Semi-circle info into carry. + x -= 1 << qN; // sine -> cosine calc + + x = x << (31 - qN); // Mask with PI + x = x >> (31 - qN); // Note: SIGNED shift! (to qN) + x = x * x >> (2 * qN - 14); // x=x^2 To Q14 + + y = B - (x * C >> 14); // B - x^2*C + y = (1 << qA) - (x * y >> 16); // A - x^2*(B-x^2*C) + y = y << 12; // to 8.24 + return c >= 0 ? y : -y; +} + +//! Функция atan2. + +//!http://www.dspguru.com/dsp/tricks/fixed-point-atan2-with-self-normalization +//!100 тактов + +//! \memberof V_IQmath +int32 _IQ24atan2PU(int32 inY , int32 inX) { + int32 abs_inY, angle, r, r_3; + + abs_inY = labs(inY)+1;// kludge to prevent 0/0 condition + + if (inX >= 0) { + r = _IQ24div( (inX - abs_inY), (inX + abs_inY)); + r_3=_IQmpy(_IQmpy(r,r),r); + angle = _IQ24mpy(_IQ(0.1963f/(2.0f*_PI)),r_3)-_IQ24mpy(_IQ(0.9817f/(2.0f*_PI)),r)+_IQ24(_PI/4.0f/(2.0f*_PI)); + } else { + r = _IQ24div( (inX + abs_inY), (abs_inY - inX)); + r_3=_IQmpy(_IQmpy(r,r),r); + angle = _IQ24mpy(_IQ(0.1963f/(2.0f*_PI)),r_3)-_IQ24mpy(_IQ(0.9817f/(2.0f*_PI)),r)+_IQ24(3.0f*_PI/4.0f/(2.0f*_PI)); + } + if (inY < 0) { + angle = -angle; + } + angle=angle&0xFFFFFF; + return angle; +} + + +//! Функция вычисления амплитуды вектора +//! 60 тактов + +//! \memberof V_IQmath +int32 _IQ24mag(int32 a, int32 b) { + return _IQ24sqrt(_IQ24mpy(a, a) + _IQ24mpy(b, b)); +} + +/*@}*/ + diff --git a/Vsrc/V_MBVarsConvert.c b/Vsrc/V_MBVarsConvert.c new file mode 100644 index 0000000..f2a12bc --- /dev/null +++ b/Vsrc/V_MBVarsConvert.c @@ -0,0 +1,135 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_MBVarsConv.c + \brief Модуль преобразования данных Modbus + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v.1.1. 02/03/2017 + + \addtogroup v_ModBus */ +/*@{*/ + +#include "main.h" +#include "mbod.h" +#include "math.h" //для fabs +//! Инициализация не требуется +//! \memberof TMBVarsConv +void MBVarsConv_init(TMBVarsConv *p) { + +} + +//! Основная процедура + +//! Вход в .input, выход в .output +//! Кривая задается массивом из NumOfPoints точек по x и по y. +//! \memberof TMBVarsConv +void MBVarsConv_calc(TMBVarsConv *p) { + float number, scale, scaled; + long i, index; + if (ModBus.Enabled == 1){ // Если включен MODBUS + //Для уменьшения вычислительной нагрузки в случае необходимости можно убрать цикл for и проверять по одному элементу за один заход + for (i = 0; i < ModBus.MBInternals.NumOfHRs; i++)// Проверяем все элементы словаря HR (редактируемых параметров) + if (mbodHR[i].type_or_acc == 1){// Если параметр менялся, то анализируем, как его преобразовать + + mbodHR[i].type_or_acc = 0; // Сбрасываем флаг изменения параметра + index = mbodHR[i].index; //какой индекс меняли + + if ((index != 2000) && (index != 2001)) //если не 2000 и не 2001, то нужно сохранить параметры + p->NeedForSave = 1;//Нужно не злоупотреблять этой командой, иначе вся пользовательская память сотрется до дыр! + + //В зависимости от того, какой индекс словаря поменялся, выполняем нужное преобразование. + //На каждую проверку индекса тратится 3 такта. Если проверок будет очень много, + //то логично дополнить драйвер функциями обратного вызова при обращении к параметру + switch (index){ + case 2000://слово управления + //если значение поля команда изменилось по сравнению с предыдущим + if (p->Vars.Command!=p->Vars.CommandPrev){ + if (p->Vars.Command & (1<<0))//команда на запуск + cmd.bit.start = 1; + if (p->Vars.Command & (1<<1))//команда на останов + cmd.bit.stop = 1; + if (p->Vars.Command & (1<<2))//команда на сброс аварии + cmd.bit.trip_reset = 1; + + } + p->Vars.CommandPrev=p->Vars.Command; + break; + + case 2001: // текущая частота вращения + number = (float) p->Vars.speed_ref; + number = fabs(number); + scale = (float) co1_vars.co_scaleNum14; // Частота вращения (об/мин) 16.0 + scaled = number / scale; + refs.speed_ref = _IQ(scaled); + break; + + case 43116: //напряжение защиты в вольтах + number = (float) MBVarsConv.Vars.Umax_protect; + scale = (float) co1_vars.co_scaleNum7; //напряжение ЗПТ базовое + scaled = number / scale; + sm_prot.Umax_protect = _IQ(scaled); + break; + + } + + + } + } + + // Для наблюдаемых преобразование запускаем всегда +// 40002 + number = _IQtoF(cur_par.speed); + scale = (float) co1_vars.co_scaleNum14; // Частота вращения (об/мин) + scaled = scale * number; + p->Vars.CurSpeed = scaled; + +// 40007 + number = _IQtoF(cur_par.Is); + scale = (float) co1_vars.co_scaleNum4; //Ток фазный базовый + scaled = scale * number; + p->Vars.CurIs = scaled; + +// 40054 + p->Vars.Main_ErrorCode = sm_prot.Main_ErrorCode; //код текущей аварии (листается, если несколько) +} + + +void MBVarsConv_slow_calc(TMBVarsConv *p) { + if (p->NeedForSave) {//команда на сохранение параметров привода через модбас + p->NeedForSave = 0; + + //сохраняем посредством драйвера CANopen (все его параметры) + //вызывая функцию сохранения с разными диапазонами, перебирая их все. + co_ODexpositor_paramConservation(&co1_vars, 1, 1); + co_ODexpositor_paramConservation(&co1_vars, 2, 1); + co_ODexpositor_paramConservation(&co1_vars, 3, 1); + co_ODexpositor_paramConservation(&co1_vars, 1, 2); + co_ODexpositor_paramConservation(&co1_vars, 2, 2); + co_ODexpositor_paramConservation(&co1_vars, 3, 2); + + co_ODexpositor_paramConservation(&co1_vars, 1, 3); + co_ODexpositor_paramConservation(&co1_vars, 2, 3); + co_ODexpositor_paramConservation(&co1_vars, 3, 3); + co_ODexpositor_paramConservation(&co1_vars, 1, 4); + co_ODexpositor_paramConservation(&co1_vars, 2, 4); + co_ODexpositor_paramConservation(&co1_vars, 3, 4); + co_ODexpositor_paramConservation(&co1_vars, 1, 5); + co_ODexpositor_paramConservation(&co1_vars, 2, 5); + co_ODexpositor_paramConservation(&co1_vars, 3, 5); + } +} + +/*@}*/ + diff --git a/Vsrc/V_ModBus.c b/Vsrc/V_ModBus.c new file mode 100644 index 0000000..450d2b4 --- /dev/null +++ b/Vsrc/V_ModBus.c @@ -0,0 +1,721 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_ModBus.c + \brief Драйвер ModBus (см. TModBus) + 24-03-2017 Перенос драйвера на К1921ВК01Т НИИЭТ. Сильный рефакторинг. + + 13-08-2012 Теперь поле type структуры MB_Record используется как признак записи/чтения + для не битовых HR/IR-переменных (раньше там был только признак записи). + + 24-01-2012 Теперь проще выбирать между SciaRegs, ScibRegs и ScicRegs. Это сделано + дефайном. Переименована структура RS в MODBUS_RS + + + 26-02-2011 Исправлены какие-то баги, добавлена возможность отслеживать запись в объекты + типа "регистр" за счет изменения номера бита в словаре, поддержка большего + кол-ва процессоров. + + + 27-11-2009 Сделана доработка драйвера для поддержки broadcast (широковещательных) сообщений. Естесственно, + что поддерживаются только команды записи (0x5 - write coils и 0x6 - write single register), т.к. + broadcast сообщения являются неподтверждаемыми сообщениями. Иными словами читать бесполезно, т.к. + ответа не придет... (Алямкин) + + 21-10-2008 Исправлена ошибка переполнения входного регистра - при переполнении выставлялась frame error (из драйвера SYS_VID800) + 29-01-2008 Иправлена ошибка расчета таймаутов + 28-01-2008 Иправлена ошибка в функции пойска нужного элемента словаря + + 29-11-2007 Драйвер переделан для работы с МК17.1 + 1.Исправлена ошибка при обнулении битовых регистров + 2.Исправлен неправильный перебор элементов в словаре + 3.Добавлена возможность автоматического перезапуска драйвера при большом количестве ошибок на линии + + Замечание. Особенность реализации драйвера не предполагает наличия регистра № 0х0000 в словаре + Для устранения недостатка необходимо в инициализации переделать пойск последних элементов + массивов с поля номера регистра на поле адреса переменной регистра. + 16-11-2006 Release Rev 1.0 + + \author Alecksey Anuchin + \version v 1.2 24/03/2017 + + */ + +/** \addtogroup V_ModBus */ +/*@{*/ +#include "V_ModBus.h" +#include "main.h" + +#if defined (HW_MOTORCONTROLBOARD) +//Макросы для переключения RS485 между приемом и передачей +#define MODBUS_RX_RS485 GPIOM->DATAOUTCLR = (1 << 2) //M2 +#define MODBUS_TX_RS485 GPIOM->DATAOUTSET = (1 << 2) //M2 +#define MODBUS_GPIO_VALUE (GPIOK->DATA>>10) & 3 +#else +#define MODBUS_RX_RS485 //NT_GPIOC->MASKHIGHBYTE_bit[4].MASKHB = 4 +#define MODBUS_TX_RS485 //NT_GPIOC->MASKHIGHBYTE_bit[4].MASKHB = 0 +#define MODBUS_GPIO_VALUE (GPIOC->DATA>>8) & 3 +#endif +//Макрос для осциллографирования ножек UART (удобно для отладки, когда вообще ничего не работает) +//Частота тактирования блока UART (настраивается в инициализации микроконтроллера) +#define UART_CLOCK_FREQ 25000000 + +void ModBus_RS_Init(TModBus *p) { + +#if defined (HW_MOTORCONTROLBOARD) + + p->MBInternals.NT_UART = UART2; //Используемый в драйвере номер UART (1,2,3) + + p->MBInternals.NT_UART->CR_bit.UARTEN = 1; // Разрешить работу UART +#else + p->MBInternals.NT_UART = UART2; //Используемый в драйвере номер UART (1,2,3) + + p->MBInternals.NT_UART->CR_bit.UARTEN = 1; // Разрешить работу UART +#endif + + //Текущая реализация драйвера не использует FIFO, обрабатывает данные по одному байту + //и вызывается в прерывании 10кГц. Поэтому частоты обмена больше 57600 не поддерживаются (будет терять байты) + if (p->BaudRate > 57600) + p->BaudRate = 57600; + + // Настройка частоты в двух регистрах: + // задание делителя частоты для получения BaudRate + // Т.к. блок UART тактируется с частотой 25 МГц (так настроено в ините микроконтроллера), + // то для получения частоты, например, 57600 бит/с необходим + // делитель 25000000 / (16 * 57600) = 27,126736111111111111111111111111 + // Целая часть I = 27 + // Дробная часть F = (int)( 0.126736111*64 + 0.5 ) = 8 + // Формулы см. в документации + float DivResFloat = (float) UART_CLOCK_FREQ / (16 * p->BaudRate); + long DivResInt = (long) DivResFloat; + long DivResFrac = (int) ((DivResFloat - DivResInt) * 64 + 0.5); + + p->MBInternals.NT_UART->IBRD_bit.DIVINT = DivResInt; + p->MBInternals.NT_UART->FBRD_bit.DIVFRAC = DivResFrac; + + // 8 бит данных, 1 стоп бит, без контроля четности + p->MBInternals.NT_UART->LCRH_bit.SPS = 0; // Нет проверки четности + p->MBInternals.NT_UART->LCRH_bit.WLEN = 3; // Длина посылки 8 бит + p->MBInternals.NT_UART->LCRH_bit.FEN = 0; // Не использовать FIFO + p->MBInternals.NT_UART->CR_bit.TXE = 1; // Разрешить приём + p->MBInternals.NT_UART->CR_bit.RXE = 1; // Разрешить передачу + p->MBInternals.NT_UART->LCRH_bit.STP2 = 0; // 1 стоп-бит + +} + +void ModBus_ResetError(TModBus *p) { + // Биты 0-3 - биты ошибок, сбрасываются записью в них "1" + p->MBInternals.NT_UART->RSR |= 0x000F; +} + +int16 ModBus_CheckDataReady(TModBus *p) { + // return 1 - если буфер приёмника не пуст + return (!p->MBInternals.NT_UART->FR_bit.RXFE); +} + +int16 ModBus_CheckTxEmpty(TModBus *p) //Если все отправлено (пуст и основной и теневой регистры) +{ + // return 1 - если буфер передатчика пуст + return (p->MBInternals.NT_UART->FR_bit.TXFE); +} + +int16 ModBus_CheckTxReady(TModBus *p) //В передатчик можно положить следующий символ (буфер свободен) +{ + // "1" - если буфер передатчика пуст + return (p->MBInternals.NT_UART->FR_bit.TXFE); +} + +void ModBus_Tx(TModBus *p, int16 data) // Передача данных +{ + Uint8 tmp_data = data; + p->MBInternals.NT_UART->DR_bit.DATA = tmp_data; +} + +//!Инициализация. +//!настройка таймаутов, +//!обработка словаря объектов для последующего быстрого поиска + +//! \memberof TModBus +void ModBus_Init(TModBus *p) { + Uint16 x; + + ModBus_RS_Init(p); + + p->MBInternals.TimeOut1_5 = (int16) (((int32) p->ExecutionFreq * (int32) 17) + / p->BaudRate + 2); // 17 ~ 11*1.5 + p->MBInternals.TimeOut2_5 = (int16) (((int32) p->ExecutionFreq * (int32) 28) + / p->BaudRate); // 28 ~ 11*2.5 + + p->MBInternals.RecievedCounter = -1; + +////// HR + // поиск размера массива HR + x = 0; + while (mbodHR[x].index != 0) + x++; + p->MBInternals.NumOfHRs = x; + + // поиск среднего элемента массива HR + p->MBInternals.MiddleOfHRs = x; + x = 0; + while ((p->MBInternals.MiddleOfHRs >> 1) != 0) { + p->MBInternals.MiddleOfHRs >>= 1; + x = x + x + 1; + } + p->MBInternals.MiddleOfHRs = x; + + // поиск начального инкремента для метода последовательного + // приближения + p->MBInternals.InitialStepOfHRs = 1; + while (x != 0) { + x >>= 1; + p->MBInternals.InitialStepOfHRs <<= 1; + } + p->MBInternals.InitialStepOfHRs >>= 1; + +////// Coils + // поиск размера массива C + x = 0; + while (mbodC[x].index != 0) + x++; + p->MBInternals.NumOfCs = x; + + // поиск среднего элемента массива C + p->MBInternals.MiddleOfCs = x; + x = 0; + while ((p->MBInternals.MiddleOfCs >> 1) != 0) { + p->MBInternals.MiddleOfCs >>= 1; + x = x + x + 1; + } + p->MBInternals.MiddleOfCs = x; + + // поиск начального инкремента для метода последовательного + // приближения + p->MBInternals.InitialStepOfCs = 1; + while (x != 0) { + x >>= 1; + p->MBInternals.InitialStepOfCs <<= 1; + } + p->MBInternals.InitialStepOfCs >>= 1; + +// Discrete Inputs + // поиск размера массива DI + x = 0; + while (mbodDI[x].index != 0) + x++; + p->MBInternals.NumOfDIs = x; + + // поиск среднего элемента массива DI + p->MBInternals.MiddleOfDIs = x; + x = 0; + while ((p->MBInternals.MiddleOfDIs >> 1) != 0) { + p->MBInternals.MiddleOfDIs >>= 1; + x = x + x + 1; + } + p->MBInternals.MiddleOfDIs = x; + + // поиск начального инкремента для метода последовательного + // приближения + p->MBInternals.InitialStepOfDIs = 1; + while (x != 0) { + x >>= 1; + p->MBInternals.InitialStepOfDIs <<= 1; + } + p->MBInternals.InitialStepOfDIs >>= 1; + +////// IR + // поиск размера массива HR + x = 0; + while (mbodIR[x].index != 0) + x++; + p->MBInternals.NumOfIRs = x; + + // поиск среднего элемента массива HR + p->MBInternals.MiddleOfIRs = x; + x = 0; + while ((p->MBInternals.MiddleOfIRs >> 1) != 0) { + p->MBInternals.MiddleOfIRs >>= 1; + x = x + x + 1; + } + p->MBInternals.MiddleOfIRs = x; + + // поиск начального инкремента для метода последовательного + // приближения + p->MBInternals.InitialStepOfIRs = 1; + while (x != 0) { + x >>= 1; + p->MBInternals.InitialStepOfIRs <<= 1; + } + p->MBInternals.InitialStepOfIRs >>= 1; + + for (x = 0; x < 1000; x++) + ; +} + +//!Расчет + +//!Фунция обработки посылок ModBus + +//! \memberof TModBus +void ModBus_Execute(TModBus *p) { + Uint16 x; + volatile Uint16 RxReg; + if (ModBus.Enabled == 1) { // Если включен MODBUS + p->OfflineCounter += 1; + + //долго нет собщений по сети? + if (p->OfflineCounter > p->OfflineCounterMax) { + p->isOnline = 0; //Мы не в сети + p->OfflineCounter = p->OfflineCounterMax + 1; //чтоб не убежал + } else + p->isOnline = 1; //в сети + + //Контроль ошибок + if (p->errorCode) { //Если висит ошибка + p->error += 1; + if (p->AutoRestart == 1) //Если разрешен авто сброс ошибок + ModBus_ResetError(p); + } + if (p->clear_error == 1) //Если выставлен флаг однократного ручного сброса ошибки + { + ModBus_ResetError(p); + p->clear_error = 0; + p->error = 0; + } + //Текущее значение GPIO для отладки + p->GPIOsValue = MODBUS_GPIO_VALUE; + + if (p->MBInternals.TxState < 1) //TxState==0 - передача не идет + if (ModBus_CheckDataReady(p)) //Если есть готовые принятные данные (байт) + { + p->MBInternals.TimeOut = p->MBInternals.TimeOut1_5; //Таймаут равный полтора символа + RxReg = p->MBInternals.NT_UART->DR; //Прием очередного символа + p->errorCode = (RxReg & 0x0F00) >> 8; + RxReg = RxReg & 0xFF; + p->received_data = RxReg; //Перекладывание принятых данных для отладки + p->ReceiveByteCounter++; + if (p->MBInternals.InCount == MODBUS_MAX_RX_COUNT) //Принятно слишком много байт + return; + p->MBInternals.In[p->MBInternals.InCount++] = RxReg; //Принятые данные в массив + p->MBInternals.RxCRC ^= RxReg; //Сразу же расчет контрольной суммы + for (RxReg = 0; RxReg < 8; RxReg++) //Это тоже продолжение расчета контрольной суммы + if (p->MBInternals.RxCRC & 0x01) { + p->MBInternals.RxCRC >>= 1; + p->MBInternals.RxCRC ^= p->MBInternals.MagicNumber; + } else + p->MBInternals.RxCRC >>= 1; + //больше ничего, если есть принятые данные, не делается + return; + } + if (p->MBInternals.TimeOut == 0) //Когда таймаут вышел, его обрабатывает условие p->MBInternals.TimeOut==1, а равен нулю он становится после приема + { + p->MBInternals.InCount = 0; //Обнуление счетчика массива + p->MBInternals.RxCRC = 0xFFFF; //Инициализация контрольной суммы на прием + if (ModBus_CheckTxEmpty(p)) //Если буфер на отправку пуст + { + MODBUS_RX_RS485; //Переключение RS485 на прием + p->MBInternals.TxState = 0; //TxState==0 - передача не идет + p->MBInternals.TxCRC = 0xFFFF; //Инициализация контрольной суммы на передачу + } + return; + } + if (p->MBInternals.TimeOut == 1) //; Сюда попадаем, когда межу символами появляется пауза в 1,5 символа + if (p->MBInternals.InCount != 0) //; Если количество входных данных не равно нулю, то рассматривем, что пришло + { + //поддержка broadcast осуществляется тут (по другому я незнаю как еще - Алямкин) + //далее переход в передачу - нам туда не нужно, потому обрабатываем здесь + //обрабатывать имеет смысл только команды на запись (0x5 - write coils и 0x6 - write single register). + if (p->MBInternals.In[0] == 0)//Входной массив, байт адреса равен 0 - широковещательный + { + //0x5 - write coils + if (p->MBInternals.In[1] == 5) { + x = (p->MBInternals.In[4] << 8) + p->MBInternals.In[5]; //Данные + //0 - если нашла, 3 - если запрос некорректен, 2 - ошибка в поиске + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodC, + p->MBInternals.NumOfCs, 1, + (p->MBInternals.In[2] << 8) + + p->MBInternals.In[3], 1, + p->MBInternals.MiddleOfCs, + p->MBInternals.InitialStepOfCs); + if ((x != 0xFF00) && (x != 0x0000)) //Данные не валидны, для битовой переменной должны быть FF00 или 0000 + p->MBInternals.temp = 3;//делается как будто ModBus_FindVocAddr вернула некорректный запрос + if (p->MBInternals.temp == 0)//если ModBus_FindVocAddr нашла адрес + { + if (p->MBInternals.In[4] == 0) // reset bit + *(Uint16 *) (p->MBInternals.Addr->addr) &= + (0xFFFF + - (1 + << p->MBInternals.Addr->type_or_acc)); + else + // set bit + *(Uint16 *) (p->MBInternals.Addr->addr) |= (1 + << p->MBInternals.Addr->type_or_acc); + } + } + if (p->MBInternals.In[1] == 6) //0x6 - write HR + { + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodHR, + p->MBInternals.NumOfHRs, 16, + (p->MBInternals.In[2] << 8) + + p->MBInternals.In[3], 1, + p->MBInternals.MiddleOfHRs, + p->MBInternals.InitialStepOfHRs); + if (p->MBInternals.temp == 0) //если ModBus_FindVocAddr нашла адрес + { + *(Uint16 *) (p->MBInternals.Addr->addr) = + (p->MBInternals.In[4] << 8) + + p->MBInternals.In[5]; + } + } + + //делаем то же самое, что и ниже для правильной отбраковки сообщения и выходим + p->MBInternals.InCount = 0; //обнуление массива принятых байт + p->MBInternals.TimeOut = 0; //обнуление таймаута + p->MBInternals.RxCRC = 0xFFFF; //инициализация контрольной суммы + return; + } + + if (p->MBInternals.In[0] != p->RSNodeID) //; Если номер узла не совпал с нашим, то выкидываем посылку. + { + p->MBInternals.InCount = 0; + p->MBInternals.TimeOut = 0; + p->MBInternals.RxCRC = 0xFFFF; + return; + } + if (p->MBInternals.RxCRC != 0) //; Если не сошлась контрольная сумма, то выкидываем посылку. + { + p->MBInternals.InCount = 0; + p->MBInternals.TimeOut = 0; + p->MBInternals.RxCRC = 0xFFFF; + return; + } + if (p->MBInternals.RecievedCounter < 0) //!!! //; Если еще не проинициализирован счетчик между фреймов (-1), то + { + //; инициализируем счетчик и выходим. + p->MBInternals.RecievedCounter = p->MBInternals.TimeOut2_5; + return; + } + if (p->MBInternals.RecievedCounter > 0) //!!! //; Если счетчик паузы между фреймов еще положительный, то уменьшаем его + { + //; и выходим + p->MBInternals.RecievedCounter--; + return; + } + //; Если счетчик RecievedCounter досчитал до нуля, то можно переключаться на передачу. + p->MBInternals.RecievedCounter = -1; + p->ReceivePacketCounter++; + MODBUS_TX_RS485; //RS485 на передачу + p->MBInternals.TxState = 1; //Передача + p->MBInternals.RxCRC = 0xFFFF; + p->MBInternals.TimeOut = p->MBInternals.TimeOut2_5; + ModBus_Tx(p, p->MBInternals.In[0]); //Передается первый байт - адрес устройства, почему-то взят из приема... + p->MBInternals.TxCRC ^= p->MBInternals.In[0]; //сразу расчет контрольноу суммы на передачу + //и это тоже расчет контрольной суммы + for (RxReg = 0; RxReg < 8; RxReg++) + if (p->MBInternals.TxCRC & 0x01) { + p->MBInternals.TxCRC >>= 1; + p->MBInternals.TxCRC ^= p->MBInternals.MagicNumber; + } else + p->MBInternals.TxCRC >>= 1; + return; + } else //количество принятых данных равно нулю.. почему-то + { + p->MBInternals.TimeOut = 0; + return; + } + p->MBInternals.TimeOut--; //отсчитывается таймаут + if (p->MBInternals.TxState < 1) //если TxState==0 - нет передачи, т выход, т.к. ниже - передача. + return; + + if (ModBus_CheckTxReady(p) == 0) //если передатчик занят + return; + + //Инициализация таймаута + p->MBInternals.TimeOut = p->MBInternals.TimeOut2_5; + + // с этого момента включается дискретный автомат + // протокола + //p->TxState=0; + + if (p->MBInternals.TxState == 1) //Состояние передачи 1 + { + p->OfflineCounter = 0; //Счетчик для контроля пересылаемых пакетов ModBus + p->MBInternals.temp = p->MBInternals.In[1]; //Принятый массив, тут номер функции + if (p->MBInternals.temp == 1) // Функция read Coils + { + p->MBInternals.ToSend = p->MBInternals.temp; //для отправки - номер функции + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodC, + p->MBInternals.NumOfCs, 1, + (p->MBInternals.In[2] << 8) + p->MBInternals.In[3], + (p->MBInternals.In[4] << 8) + p->MBInternals.In[5], + p->MBInternals.MiddleOfCs, + p->MBInternals.InitialStepOfCs); + if (p->MBInternals.temp == 0) //в словаре найден элемент + { + p->MBInternals.TxState = 10; + } else //ошибка, в словаре элемент не найден + { + p->MBInternals.ToSend |= 0x80; //добавляется маска ошибки + p->MBInternals.TxState = p->MBInternals.temp + 3; + } + } else if (p->MBInternals.temp == 2) // Код функции read DI + { + p->MBInternals.ToSend = p->MBInternals.temp; //для отправки - номер функции + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodDI, + p->MBInternals.NumOfDIs, 1, + (p->MBInternals.In[2] << 8) + p->MBInternals.In[3], + (p->MBInternals.In[4] << 8) + p->MBInternals.In[5], + p->MBInternals.MiddleOfDIs, + p->MBInternals.InitialStepOfDIs); + if (p->MBInternals.temp == 0) //в словаре найден элемент + { + p->MBInternals.TxState = 10; + } else //ошибка, в словаре элемент не найден + { + p->MBInternals.ToSend |= 0x80; //добавляется маска ошибки + p->MBInternals.TxState = p->MBInternals.temp + 3; + } + } else if (p->MBInternals.temp == 3) // Функция read HR + { + p->MBInternals.ToSend = p->MBInternals.temp; + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodHR, + p->MBInternals.NumOfHRs, 16, + (p->MBInternals.In[2] << 8) + p->MBInternals.In[3], + (p->MBInternals.In[4] << 8) + p->MBInternals.In[5], + p->MBInternals.MiddleOfHRs, + p->MBInternals.InitialStepOfHRs); + if (p->MBInternals.temp == 0) //в словаре найден элемент + { + p->MBInternals.TxState = 7; + } else //ошибка, в словаре элемент не найден + { + p->MBInternals.ToSend |= 0x80; //добавляется маска ошибки + p->MBInternals.TxState = p->MBInternals.temp + 3; + } + } else if (p->MBInternals.temp == 4) // Функция read IR + { + p->MBInternals.ToSend = p->MBInternals.temp; + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodIR, + p->MBInternals.NumOfIRs, 16, + (p->MBInternals.In[2] << 8) + p->MBInternals.In[3], + (p->MBInternals.In[4] << 8) + p->MBInternals.In[5], + p->MBInternals.MiddleOfIRs, + p->MBInternals.InitialStepOfIRs); + if (p->MBInternals.temp == 0) //в словаре найден элемент + { + p->MBInternals.TxState = 7; + } else //ошибка, в словаре элемент не найден + { + p->MBInternals.ToSend |= 0x80; //добавляется маска ошибки + p->MBInternals.TxState = p->MBInternals.temp + 3; + } + } else if (p->MBInternals.temp == 5) // Функция write Coil + { + p->MBInternals.ToSend = p->MBInternals.temp; + x = (p->MBInternals.In[4] << 8) + p->MBInternals.In[5]; //Данные + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodC, + p->MBInternals.NumOfCs, 1, + (p->MBInternals.In[2] << 8) + p->MBInternals.In[3], 1, + p->MBInternals.MiddleOfCs, + p->MBInternals.InitialStepOfCs); + if ((x != 0xFF00) && (x != 0x0000)) //Данные не валидны - можно только 0xFF00 и 0x0000 + p->MBInternals.temp = 3; //Как будто бы ModBus_FindVocAddr вернула ошибку + if (p->MBInternals.temp == 0) //в словаре найден элемент + { + p->MBInternals.TxState = 12; + if (p->MBInternals.In[4] == 0) // Операция над словарем - reset bit + *(Uint16 *) (p->MBInternals.Addr->addr) &= (0xFFFF + - (1 << p->MBInternals.Addr->type_or_acc)); + else + // set bit + *(Uint16 *) (p->MBInternals.Addr->addr) |= (1 + << p->MBInternals.Addr->type_or_acc); + p->Refresh = 1; + } else //ошибка, в словаре элемент не найден + { + p->MBInternals.ToSend |= 0x80; //добавляется маска ошибки + p->MBInternals.TxState = p->MBInternals.temp + 3; + } + } else if (p->MBInternals.temp == 6) // Функция write HR + { + p->MBInternals.ToSend = p->MBInternals.temp; + p->MBInternals.temp = ModBus_FindVocAddr(p, mbodHR, + p->MBInternals.NumOfHRs, 16, + (p->MBInternals.In[2] << 8) + p->MBInternals.In[3], 1, + p->MBInternals.MiddleOfHRs, + p->MBInternals.InitialStepOfHRs); + if (p->MBInternals.temp == 0) //в словаре найден элемент + { + p->MBInternals.TxState = 12; + //Операция над словарем - запись регистра + *(Uint16 *) (p->MBInternals.Addr->addr) = + (p->MBInternals.In[4] << 8) + p->MBInternals.In[5]; + p->MBInternals.Addr->type_or_acc = MB_VAR_WRITE; + } else //ошибка, в словаре элемент не найден + { + p->MBInternals.ToSend |= 0x80; //добавляется маска ошибки + p->MBInternals.TxState = p->MBInternals.temp + 3; + } + } else //никакая из поддерживаемых функций + { + p->MBInternals.ToSend = p->MBInternals.temp | 0x80; //добавляется маска ошибки + p->MBInternals.TxState = 2; + } + } else if (p->MBInternals.TxState == 12) // send addr hi for write C + { + p->MBInternals.TxState = 13; + p->MBInternals.ToSend = p->MBInternals.In[2]; + } else if (p->MBInternals.TxState == 13) // send addr low for write C + { + p->MBInternals.TxState = 14; + p->MBInternals.ToSend = p->MBInternals.In[3]; + } else if (p->MBInternals.TxState == 14) // send data hi for write C + { + p->MBInternals.TxState = 15; + p->MBInternals.ToSend = p->MBInternals.In[4]; + } else if (p->MBInternals.TxState == 15) // send data hi for write C + { + p->MBInternals.TxState = 3; + p->MBInternals.ToSend = p->MBInternals.In[5]; + } else if (p->MBInternals.TxState == 10) // send length read Coils + { + p->MBInternals.TxState = 11; + p->MBInternals.In[5] = p->MBInternals.In[5] + + (p->MBInternals.In[4] << 8); + p->MBInternals.ToSend = (p->MBInternals.In[5] + 7) >> 3; + } else if (p->MBInternals.TxState == 11) // send data read Coils + { + p->MBInternals.ToSend = 0; + for (x = 0; x < 8; x++) //Можно упаковать 8 битовых переменных за раз + { + if (p->MBInternals.In[5] != 0) //количество запрашиваемых элементов словаря + { + //Отправка элемента словаря + p->MBInternals.ToSend |= + (((*(Uint16 *) (p->MBInternals.Addr->addr)) + >> (p->MBInternals.Addr->type_or_acc)) + & 0x01) << x; + p->MBInternals.Addr++; + p->MBInternals.In[5]--; + } + if (p->MBInternals.In[5] == 0) //Если все отправили + p->MBInternals.TxState = 3; + } + } else if (p->MBInternals.TxState == 7) // send length read HR + { + p->MBInternals.TxState = 8; + p->MBInternals.ToSend = p->MBInternals.In[5] << 1; + } else if (p->MBInternals.TxState == 8) // send HR high word + { + p->MBInternals.TxState = 9; + //x= *p->MBInternals.Addr->addr; + p->MBInternals.temp = *(Uint16 *) (p->MBInternals.Addr->addr); + + p->MBInternals.ToSend = p->MBInternals.temp >> 8; + } else if (p->MBInternals.TxState == 9) // send HR low word + { + p->MBInternals.ToSend = p->MBInternals.temp & 0xFF; + p->MBInternals.Addr->type_or_acc = MB_VAR_READ; + p->MBInternals.Addr += 1; + p->MBInternals.In[5]--; //уменьшение кол-ва запрошенных переменных во входном массиве + if (p->MBInternals.In[5] == 0) //Если это количество равно нулю (все переменные отправили) + p->MBInternals.TxState = 3; + else + p->MBInternals.TxState = 8; + } else if (p->MBInternals.TxState == 2) // no such function + { + p->MBInternals.ToSend = 1; + p->MBInternals.TxState = 3; + } else if (p->MBInternals.TxState == 5) // send error 2 + { + p->MBInternals.ToSend = 2; + p->MBInternals.TxState = 3; + } else if (p->MBInternals.TxState == 6) // send error 3 + { + p->MBInternals.ToSend = 3; + p->MBInternals.TxState = 3; + } else if (p->MBInternals.TxState == 3) // tx crc low + { + p->MBInternals.ToSend = p->MBInternals.TxCRC & 0x00FF; + p->MBInternals.TxState = 4; + } else if (p->MBInternals.TxState == 4) // tx crc high + { + p->MBInternals.ToSend = p->MBInternals.TxCRC & 0x00FF; + p->MBInternals.TxState = 0; + } else + p->MBInternals.TxState = 0; + + p->MBInternals.TimeOut = p->MBInternals.TimeOut2_5; + + ModBus_Tx(p, p->MBInternals.ToSend); + + p->MBInternals.TxCRC ^= p->MBInternals.ToSend; + for (RxReg = 0; RxReg < 8; RxReg++) + if (p->MBInternals.TxCRC & 0x01) { + p->MBInternals.TxCRC >>= 1; + p->MBInternals.TxCRC ^= p->MBInternals.MagicNumber; + } else + p->MBInternals.TxCRC >>= 1; + return; + + } +} + +//!Вспомогательная функция поиска + +//!функция ищет элемент в таблице и возвращает ссылку на него в p->MBInternals.Addr +//!возвращает: +//! 0 - если нашла +//! 3 - если запрос некорректен +//! 2 - ошибка в пойске + +//! \memberof TModBus +int16 ModBus_FindVocAddr(TModBus *p, volatile MB_Record /*const*/Table[], + Uint16 TableSize, int16 Type, Uint16 Index, int16 NumOfIndexs, + int16 Mid, int16 Step) { + int16 x = 0; + if (Type == 16) { + if (NumOfIndexs == 0) + return (3); + if (NumOfIndexs > 0x7D) + return (3); + } else { + if (NumOfIndexs == 0) + return (3); + if (NumOfIndexs > 0x7D0) + return (3); + } + x += Mid; + Step <<= 1; + do { + Step >>= 1; + if (Index == Table[x].index) { + if ((x + NumOfIndexs) > TableSize) + return (2); + p->MBInternals.Addr = &Table[x]; + return (0); + } else if (Index < Table[x].index) + x -= Step; + else { + x += Step; + if (x >= TableSize) + x = (TableSize - 1); + } + } while (Step != 0); + return (2);; +} + +/*@}*/ + diff --git a/Vsrc/V_MotorModel.c b/Vsrc/V_MotorModel.c new file mode 100644 index 0000000..430d625 --- /dev/null +++ b/Vsrc/V_MotorModel.c @@ -0,0 +1,1172 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_MotorModel.с + \brief Модуль моделей электродвигателей (см. TMotorModel) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2017 + + \addtogroup V_MotorModel + @{ */ + + +#include "V_MotorModel.h" +#include "math.h" +#include "V_MotorParams.h" +#include +#include "main.h" + +#define ADC_MAX_VALUE 4095 +#define ADC_HALF_VALUE 2047 + +//функция случайного "шума" для АЦП +int MotorModel_fastrand() { + static unsigned long g_seed; + g_seed = (214013 * g_seed + 2531011); + return ((g_seed >> 16) & 0x3) -2; +} + +//инициализация переменных модели +void MotorModel_Init(TMotorModel *p) { + Uint16 MotorParametersValid=0; + int i=0; + + p->hallSensor = 1; //инициализация датчика Холла при нулевом угле + p->motorInternals.dt = p->dt; //длительность мертвого времени + p->motorInternals.tpr = p->tpr; //период ШИМ + p->motorInternals.cmpr0 = p->motorInternals.tpr-p->cmpr0; //уставки сравнения ШИМ. С инверсией, потому что так настроен модуль ШИМ + p->motorInternals.cmpr1 = p->motorInternals.tpr-p->cmpr1; + p->motorInternals.cmpr2 = p->motorInternals.tpr-p->cmpr2; + p->motorInternals.cmpr3 = p->motorInternals.tpr-p->cmpr3; + //шаг дискретизации модели (считается в прерывании 10кГц) + p->motorInternals.t = 1.0 / 10000; + + p->motorInternals.cos30 = cos(30.0/360*MOTOR_MODEL_PI*2); + p->fault = 0; //код ошибки модели + p->motorInternals.udSenseK = ADC_HALF_VALUE/540.0; + p->motorInternals.type=p->MotorType&0x7;//передаем тип двигателя вниз в структуру параметров двигателя + + // Поиск макcимального номера набора параметров двигателя из массива + // Нужно для защиты от введения номера несуществующего элемента массива + // НАЧАЛО // + if (p->motorInternals.type==MODEL_INDUCTION_MOTOR){ + // Если r_s, l_s, j одновременно равны нулю, значит наткнулись на нулевой набор параметров. + // Значит предыдущий набор - последний рабочий в массиве, и номер больше, чем у него выбирать нельзя. + while ((IMDATA[i].r_s != 0) && (IMDATA[i].l_s != 0) && (IMDATA[i].j != 0) && (i < 50)) i++;} + else if (p->motorInternals.type==MODEL_SYNC_MOTOR){ + // Если l_sd, l_sq, j одновременно равны нулю, значит наткнулись на нулевой набор параметров. + // Значит предыдущий набор - последний рабочий в массиве, и номер больше, чем у него выбирать нельзя. + while ((SMDATA[i].l_sd != 0) && (SMDATA[i].l_sq != 0) && (SMDATA[i].j != 0) && (i < 50)) i++;} + else if (p->motorInternals.type==MODEL_DC_MOTOR){ + // Если r_a, l_a, j одновременно равны нулю, значит наткнулись на нулевой набор параметров. + // Значит предыдущий набор - последний рабочий в массиве, и номер больше, чем у него выбирать нельзя. + while ((DCMDATA[i].r_a != 0) && (DCMDATA[i].l_a != 0) && (DCMDATA[i].j != 0) && (i < 50)) i++;} + else if (p->motorInternals.type==MODEL_SRD_MOTOR){ + // Если r_s, pp, j одновременно равны нулю, значит наткнулись на нулевой набор параметров. + // Значит предыдущий набор - последний рабочий в массиве, и номер больше, чем у него выбирать нельзя. + while ((SRMDATA[i].r_s != 0) && (SRMDATA[i].pp != 0) && (SRMDATA[i].j != 0) && (i < 50)) i++;} + p->MotorParametersNumMax = i; + // КОНЕЦ // + + // проверка валидности введенного номера набора параметров + // НАЧАЛО // + if ((p->MotorParametersNum > 0) && (p->MotorParametersNum <= p->MotorParametersNumMax)) MotorParametersValid = 1; + else + { + if (p->MotorParametersNum > p->MotorParametersNumMax){ + p->MotorParametersNum = p->MotorParametersNumMax; + MotorParametersValid = 1;} + else if (p->MotorParametersNum == 0) MotorParametersValid = 0; + } + // КОНЕЦ // + + // Инициализация параметров двигателей + if (p->motorInternals.type==MODEL_INDUCTION_MOTOR){//тип двигателя - асинхронный + if (MotorParametersValid){ + p->motorInternals.ls = IMDATA[p->MotorParametersNum-1].l_s; //индуктивность статора + p->motorInternals.lr = IMDATA[p->MotorParametersNum-1].l_r; //индуктивность ротора + p->motorInternals.lm = IMDATA[p->MotorParametersNum-1].l_m; //взаимная индуктивность + //Внимание: в параметрах ls и lr должна быть полная индуктивность статора и ротора. Иногда в параметрах двигателя приводятся индуктивности рассеяния + //статора и ротора, которые меньше, чем l_m. Чтобы получить полную индуктивность статора или ротора, нужно прибавить l_m к l_s или l_r соответственно. + //Проверим правильность ввода индуктивностей: + if ((p->motorInternals.ls < p->motorInternals.lm) || (p->motorInternals.lr < p->motorInternals.lm)) + p->fault = MODEL_WRONG_PARAMETERS; + p->motorInternals.rs = IMDATA[p->MotorParametersNum-1].r_s; //сопротивление статора + p->motorInternals.rr = IMDATA[p->MotorParametersNum-1].r_r; //сопротивление ротора + p->motorInternals.pp = IMDATA[p->MotorParametersNum-1].pp; //число пар полюсов + p->motorInternals.j = IMDATA[p->MotorParametersNum-1].j; //момент инерции + p->motorInternals.QEPResolution = IMDATA[p->MotorParametersNum-1].qep; //разрешение энкодера + p->motorInternals.RatedPower = IMDATA[p->MotorParametersNum-1].RatedPower; //номинальная мощность (справочная величина, не используется в расчетах) + p->motorInternals.RatedSpeed = IMDATA[p->MotorParametersNum-1].RatedSpeed; //номинальная скорость (справочная величина, не используется в расчетах) + p->motorInternals.RatedCurrent = IMDATA[p->MotorParametersNum-1].RatedCurrent; //номинальный действующий ток + p->motorInternals.MechLoss = p->motorInternals.j * 10; //механические потери + } + + // Инициализация коэффициентов и расчетных величин, завязанных на параметры двигателя + + p->motorInternals.speedK = 60/(4*MOTOR_MODEL_PI); //коэффициент датчика скорости + + p->motorInternals.iADCk = p->motorInternals.RatedCurrent*1.414*3; // Расчетный коэффициент АЦП равен троекратной амплитуде номинального тока + p->motorInternals.iSenseK = (ADC_HALF_VALUE*1.0)/p->motorInternals.iADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + p->motorInternals.ks = -(p->motorInternals.lr/1000.0) / (p->motorInternals.lm/1000.0 * p->motorInternals.lm/1000.0 - p->motorInternals.ls/1000.0 * p->motorInternals.lr/1000.0); //коэффициенты обратной матрицы индуктивностей + p->motorInternals.kr = -(p->motorInternals.ls/1000.0) / (p->motorInternals.lm/1000.0 * p->motorInternals.lm/1000.0 - p->motorInternals.ls/1000.0 * p->motorInternals.lr/1000.0); + p->motorInternals.km = (p->motorInternals.lm/1000.0) / (p->motorInternals.lm/1000.0 * p->motorInternals.lm/1000.0 - p->motorInternals.ls/1000.0 * p->motorInternals.lr/1000.0); + + p->motorInternals.psa = 0; //потокосцепления статора в осях альфа,бета + p->motorInternals.psb = 0; + } + + if (p->motorInternals.type==MODEL_SYNC_MOTOR){//тип двигателя - синхронный + if (MotorParametersValid){ + p->motorInternals.r_f = SMDATA[p->MotorParametersNum-1].r_f; //сопротивление ОВ + p->motorInternals.l_f = SMDATA[p->MotorParametersNum-1].l_f; //индуктивность ОВ + p->motorInternals.l_m = SMDATA[p->MotorParametersNum-1].l_m; //коэффициент магнитного потока (взаимная индуктивность) + p->motorInternals.rs = SMDATA[p->MotorParametersNum-1].r_s; //сопротивление статора + p->motorInternals.lsd = SMDATA[p->MotorParametersNum-1].l_sd; //индуктивность статора + p->motorInternals.lsq = SMDATA[p->MotorParametersNum-1].l_sq; //индуктивность статора + p->motorInternals.pp = SMDATA[p->MotorParametersNum-1].pp; //число пар полюсов + p->motorInternals.j = SMDATA[p->MotorParametersNum-1].j; //момент инерции + p->motorInternals.QEPResolution = SMDATA[p->MotorParametersNum-1].qep; //разрешение энкодера + p->motorInternals.m = SMDATA[p->MotorParametersNum-1].psi_pm; //потокосцепление ротора равно потоку постоянных магнитов + p->motorInternals.RatedPower = SMDATA[p->MotorParametersNum-1].RatedPower; //номинальная мощность (справочная величина, не используется в расчетах) + p->motorInternals.RatedSpeed = SMDATA[p->MotorParametersNum-1].RatedSpeed; //номинальная скорость (справочная величина, не используется в расчетах) + p->motorInternals.RatedCurrent = SMDATA[p->MotorParametersNum-1].RatedCurrent; //номинальный действующий ток + p->motorInternals.RatedFluxCurrent = SMDATA[p->MotorParametersNum-1].RatedFluxCurrent; //номинальный ток ОВ + p->motorInternals.MechLoss = p->motorInternals.j * 10; //механические потери + } + // Инициализация коэффициентов и расчетных величин, завязанных на параметры двигателя + + p->motorInternals.speedK = 60/(4*MOTOR_MODEL_PI); //коэффициент датчика скорости + + p->motorInternals.iADCk = p->motorInternals.RatedCurrent*1.414*3; // Расчетный коэффициент АЦП равен троекратной амплитуде номинального тока + p->motorInternals.iSenseK = (ADC_HALF_VALUE*1.0)/p->motorInternals.iADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + p->motorInternals.ifADCk = p->motorInternals.RatedFluxCurrent*3; // Расчетный коэффициент АЦП равен троекратному номинальному току ОВ + p->motorInternals.ifSenseK = (ADC_HALF_VALUE*1.0)/p->motorInternals.ifADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + p->motorInternals._1_lsd = 1.0/(p->motorInternals.lsd/1000); //обратная величина + p->motorInternals._1_lsq = 1.0/(p->motorInternals.lsq/1000); //обратная величина + + if (p->motorInternals.l_f != 0) //С обмоткой возбуждения + { + p->motorInternals._1_l_f = 1.0/(p->motorInternals.l_f/1000); // Обратная величина (переведенная из мГн в Гн) + p->motorInternals.syncm_pm = 0; + p->motorInternals.m = 0; //потокосцепление ротора равно нулю + } + else //С постоянными магнитами + { + p->motorInternals.syncm_pm = 1; + p->motorInternals.ifADCk = 0; // Расчетный коэффициент АЦП тока ОВ + } + + p->motorInternals.psd = p->motorInternals.m;//потокосцепления статора в осях d,q + p->motorInternals.psq = 0; + p->motorInternals.i_f = 0; + } + + if (p->motorInternals.type==MODEL_DC_MOTOR){//тип двигателя - коллекторный двигатель постоянного тока + if (MotorParametersValid){ + p->motorInternals.pp = 2; //число пар полюсов (параметр не нужен, просто чтобы не мусор) + p->motorInternals.r_f = DCMDATA[p->MotorParametersNum-1].r_f; //сопротивление ОВ + p->motorInternals.l_f = DCMDATA[p->MotorParametersNum-1].l_f; //индуктивность ОВ + p->motorInternals.l_m = DCMDATA[p->MotorParametersNum-1].l_m; //коэффициент магнитного потока (взаимная индуктивность) + p->motorInternals.r_a = DCMDATA[p->MotorParametersNum-1].r_a; //сопротивление якоря + p->motorInternals.l_a = DCMDATA[p->MotorParametersNum-1].l_a; //индуктивность якоря + p->motorInternals.RatedFluxCurrent = DCMDATA[p->MotorParametersNum-1].RatedFluxCurrent; //Номинальный ток ОВ + p->motorInternals.RatedCurrent = DCMDATA[p->MotorParametersNum-1].RatedCurrent; //Номинальный ток якоря + p->motorInternals.j = DCMDATA[p->MotorParametersNum-1].j; //момент инерции + p->motorInternals.QEPResolution = DCMDATA[p->MotorParametersNum-1].qep; //разрешение энкодера + p->motorInternals.RatedPower = DCMDATA[p->MotorParametersNum-1].RatedPower; //номинальная мощность (справочная величина, не используется в расчетах) + p->motorInternals.RatedSpeed = DCMDATA[p->MotorParametersNum-1].RatedSpeed; //номинальная скорость (справочная величина, не используется в расчетах) + p->motorInternals.MechLoss = p->motorInternals.j * 10; //механические потери + } + // Инициализация коэффициентов и расчетных величин, завязанных на параметры двигателя + + p->motorInternals.speedK = 60/(4*MOTOR_MODEL_PI); //коэффициент датчика скорости + p->motorInternals.iADCk = (ADC_HALF_VALUE*1.0)/p->motorInternals.iSenseK; // Расчетный коэффициент АЦП тока Оя + + p->motorInternals.iADCk = p->motorInternals.RatedCurrent*1.414*3; // Расчетный коэффициент АЦП равен троекратной амплитуде номинального тока + p->motorInternals.iSenseK = (ADC_HALF_VALUE*1.0)/p->motorInternals.iADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + p->motorInternals.ifADCk = p->motorInternals.RatedFluxCurrent*3; // Расчетный коэффициент АЦП равен троекратному номинальному току ОВ + p->motorInternals.ifSenseK = (ADC_MAX_VALUE*1.0)/p->motorInternals.ifADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + p->motorInternals.r_ad = 0; + + p->motorInternals._1_l_a = 1.0/(p->motorInternals.l_a/1000); // Обратная величина (переведенная из мГн в Гн) + if (p->motorInternals.l_f != 0) // если ДПТ с обмоткой возбуждения + { + // Расчитываем необходимые коэффициенты для работы ОВ + p->motorInternals._1_l_f = 1.0/(p->motorInternals.l_f/1000); // Обратная величина (переведенная из мГн в Гн) + p->motorInternals.ifADCk = (ADC_HALF_VALUE*1.0)/p->motorInternals.ifSenseK; // Расчетный коэффициент АЦП тока ОВ + p->motorInternals.dcm_pm = 0; // Сбрасываем флаг возбуждения от ПМ + } + else // ДПТ с постоянными магнитами + { + // В этом случае обмотку возбуждения не считаем + p->motorInternals.dcm_pm = 1; // Устанавливаем флаг возбуждения от ПМ + p->motorInternals.ifADCk = 0; // Расчетный коэффициент АЦП тока ОВ устанавливаем нулю + } + p->motorInternals.i_a = 0; //ток ОВ + p->motorInternals.i_f = 0; //поток якоря + } + + if (p->motorInternals.type==MODEL_SRD_MOTOR){//тип двигателя - ВИД (Switched Reluctance Drive, SRD) + if (MotorParametersValid){ + p->motorInternals.rs = SRMDATA[p->MotorParametersNum-1].r_s; //сопротивление фазной обмотки + p->motorInternals.pp = SRMDATA[p->MotorParametersNum-1].pp; //число пар полюсов + p->motorInternals.j = SRMDATA[p->MotorParametersNum-1].j; //момент инерции + p->motorInternals.QEPResolution = SRMDATA[p->MotorParametersNum-1].qep; //разрешение энкодера + p->motorInternals.speedK = SRMDATA[p->MotorParametersNum-1].sk; //коэффициент датчика скорости + p->motorInternals.RatedPower = SRMDATA[p->MotorParametersNum-1].RatedPower; //номинальная мощность (справочная величина, не используется в расчетах) + p->motorInternals.RatedSpeed = SRMDATA[p->MotorParametersNum-1].RatedSpeed; //номинальная скорость (справочная величина, не используется в расчетах) + p->motorInternals.RatedCurrent = SRMDATA[p->MotorParametersNum-1].RatedCurrent; //номинальный действующий ток (справочная величина, не используется в расчетах) + p->motorInternals.MechLoss = p->motorInternals.j * 10; //механические потери + } + // Инициализация коэффициентов и расчетных величин, завязанных на параметры двигателя + + p->motorInternals.inv_pp=1.0/p->motorInternals.pp; + + p->motorInternals.iADCk = p->motorInternals.RatedCurrent*1.414*3; // Расчетный коэффициент АЦП равен троекратной амплитуде номинального тока + p->motorInternals.iSenseK = (ADC_MAX_VALUE*1.0)/p->motorInternals.iADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + p->motorInternals.ifADCk = p->motorInternals.RatedFluxCurrent*3; // Расчетный коэффициент АЦП равен троекратному номинальному току ОВ + p->motorInternals.ifSenseK = (ADC_MAX_VALUE*1.0)/p->motorInternals.ifADCk; //коэффициент датчика тока для преобразования тока в амперах в код АЦП + + + p->motorInternals.isPhaseA=0; //фазные токи + p->motorInternals.isPhaseB=0; + p->motorInternals.isPhaseC=0; + p->motorInternals.psa=0; //потокосцепления фаз + p->motorInternals.psb=0; + p->motorInternals.psc=0; + + //Определим количество отрезков (номер последней точки) кривых намагничивания + volatile int Psi_I_s_resolution = 0; + volatile int Psi_I_r_resolution = 0; + //в последней точке должны быть отрицательные значения, как маркер окончания массива + while ((Psi_I_s[Psi_I_s_resolution].i >= 0) && (Psi_I_s_resolution < 50)) Psi_I_s_resolution++; + while ((Psi_I_r[Psi_I_r_resolution].i >= 0) && (Psi_I_r_resolution < 50)) Psi_I_r_resolution++; + Psi_I_s_resolution--; //уменьшаем на 1, чтобы получить количество отрезков + Psi_I_r_resolution--; //уменьшаем на 1, чтобы получить количество отрезков + + //расчет пределов изменения переменных (угол, ток, потокосцепление) и шага дискретизации по ним + p->motorInternals.ThetaMax = 2*MOTOR_MODEL_PI; //диапазон угла - 0..2Пи + p->motorInternals.IMax = Psi_I_s[Psi_I_s_resolution].i; //Считаем, что максимальный ток лежит в последней точке кривой для согласованного положения + p->motorInternals.PsiMax = Psi_I_s[Psi_I_s_resolution].psi; //Максимальный поток лежит в последней точке кривой для согласованного положения + p->motorInternals.ThetaStep = p->motorInternals.ThetaMax/(SRD_SURFACE_RESOLUTION+1); //приращение угла. Здесь, в отличие от тока и потока, делится на SRD_SURFACE_RESOLUTION+1, + //т.к. кривая зациклена, и не должно быть двух одинаковых соседних точек для углов 0 и 2пи. Т.е. точку 2пи в конце выкинули + p->motorInternals.ThetaStep_inv = 1.0/p->motorInternals.ThetaStep; + p->motorInternals.IStep = p->motorInternals.IMax/SRD_SURFACE_RESOLUTION; //приращение тока + p->motorInternals.IStep_inv = 1.0/p->motorInternals.IStep; + p->motorInternals.PsiStep = p->motorInternals.PsiMax/SRD_SURFACE_RESOLUTION; //приращение потока + p->motorInternals.PsiStep_inv = 1.0/p->motorInternals.PsiStep; +// p->motorInternals.j = srm_j[p->MotorParametersNum-1]; //уже присвоен выше (Савкин) +// p->motorInternals.MechLoss = p->motorInternals.j * 10; //механические потери + + //Уточнение кривых намагничивания при помощи кубической интерполяции, инициализация поверхности psi=f(i,theta) + for (int i=0; imotorInternals.IStep; + Psi_I_s_acc[i] = MotorModel_FluxCubicInterpolation (TmpI, Psi_I_s, Psi_I_s_resolution); //в принципе, эти две уточненные кривые можно убрать, т.к. из них тут же генерится поверхность, а + Psi_I_r_acc[i] = MotorModel_FluxCubicInterpolation (TmpI, Psi_I_r, Psi_I_r_resolution); //сами кривые нигде не используются. Можно здесь просто оставить локальные переменные и сэкономить память + for (int t=0; tmotorInternals.ThetaStep; + Psi_ITheta[i][t] = (Psi_I_s_acc[i] + Psi_I_r_acc[i])*0.5 - (Psi_I_s_acc[i] - Psi_I_r_acc[i])*0.5*_IQtoF(_IQcos(_IQ(TmpTheta))); //Эту поверхность тоже можно сделать локальной, она в расчете модели не участвует + } + } + + //Генерация поверхности i=f(psi,theta) из psi=f(i,theta) + for (int t=0; t i=f(psi) + for (int n=0; nmotorInternals.PsiStep; + if (TmpPsi <= Psi_ITheta[0][t]) //ограничиваем минимум (на всякий случай) + { + I_PsiTheta[n][t] = 0; + } + else if (TmpPsi >= Psi_ITheta[SRD_SURFACE_RESOLUTION][t]) //ограничиваем максимум + { + I_PsiTheta[n][t] = p->motorInternals.IMax; //на кривой намагничивания для данного угла может вообще не быть максимального потока (будет он только в согласованном положении). Поэтому, будет насыщение + } + else //в ограничения не попали, интерполируем линейно. + { + for (int i = 1; i < SRD_SURFACE_RESOLUTION+1; i++) //Ищем отрезок в исходной кривой psi=f(i), куда попал дискретный поток p + { + if (Psi_ITheta[i][t] >= TmpPsi) //поток в следующей точке больше заданного, значит попали в нужный отрезок + { + I_PsiTheta[n][t] = p->motorInternals.IStep*i - (Psi_ITheta[i][t] - TmpPsi)*p->motorInternals.IStep/(Psi_ITheta[i][t] - Psi_ITheta[i-1][t]); + break; + } + } + } + } + } + + //Генерация поверхности момента M=f(i,theta) + for (int t=0; t SRD_SURFACE_RESOLUTION) + tPlus -= (SRD_SURFACE_RESOLUTION+1); + int tMinus = t-1; + if (tMinus < 0) + tMinus += (SRD_SURFACE_RESOLUTION+1); + for (int i=1; imotorInternals.ThetaStep_inv; + float PsiMinus = Psi_ITheta[i][t] - (Psi_ITheta[i][t] - Psi_ITheta[i][tMinus])*SRD_DELTA_THETA*p->motorInternals.ThetaStep_inv; + //Считаем коэнергию - интеграл потокосцепления по току (методом трапеций) + WcoPlus += (PsiPlus + PsiPlus_prev)*0.5*p->motorInternals.IStep; + WcoMinus += (PsiMinus + PsiMinus_prev)*0.5*p->motorInternals.IStep; + PsiPlus_prev = PsiPlus; + PsiMinus_prev = PsiMinus; + //PhaseTorque = p->motorInternals.pp*(p->motorInternals.wm-p->motorInternals.wp)*50; // 50 = inv_0.02 dTeta так было в исходном варианте + M_ITheta[i][t] = p->motorInternals.pp*(WcoPlus - WcoMinus)*SRD_DELTA_THETA_INV*0.5; //считаем момент, как производную коэнергии + } + } + } + + // Расчет коэффициентов модели, неизменных во времени + p->motorInternals.inv_tpr=1.0/p->motorInternals.tpr; + p->motorInternals.inv_j=1.0/p->motorInternals.j; + + p->motorInternals.t2 = p->motorInternals.t / 2; //половина шага дискретизации + + // Обнуление переменных состояния + p->motorInternals.tetaR = 0; //угол положения ротора электрический + p->motorInternals.tetaRM = 0; //угол положения ротора механический + p->motorInternals.omega = 0; //скорость, рад/с + p->motorInternals.prd = 0; //потокосцепления ротора в осях d,q + p->motorInternals.prq = 0; + p->motorInternals.isa = 0; //токи статора в осях альфа,бета + p->motorInternals.isb = 0; + p->motorInternals.ira = 0; //токи ротора в осях альфа,бета + p->motorInternals.irb = 0; + p->motorInternals.ird = 0; //токи ротора в осях d,q + p->motorInternals.irq = 0; + + +} + +//расчет напряжений для двухфазного двигателя +void MotorModel_calcU42Phase(TMotorModel *p) { + if (p->InvertorEna) { //инвертор включен + // расчет напряжений питания + // перерасчет влияния мертвого времени на скважность фазы в зависимости от знака тока + if (p->motorInternals.i_a > 0) { + if (p->motorInternals.cmpr0 > p->motorInternals.dt) + p->motorInternals.dta = -p->motorInternals.dt; + else + p->motorInternals.dta = -p->motorInternals.cmpr0; + } else { + if ((p->motorInternals.cmpr0 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dta = +p->motorInternals.dt; + else + p->motorInternals.dta = p->motorInternals.tpr - p->motorInternals.cmpr0; + } + if (p->motorInternals.i_a < 0) { + if (p->motorInternals.cmpr1 > p->motorInternals.dt) + p->motorInternals.dtb = -p->motorInternals.dt; + else + p->motorInternals.dtb = -p->motorInternals.cmpr1; + } else { + if ((p->motorInternals.cmpr1 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dtb = +p->motorInternals.dt; + else + p->motorInternals.dtb = p->motorInternals.tpr - p->motorInternals.cmpr1; + } + //расчет потенциалов с учетом влияния мертвого времени + p->motorInternals.fia = p->motorInternals.udc * (p->motorInternals.cmpr0 + (p->motorInternals.dta >> 1)) / p->motorInternals.tpr; + p->motorInternals.fib = p->motorInternals.udc * (p->motorInternals.cmpr1 + (p->motorInternals.dtb >> 1)) / p->motorInternals.tpr; + p->motorInternals.u_a = p->motorInternals.fia - p->motorInternals.fib;//Напряжение на якоре + + if (p->motorInternals.i_f > 0) { + if (p->motorInternals.cmpr2 > p->motorInternals.dt) + p->motorInternals.dtc = -p->motorInternals.dt; + else + p->motorInternals.dtc = -p->motorInternals.cmpr2; + } else { + if ((p->motorInternals.cmpr2 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dtc = +p->motorInternals.dt; + else + p->motorInternals.dtc = p->motorInternals.tpr - p->motorInternals.cmpr2; + } + //расчет потенциалов с учетом влияния мертвого времени + p->motorInternals.fic = p->motorInternals.udc * (p->motorInternals.cmpr2 + (p->motorInternals.dtc >> 1)) / p->motorInternals.tpr; + p->motorInternals.u_f = p->motorInternals.fic;//Напряжение на ОВ + + + p->motorInternals.isPhaseA_prev = p->motorInternals.isPhaseA; + p->motorInternals.CurrentInvertedFlag = 0; + } else + {//Инвертор выключен +/* + if (p->motorInternals.isPhaseA > 0) + p->motorInternals.u_a = -p->motorInternals.udc; + else + p->motorInternals.u_a = p->motorInternals.udc; +*/ + p->motorInternals.u_a = 0; + + p->motorInternals.fia = 0; + p->motorInternals.fib = 0; + p->motorInternals.fic = 0; + + if (p->motorInternals.isPhaseA * p->motorInternals.isPhaseA_prev < 0) //ток сменил свой знак с момента выклчюения инвертора + p->motorInternals.CurrentInvertedFlag = 7;//флаг, что все интересующие токи пересекли ноль + + if (p->motorInternals.CurrentInvertedFlag == 7) {//прикладываем нулевое напряжение, а в модели ДПТ обнулится формула тока + p->motorInternals.u_a=0; + } + p->motorInternals.u_f = 0;//Напряжение ОВ равно нулю + } + + +} + +//расчет напряжений для трехфазного двигателя +void MotorModel_calcU43Phase(TMotorModel *p) { + if (p->InvertorEna) { //инвертор включен + // расчет напряжений питания + // перерасчет влияния мертвого времени на скважность фазы в зависимости от знака тока + if (p->motorInternals.isPhaseA > 0) { + if (p->motorInternals.cmpr0 > p->motorInternals.dt) + p->motorInternals.dta = -p->motorInternals.dt; + else + p->motorInternals.dta = -p->motorInternals.cmpr0; + } else { + if ((p->motorInternals.cmpr0 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dta = +p->motorInternals.dt; + else + p->motorInternals.dta = p->motorInternals.tpr - p->motorInternals.cmpr0; + } + if (p->motorInternals.isPhaseB > 0) { + if (p->motorInternals.cmpr1 > p->motorInternals.dt) + p->motorInternals.dtb = -p->motorInternals.dt; + else + p->motorInternals.dtb = -p->motorInternals.cmpr1; + } else { + if ((p->motorInternals.cmpr1 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dtb = +p->motorInternals.dt; + else + p->motorInternals.dtb = p->motorInternals.tpr - p->motorInternals.cmpr1; + } + if (p->motorInternals.isPhaseC > 0) { + if (p->motorInternals.cmpr2 > p->motorInternals.dt) + p->motorInternals.dtc = -p->motorInternals.dt; + else + p->motorInternals.dtc = -p->motorInternals.cmpr2; + } else { + if ((p->motorInternals.cmpr2 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dtc = +p->motorInternals.dt; + else + p->motorInternals.dtc = p->motorInternals.tpr - p->motorInternals.cmpr2; + } + + //расчет потенциалов с учетом влияния мертвого времени + p->motorInternals.fia = p->motorInternals.udc * (p->motorInternals.cmpr0 + (p->motorInternals.dta >> 1)) / p->motorInternals.tpr; + p->motorInternals.fib = p->motorInternals.udc * (p->motorInternals.cmpr1 + (p->motorInternals.dtb >> 1)) / p->motorInternals.tpr; + p->motorInternals.fic = p->motorInternals.udc * (p->motorInternals.cmpr2 + (p->motorInternals.dtc >> 1)) / p->motorInternals.tpr; + p->motorInternals.fiav = (p->motorInternals.fia + p->motorInternals.fib + p->motorInternals.fic) / 3; //потенциал срежней точки + p->motorInternals.ua = p->motorInternals.fia - p->motorInternals.fiav; //напряжения + p->motorInternals.ub = p->motorInternals.fib - p->motorInternals.fiav; + p->motorInternals.uc = p->motorInternals.fic - p->motorInternals.fiav; + + //напряжения в осях альфа,бета + p->motorInternals.usa = p->motorInternals.ua; + p->motorInternals.usb = 0.577350269 * p->motorInternals.ua + 1.154700538 * p->motorInternals.ub; + + p->motorInternals.isPhaseA_prev = p->motorInternals.isPhaseA; + p->motorInternals.isPhaseB_prev = p->motorInternals.isPhaseB; + p->motorInternals.isPhaseC_prev = p->motorInternals.isPhaseC; + p->motorInternals.CurrentInvertedFlag = 0; + + } else { //инвертор выключен + //сложно рассчитать напряжение, которое приложено к двигателю, когда инвертор выключен. + //поэтому тут инвертор как бы в релейном режиме стремится поддерживать токи нулевыми, пока скорость не снизится до нуля, + //а потом "замыкает" фазы двигателя. Это отличается от реальности, конечно, но лучше, чем не делать ничего. + + if (p->motorInternals.isPhaseA > 0) + p->motorInternals.fia = 0; + else + p->motorInternals.fia = p->motorInternals.udc; + + if (p->motorInternals.isPhaseB > 0) + p->motorInternals.fib = 0; + else + p->motorInternals.fib = p->motorInternals.udc; + + if (p->motorInternals.isPhaseC > 0) + p->motorInternals.fic = 0; + else + p->motorInternals.fic = p->motorInternals.udc; + + if (p->motorInternals.isPhaseA * p->motorInternals.isPhaseA_prev < 0) //ток сменил свой знак с момента выклчюения инвертора + p->motorInternals.CurrentInvertedFlag |= 1; + + if (p->motorInternals.isPhaseB * p->motorInternals.isPhaseB_prev < 0) //ток сменил свой знак с момента выклчюения инвертора + p->motorInternals.CurrentInvertedFlag |= 2; + + if (p->motorInternals.isPhaseC * p->motorInternals.isPhaseC_prev < 0) //ток сменил свой знак с момента выклчюения инвертора + p->motorInternals.CurrentInvertedFlag |= 4; + + if (p->motorInternals.CurrentInvertedFlag == 7) { + p->motorInternals.fia = 0; + p->motorInternals.fib = 0; + p->motorInternals.fic = 0; + } + + p->motorInternals.fiav = (p->motorInternals.fia + p->motorInternals.fib + p->motorInternals.fic) * (1.0/3); //потенциал срежней точки + p->motorInternals.ua = p->motorInternals.fia - p->motorInternals.fiav; //напряжения + p->motorInternals.ub = p->motorInternals.fib - p->motorInternals.fiav; + p->motorInternals.uc = p->motorInternals.fic - p->motorInternals.fiav; + + //напряжения в осях альфа,бета + p->motorInternals.usa = p->motorInternals.ua; + p->motorInternals.usb = 0.577350269 * p->motorInternals.ua + 1.154700538 * p->motorInternals.ub; + } +} + +//расчет напряжения для ОВ синхронного двигателя +void MotorModel_calcU4SyncMFieldWinding(TMotorModel *p) { + if (p->InvertorEna) { //инвертор включен + // расчет напряжений питания + // перерасчет влияния мертвого времени на скважность фазы в зависимости от знака тока + if (p->motorInternals.i_f > 0) { + if (p->motorInternals.cmpr3 > p->motorInternals.dt) + p->motorInternals.dtf = -p->motorInternals.dt; + else + p->motorInternals.dtf = -p->motorInternals.cmpr3; + } else { + if ((p->motorInternals.cmpr3 + p->motorInternals.dt) < p->motorInternals.tpr) + p->motorInternals.dtf = +p->motorInternals.dt; + else + p->motorInternals.dtf = p->motorInternals.tpr - p->motorInternals.cmpr3; + } + //расчет потенциалов с учетом влияния мертвого времени + p->motorInternals.u_f = p->motorInternals.udc * (p->motorInternals.cmpr3 + (p->motorInternals.dtf >> 1)) / p->motorInternals.tpr;//Напряжение на ОВ + } else + {//Инвертор выключен + p->motorInternals.u_f = 0;//Напряжение ОВ равно нулю + } + + +} + +void MotorModel_MechModelExecute(TMotorModel *p) { + float d_omega; + p->loadTmp = 0; + if (p->motorInternals.omega > 0) + p->loadTmp = p->load + p->motorInternals.MechLoss; + if (p->motorInternals.omega < 0) + p->loadTmp = -p->load - p->motorInternals.MechLoss; + + d_omega = p->motorInternals.t / p->motorInternals.j * (p->motorInternals.torque - p->loadTmp); //приращение скорости + + if ((fabs(d_omega) > fabs(p->motorInternals.omega)) && (fabs(p->motorInternals.torque) < p->load)) { + p->motorInternals.omega = 0; + d_omega = 0; + } + + p->motorInternals.omega = p->motorInternals.omega + d_omega; //скорость + + +} + +//кубическая интерполяция для кривых намагничивания SRD +float MotorModel_FluxCubicInterpolation (volatile float Isource, volatile TFluxCurvePoint SourceArray[], volatile int SourceResolution) +{ + volatile float PsiResult=0; + if (Isource <= SourceArray[0].i) //ток меньше или равен минимуму + { + PsiResult = SourceArray[0].psi; + return PsiResult; + } + if (Isource >= SourceArray[SourceResolution].i) //ток больше или равен максимуму + { + PsiResult = SourceArray[SourceResolution].psi; + return PsiResult; + } + for (int count = 1; count < SourceResolution+1; count++) //попали внутрь границ, ищем нужный отрезок + { + if (SourceArray[count].i >= Isource) //ток в следующей точке больше заданного, значит попали в нужный отрезок + { + volatile float a, b, c, d; //коэффициенты кубического полинома + volatile float f_d0, f_d1; //производные в левой и правой точке отрезка + volatile float x_m; //масштабированный икс: такой, чтобы левая точка отрезка оказалась в нуле, а правая - в единице + //Формула кубической интерполяции f(x)=a*x^3 + b*x^2 + c*x + d, производная: f(x)=3*a*x^2 + 2*b*x + c + //Чтобы найти коэффициенты кубического полинома, нужно найти значения полинома на границах отрезка справа и слева, + //а также производную полинома в этих точках. Для вычисления производных нужны значения исходной дискретной функции + //в 2 соседних точках (левее и правее границ отрезка). Считаем ток=0 - левая граница отрезка, ток=1 - правая граница + //a = 2*f(0) - 2*f(1) + f'(0) + f'(1) + //b = -3*f(0) + 3*f(1) - 2*f'(0) - f'(1) + //c = f'(0) + //d = f(0) + //Т.к. шаг по току неравномерный, а x[1]-x[0]!=1, производные ищются по формулам: + //f'(0) = (f[1] - f[-1]) / {(x[1]-x[-1]) / (x[1]-x[0])}, т.е., исходная кривая растягивается по оси x, чтобы выполнялось x[1]-x[0]=1 + //f'(1) = (f[2] - f[0]) / {(x[2]-x[0]) / (x[1]-x[0])} + //Упростим: f'(0) = (f[1] - f[-1]) *(x[1]-x[0]) / (x[1]-x[-1]), f'(1) = (f[2] - f[0]) *(x[1]-x[0]) / (x[2]-x[0]) + //Посчитав, коэффициенты, нужно выдать результат по формуле: + //f(x)= a*xm^3 + b*xm^2 + c*xm + d, + //где xm=(x-x[0])/(x[1]-x[0]), т.к. x[0] не равен 0, а x[1] не равен 1. Т.е., надо сдвинуть (вычитаем x[0]) и сжать обратно (делим на x[1]-x[0]) + //точка -1: count-2 + //точка 0: count-1 + //точка 1: count + //точка 2: count+1 + + //считаем производные в точках 0 и 1 (на краях отрезка) + if (count == 1) //крайний левый отрезок + { + //производную слева по-обычному посчитать нельзя, т.к. крайняя точка, посчитаем производную по самому отрезку + f_d0 = SourceArray[count].psi - SourceArray[count-1].psi; //на разность токов на краях отрезка не делим, т.к. приняли ее за единицу + } + else //считаем левую производную как обычно + { + f_d0 = (SourceArray[count].psi - SourceArray[count-2].psi)*(SourceArray[count].i - SourceArray[count-1].i)/(SourceArray[count].i - SourceArray[count-2].i); + } + if (count == SourceResolution) //крайний правый отрезок + { + //производную справа по-обычному посчитать нельзя, т.к. крайняя точка, посчитаем производную по самому отрезку + f_d1 = SourceArray[count].psi - SourceArray[count-1].psi; //на разность токов на краях отрезка не делим, т.к. приняли ее за единицу + } + else //считаем правую производную как обычно + { + f_d1 = (SourceArray[count+1].psi - SourceArray[count-1].psi)*(SourceArray[count].i - SourceArray[count-1].i)/(SourceArray[count+1].i - SourceArray[count-1].i); + } + + //считаем коэффициенты полинома + a = 2*SourceArray[count-1].psi - 2*SourceArray[count].psi + f_d0 + f_d1; + b = -3*SourceArray[count-1].psi + 3*SourceArray[count].psi - 2*f_d0 - f_d1; + c = f_d0; + d = SourceArray[count-1].psi; + + //считаем ток с учетом сдвинутости и растянутости кубической параболы относительно исходного графика по оси икс + x_m = (Isource - SourceArray[count-1].i)/(SourceArray[count].i - SourceArray[count-1].i); + + PsiResult = a*x_m*x_m*x_m + b*x_m*x_m + c*x_m + d; //считаем искомый поток + return PsiResult; + } + } + return PsiResult;//сюда не дойдем на самом деле, но чтобы компилятор не ругался +} + +//двухмерная интерполяция по поверхности для поиска тока в модели SRD +float MotorModel_PhaseCurrentInterpolation (TMotorModel *p, volatile float Theta, volatile float PsiS) +{ + volatile float Current = 0; + volatile float Current1, Current2; + volatile int cntThetaMinus, cntThetaPlus, cntPsiMinus, cntPsiPlus; + + //ограничиваем входные переменные + //по углу надо зациклить + if (Theta < 0) + Theta += p->motorInternals.ThetaMax; //прибавляем 2пи + if (Theta > p->motorInternals.ThetaMax) + Theta -= p->motorInternals.ThetaMax; //вычитаем 2пи + cntThetaMinus = Theta*p->motorInternals.ThetaStep_inv; //индекс массива по углу (меньший из двух) + cntThetaPlus = cntThetaMinus + 1; //больший из двух + if (cntThetaPlus > SRD_SURFACE_RESOLUTION) //если вышел за границу массива, зацикливаем + { + cntThetaPlus -= (SRD_SURFACE_RESOLUTION+1); + } + //по потоку надо просто ограничить сверху и снизу + if (PsiS < 0) + PsiS = 0; + if (PsiS > p->motorInternals.PsiMax) + PsiS = p->motorInternals.PsiMax; + cntPsiMinus = PsiS*p->motorInternals.PsiStep_inv; //индекс массива по потоку (меньший из двух) + cntPsiPlus = cntPsiMinus + 1; //больший из двух + + //первая интерполяция по углу + Current1 = I_PsiTheta[cntPsiMinus][cntThetaMinus] + (I_PsiTheta[cntPsiMinus][cntThetaPlus] - I_PsiTheta[cntPsiMinus][cntThetaMinus])*(Theta - (float)cntThetaMinus*p->motorInternals.ThetaStep)*p->motorInternals.ThetaStep_inv; + //если попали на верхнюю границу по потоку, надо интерполировать по сокращенным формулам, чтобы не выпасть за границы массива + if (cntPsiMinus >= SRD_SURFACE_RESOLUTION) //по потоку оказались на верхней границе + { + //интерполяция по потоку + Current = Current1; //интерполировать на границе по потоку не надо, момент будет равен моменту от первой интерполяции по углу + return Current; + } + //вторая интерполяция по углу + Current2 = I_PsiTheta[cntPsiPlus][cntThetaMinus] + (I_PsiTheta[cntPsiPlus][cntThetaPlus] - I_PsiTheta[cntPsiPlus][cntThetaMinus])*(Theta - (float)cntThetaMinus*p->motorInternals.ThetaStep)*p->motorInternals.ThetaStep_inv; + //интерполяция по потоку + Current = Current1 + (Current2 - Current1)*(PsiS - (float)cntPsiMinus*p->motorInternals.PsiStep)*p->motorInternals.PsiStep_inv; + return Current; +} + +//двухмерная интерполяция по поверхности для поиска момента в модели SRD +float MotorModel_PhaseTorqueInterpolation (TMotorModel *p, volatile float Theta, volatile float IPh) +{ + + volatile float Torque = 0; + volatile float Torque1, Torque2; + volatile int cntThetaMinus, cntThetaPlus, cntIMinus, cntIPlus; + + //ограничиваем входные переменные + //по углу надо зациклить + if (Theta < 0) + Theta += p->motorInternals.ThetaMax; //прибавляем 2пи + if (Theta > p->motorInternals.ThetaMax) + Theta -= p->motorInternals.ThetaMax; //вычитаем 2пи + cntThetaMinus = Theta*p->motorInternals.ThetaStep_inv; //индекс массива по углу (меньший из двух) + cntThetaPlus = cntThetaMinus + 1; //больший из двух + if (cntThetaPlus > SRD_SURFACE_RESOLUTION) //если вышел за границу массива, зацикливаем + { + cntThetaPlus -= (SRD_SURFACE_RESOLUTION+1); + } + //по току надо просто ограничить сверху и снизу + if (IPh < 0) + IPh = 0; + if (IPh > p->motorInternals.IMax) + IPh = p->motorInternals.IMax; + cntIMinus = IPh*p->motorInternals.IStep_inv; //индекс массива по току (меньший из двух) + cntIPlus = cntIMinus + 1; //больший из двух + + //первая интерполяция по углу + Torque1 = M_ITheta[cntIMinus][cntThetaMinus] + (M_ITheta[cntIMinus][cntThetaPlus] - M_ITheta[cntIMinus][cntThetaMinus])*(Theta - (float)cntThetaMinus*p->motorInternals.ThetaStep)*p->motorInternals.ThetaStep_inv; + //если попали на верхнюю границу по току, надо интерполировать по сокращенным формулам, чтобы не выпасть за границы массива + if (cntIMinus >= SRD_SURFACE_RESOLUTION) //по току оказались на верхней границе + { + //интерполяция по току + Torque = Torque1; //интерполировать на границе по току не надо, момент будет равен моменту от первой интерполяции по углу + return Torque; + } + //вторая интерполяция по углу + Torque2 = M_ITheta[cntIPlus][cntThetaMinus] + (M_ITheta[cntIPlus][cntThetaPlus] - M_ITheta[cntIPlus][cntThetaMinus])*(Theta - (float)cntThetaMinus*p->motorInternals.ThetaStep)*p->motorInternals.ThetaStep_inv; + //интерполяция по току + Torque = Torque1 + (Torque2 - Torque1)*(IPh - (float)cntIMinus*p->motorInternals.IStep)*p->motorInternals.IStep_inv; + return Torque; +} + +void Model_Execute_InductionMotor(TMotorModel *p) { + MotorModel_calcU43Phase(p); //расчет напряжений + + // Расчет синуса и косинуса угла ротора + p->motorInternals.cosTetaR = _IQtoF(_IQcos(_IQ(p->motorInternals.tetaR)));//синус и косинус считаются с фиксированной точкой, т.к. флоатовские занимают тысячи тактов (видимо, какая-то медленная реализация, не использующая аппаратную поддержку). + p->motorInternals.sinTetaR = _IQtoF(_IQsin(_IQ(p->motorInternals.tetaR)));//если удастся найти быстрый плавающий синус и косинус, то их можно считать во флоате + + // Расчет изменений потокосцеплений (предикторы) + p->motorInternals.dpsa = (p->motorInternals.usa - p->motorInternals.isa * p->motorInternals.rs); + p->motorInternals.dpsb = (p->motorInternals.usb - p->motorInternals.isb * p->motorInternals.rs); + p->motorInternals.dprd = -(p->motorInternals.ird * p->motorInternals.rr); + p->motorInternals.dprq = -(p->motorInternals.irq * p->motorInternals.rr); + + // Расчет предикторов потокосцеплений + p->motorInternals.ppsa = p->motorInternals.psa + p->motorInternals.dpsa * p->motorInternals.t; + p->motorInternals.ppsb = p->motorInternals.psb + p->motorInternals.dpsb * p->motorInternals.t; + p->motorInternals.pprd = p->motorInternals.prd + p->motorInternals.dprd * p->motorInternals.t; + p->motorInternals.pprq = p->motorInternals.prq + p->motorInternals.dprq * p->motorInternals.t; + + // Поворот потокосцеплений ротора в координаты alpha,beta + p->motorInternals.ppra = p->motorInternals.pprd * p->motorInternals.cosTetaR - p->motorInternals.pprq * p->motorInternals.sinTetaR; + p->motorInternals.pprb = +p->motorInternals.pprd * p->motorInternals.sinTetaR + p->motorInternals.pprq * p->motorInternals.cosTetaR; + + // Расчет токов для предикторного уравнения + p->motorInternals.isa = p->motorInternals.ks * p->motorInternals.ppsa + p->motorInternals.km * p->motorInternals.ppra; + p->motorInternals.isb = p->motorInternals.ks * p->motorInternals.ppsb + p->motorInternals.km * p->motorInternals.pprb; + p->motorInternals.ira = p->motorInternals.km * p->motorInternals.ppsa + p->motorInternals.kr * p->motorInternals.ppra; + p->motorInternals.irb = p->motorInternals.km * p->motorInternals.ppsb + p->motorInternals.kr * p->motorInternals.pprb; + + // Поворот роторных токов в d,q координаты + p->motorInternals.ird = p->motorInternals.ira * p->motorInternals.cosTetaR + p->motorInternals.irb * p->motorInternals.sinTetaR; + p->motorInternals.irq = -p->motorInternals.ira * p->motorInternals.sinTetaR + p->motorInternals.irb * p->motorInternals.cosTetaR; + + // Расчет изменений потокосцеплений по Рунге-Кутта второго порядка + p->motorInternals.psa = p->motorInternals.psa + p->motorInternals.t2 * (p->motorInternals.dpsa + (p->motorInternals.usa - p->motorInternals.isa * p->motorInternals.rs)); + p->motorInternals.psb = p->motorInternals.psb + p->motorInternals.t2 * (p->motorInternals.dpsb + (p->motorInternals.usb - p->motorInternals.isb * p->motorInternals.rs)); + p->motorInternals.prd = p->motorInternals.prd + p->motorInternals.t2 * (p->motorInternals.dprd + (-p->motorInternals.ird * p->motorInternals.rr)); + p->motorInternals.prq = p->motorInternals.prq + p->motorInternals.t2 * (p->motorInternals.dprq + (-p->motorInternals.irq * p->motorInternals.rr)); + + // Поворот потокосцеплений ротора в координаты alpha,beta + p->motorInternals.pra = p->motorInternals.prd * p->motorInternals.cosTetaR - p->motorInternals.prq * p->motorInternals.sinTetaR; + p->motorInternals.prb = p->motorInternals.prd * p->motorInternals.sinTetaR + p->motorInternals.prq * p->motorInternals.cosTetaR; + + //если инвертор выключен и все токи пересекли ноль (колеблются около нуля, расфорсировка прошла) + //то обнуляем все потоки в двигателе (читерство, иначе сложный расчет будет) + if ((p->InvertorEna == 0) && (p->motorInternals.CurrentInvertedFlag == 7)) { + p->motorInternals.psa = 0; + p->motorInternals.psb = 0; + p->motorInternals.prd = 0; + p->motorInternals.prq = 0; + p->motorInternals.pra = 0; + p->motorInternals.prb = 0; + } + + // Расчет токов после уточнения изменения потокосцеплений + p->motorInternals.isa = p->motorInternals.ks * p->motorInternals.psa + p->motorInternals.km * p->motorInternals.pra; + p->motorInternals.isb = p->motorInternals.ks * p->motorInternals.psb + p->motorInternals.km * p->motorInternals.prb; + p->motorInternals.ira = p->motorInternals.km * p->motorInternals.psa + p->motorInternals.kr * p->motorInternals.pra; + p->motorInternals.irb = p->motorInternals.km * p->motorInternals.psb + p->motorInternals.kr * p->motorInternals.prb; + + // Поворот роторных токов в d,q координаты + p->motorInternals.ird = p->motorInternals.ira * p->motorInternals.cosTetaR + p->motorInternals.irb * p->motorInternals.sinTetaR; + p->motorInternals.irq = -p->motorInternals.ira * p->motorInternals.sinTetaR + p->motorInternals.irb * p->motorInternals.cosTetaR; + + // Расчет момента + p->motorInternals.torque = 3.0 / 2.0 * p->motorInternals.pp * (p->motorInternals.psa * p->motorInternals.isb - p->motorInternals.psb * p->motorInternals.isa); + + // Расчет механики + MotorModel_MechModelExecute(p); + + //токи из двухфазной системы в трехфазную + p->motorInternals.isPhaseA = p->motorInternals.isa; + p->motorInternals.isPhaseB = -0.5 * p->motorInternals.isa + p->motorInternals.cos30 * p->motorInternals.isb; + p->motorInternals.isPhaseC = -p->motorInternals.isa - p->motorInternals.isPhaseB; + + //расчет измеряемых величин + p->motorInternals.adcSpeedtemp = p->motorInternals.omega * p->motorInternals.speedK + ADC_HALF_VALUE; //скорость (тахогенератор) + p->motorInternals.iAtemp = p->motorInternals.isa * p->motorInternals.iSenseK + ADC_HALF_VALUE; //ток фазы A + p->motorInternals.iBtemp = p->motorInternals.isPhaseB * p->motorInternals.iSenseK + ADC_HALF_VALUE; //ток фазы B + p->motorInternals.tetaRM = p->motorInternals.tetaRM + p->motorInternals.t * p->motorInternals.omega; //механическое положение ротора + if (p->motorInternals.tetaRM > 2 * MOTOR_MODEL_PI) //ограничиваем 0..2Пи + p->motorInternals.tetaRM -= 2 * MOTOR_MODEL_PI; + if (p->motorInternals.tetaRM < 0) + p->motorInternals.tetaRM += 2 * MOTOR_MODEL_PI; + p->motorInternals.tetaR=p->motorInternals.tetaRM*p->motorInternals.pp; +} + +void Model_Execute_SyncMotor(TMotorModel *p) { + MotorModel_calcU43Phase(p); //расчет напряжений + + // Расчет потокосцепления ротора + if (p->motorInternals.syncm_pm == 0) // Если с независимой ОВ + { + MotorModel_calcU4SyncMFieldWinding(p); //расчет напряжения ОВ + p->motorInternals.dif = (p->motorInternals.u_f - p->motorInternals.i_f * p->motorInternals.r_f)*p->motorInternals._1_l_f; + p->motorInternals.i_f = p->motorInternals.i_f + p->motorInternals.dif * p->motorInternals.t; + if (p->motorInternals.i_f <= p->motorInternals.RatedFluxCurrent) // Учет насыщения + p->motorInternals.m = p->motorInternals.i_f * p->motorInternals.l_m; + else + p->motorInternals.m = p->motorInternals.RatedFluxCurrent * p->motorInternals.l_m; // тут можно чуть изменить, введя небольшую надбавку. + } // Если с постоянными магнитами, то поток ротора присвоился еще в ините и не меняется + + // Расчет синуса и косинуса угла ротора + p->motorInternals.cosTetaR = _IQtoF(_IQcos(_IQ(p->motorInternals.tetaR)));//синус и косинус считаются с фиксированной точкой, т.к. флоатовские занимают тысячи тактов (видимо, какая-то медленная реализация, не использующая аппаратную поддержку). + p->motorInternals.sinTetaR = _IQtoF(_IQsin(_IQ(p->motorInternals.tetaR)));//если удастся найти быстрый плавающий синус и косинус, то их можно считать во флоате + + // Поворот напряжений из осей альфа.бета в оси d,q + p->motorInternals.usd = p->motorInternals.usa * p->motorInternals.cosTetaR + p->motorInternals.usb * p->motorInternals.sinTetaR; + p->motorInternals.usq = -p->motorInternals.usa * p->motorInternals.sinTetaR + p->motorInternals.usb * p->motorInternals.cosTetaR; + + // Расчет изменений потокосцеплений (предикторы) + p->motorInternals.dpsd = (p->motorInternals.usd - p->motorInternals.isd * p->motorInternals.rs + p->motorInternals.psq * p->motorInternals.omega); + p->motorInternals.dpsq = (p->motorInternals.usq - p->motorInternals.isq * p->motorInternals.rs - p->motorInternals.psd * p->motorInternals.omega); + + // Расчет предикторов потокосцеплений + p->motorInternals.ppsd = p->motorInternals.psd + p->motorInternals.dpsd * p->motorInternals.t; + p->motorInternals.ppsq = p->motorInternals.psq + p->motorInternals.dpsq * p->motorInternals.t; + + // Расчет токов для предикторного уравнения + p->motorInternals.isd = (p->motorInternals.ppsd - p->motorInternals.m) * p->motorInternals._1_lsd; + p->motorInternals.isq = p->motorInternals.ppsq * p->motorInternals._1_lsq; + + // Расчет изменений потокосцеплений по Рунге-Кутта второго порядка + p->motorInternals.psd = p->motorInternals.psd + p->motorInternals.t2 * (p->motorInternals.dpsd + (p->motorInternals.usd - p->motorInternals.isd * p->motorInternals.rs + p->motorInternals.psq * p->motorInternals.omega)); + p->motorInternals.psq = p->motorInternals.psq + p->motorInternals.t2 * (p->motorInternals.dpsq + (p->motorInternals.usq - p->motorInternals.isq * p->motorInternals.rs - p->motorInternals.psd * p->motorInternals.omega)); + + //если инвертор выключен и все токи пересекли ноль (колеблются около нуля, расфорсировка прошла) + //то выключаем расчет токов статора, чтобы не дергались (читерство, иначе сложный расчет будет) + if ((p->InvertorEna == 0) && (p->motorInternals.CurrentInvertedFlag == 7)) { + p->motorInternals.psd = p->motorInternals.m; + p->motorInternals.psq = 0; + } + + // Расчет токов после уточнения изменения потокосцеплений + p->motorInternals.isd = (p->motorInternals.psd - p->motorInternals.m) * p->motorInternals._1_lsd; + p->motorInternals.isq = p->motorInternals.psq * p->motorInternals._1_lsq; + + //поворот токов в оси альфа,бета (для вывода на АЦП) + p->motorInternals.isa = p->motorInternals.isd * p->motorInternals.cosTetaR - p->motorInternals.isq * p->motorInternals.sinTetaR; + p->motorInternals.isb = +p->motorInternals.isd * p->motorInternals.sinTetaR + p->motorInternals.isq * p->motorInternals.cosTetaR; + + // Расчет момента + p->motorInternals.torque = 3.0 / 2.0 * p->motorInternals.pp * (p->motorInternals.psd * p->motorInternals.isq - p->motorInternals.psq * p->motorInternals.isd); + + // Расчет механики + MotorModel_MechModelExecute(p); + + //токи из двухфазной системы в трехфазную + p->motorInternals.isPhaseA = p->motorInternals.isa; + p->motorInternals.isPhaseB = -0.5 * p->motorInternals.isa + p->motorInternals.cos30 * p->motorInternals.isb; + p->motorInternals.isPhaseC = -p->motorInternals.isa - p->motorInternals.isPhaseB; + + p->motorInternals.isPhaseD = p->motorInternals.i_f; + + //расчет измеряемых величин + p->adc_code_Speed = p->motorInternals.omega * p->motorInternals.speedK + ADC_HALF_VALUE; //скорость (тахогенератор) + p->motorInternals.iAtemp = p->motorInternals.isa * p->motorInternals.iSenseK + ADC_HALF_VALUE; //ток фазы A + p->motorInternals.iBtemp = p->motorInternals.isPhaseB * p->motorInternals.iSenseK + ADC_HALF_VALUE; //ток фазы B + p->motorInternals.iDtemp = p->motorInternals.i_f * p->motorInternals.ifSenseK + ADC_HALF_VALUE; //ток ОВ + p->motorInternals.tetaRM = p->motorInternals.tetaRM + p->motorInternals.t * p->motorInternals.omega; //механическое положение ротора + if (p->motorInternals.tetaRM > 2 * MOTOR_MODEL_PI) //ограничиваем 0..2Пи + p->motorInternals.tetaRM -= 2 * MOTOR_MODEL_PI; + if (p->motorInternals.tetaRM < 0) + p->motorInternals.tetaRM += 2 * MOTOR_MODEL_PI; + + p->motorInternals.tetaR=p->motorInternals.tetaRM*p->motorInternals.pp; +} + +void Model_Execute_DCMotor(TMotorModel *p) { + // Преобразование напряжений + MotorModel_calcU42Phase(p); + + // !!! Внимание! При соотношении параметров ОВ с малой индуктивность и большим сопротивлением расчет ОВ может выполняться некорректно + // !!! Критическое соотношение параметров Lf=6.3 мГн и Rf=125 Ом + + // предварительный расчет приращений по току + if (p->motorInternals.dcm_pm == 0) // Если с независимой ОВ + { + p->motorInternals.dif = (p->motorInternals.u_f - p->motorInternals.i_f * p->motorInternals.r_f)*p->motorInternals._1_l_f; + p->motorInternals.i_f = p->motorInternals.i_f + p->motorInternals.dif * p->motorInternals.t; + if (p->motorInternals.i_f <= p->motorInternals.RatedFluxCurrent) // Учет насыщения + p->motorInternals.kf = p->motorInternals.i_f * p->motorInternals.l_m; + else + p->motorInternals.kf = p->motorInternals.RatedFluxCurrent * p->motorInternals.l_m; // тут можно чуть изменить, введя небольшую надбавку. + } + else // Если с постоянными магнитами + p->motorInternals.kf = p->motorInternals.l_m * 1.0; + + p->motorInternals.dia = (p->motorInternals.u_a - p->motorInternals.kf*p->motorInternals.omega - p->motorInternals.i_a*(p->motorInternals.r_a + p->motorInternals.r_ad))*p->motorInternals._1_l_a; + p->motorInternals.i_a = p->motorInternals.i_a + p->motorInternals.dia * p->motorInternals.t; + + //если инвертор выключен и все токи пересекли ноль (колеблются около нуля, расфорсировка прошла) + //то выключаем расчет токов статора, чтобы не дергались (читерство, иначе сложный расчет будет) + if ((p->InvertorEna == 0) && (p->motorInternals.CurrentInvertedFlag == 7)) { + p->motorInternals.i_a=0; + } + + // Момент + p->motorInternals.torque = p->motorInternals.kf * p->motorInternals.i_a; + + // вычисление механических величин + MotorModel_MechModelExecute(p); + + //omega+=0.5; + p->motorInternals.tetaRM = p->motorInternals.tetaRM + p->motorInternals.t * p->motorInternals.omega; //положение + if (p->motorInternals.tetaRM > 2 * MOTOR_MODEL_PI) //ограничение 0..2Пи + p->motorInternals.tetaRM -= 2 * MOTOR_MODEL_PI; + if (p->motorInternals.tetaRM < 0) + p->motorInternals.tetaRM += 2 * MOTOR_MODEL_PI; + + p->motorInternals.isPhaseA = p->motorInternals.i_a; + p->motorInternals.isPhaseB = p->motorInternals.isPhaseA; + p->motorInternals.isPhaseC = p->motorInternals.i_f; + + //расчет измеряемых величин + p->motorInternals.adcSpeedtemp = p->motorInternals.omega * p->motorInternals.speedK + ADC_HALF_VALUE; //скорость (тахогенератор) + p->motorInternals.iAtemp = p->motorInternals.i_a * p->motorInternals.iSenseK + ADC_HALF_VALUE; //ток якоря + p->motorInternals.iCtemp = p->motorInternals.i_f * p->motorInternals.ifSenseK + ADC_HALF_VALUE; //ток ОВ +} + + +void Model_Execute_SRDMotor(TMotorModel *p) { + p->motorInternals.ua=p->motorInternals.udc*(p->motorInternals.cmpr0*p->motorInternals.inv_tpr*2-1); //фазное напряжение + p->motorInternals.psa+=(p->motorInternals.ua - p->motorInternals.isPhaseA*p->motorInternals.rs)*p->motorInternals.t; //интегрируем потокосцепление + if (p->motorInternals.psa<0) + p->motorInternals.psa=0; + p->motorInternals.isPhaseA=MotorModel_PhaseCurrentInterpolation(p,p->motorInternals.tetaR, p->motorInternals.psa); //ищем ток фазы + p->motorInternals.torque_a = MotorModel_PhaseTorqueInterpolation(p,p->motorInternals.tetaR, p->motorInternals.isPhaseA); //ищем момент фазы + //DebugW2 = _IQ(p->motorInternals.torque_a); + + p->motorInternals.ub=p->motorInternals.udc*(p->motorInternals.cmpr1*p->motorInternals.inv_tpr*2-1); //фазное напряжение + p->motorInternals.psb+=(p->motorInternals.ub - p->motorInternals.isPhaseB*p->motorInternals.rs)*p->motorInternals.t; //интегрируем потокосцепление + if (p->motorInternals.psb<0) + p->motorInternals.psb=0; + float TetaB = p->motorInternals.tetaR+MOTOR_MODEL_PI*1.33333; //фазовый сдвиг + if (TetaB > 2*MOTOR_MODEL_PI) + TetaB -= 2*MOTOR_MODEL_PI; + p->motorInternals.isPhaseB=MotorModel_PhaseCurrentInterpolation(p,TetaB, p->motorInternals.psb); //ищем ток фазы + p->motorInternals.torque_b = MotorModel_PhaseTorqueInterpolation(p,TetaB, p->motorInternals.isPhaseB); //ищем момент фазы + //DebugW3 = _IQ(p->motorInternals.torque_b); + + p->motorInternals.uc=p->motorInternals.udc*(p->motorInternals.cmpr2*p->motorInternals.inv_tpr*2-1); //фазное напряжение + p->motorInternals.psc+=(p->motorInternals.uc - p->motorInternals.isPhaseC*p->motorInternals.rs)*p->motorInternals.t; //интегрируем потокосцепление + if (p->motorInternals.psc<0) + p->motorInternals.psc=0; + float TetaC = p->motorInternals.tetaR+MOTOR_MODEL_PI*0.66667; //фазовый сдвиг + if (TetaC > 2*MOTOR_MODEL_PI) + TetaC -= 2*MOTOR_MODEL_PI; + p->motorInternals.isPhaseC=MotorModel_PhaseCurrentInterpolation(p,TetaC, p->motorInternals.psc); //ищем ток фазы + p->motorInternals.torque_c = MotorModel_PhaseTorqueInterpolation(p,TetaC, p->motorInternals.isPhaseC); //ищем момент фазы + //DebugW4 = _IQ(p->motorInternals.torque_c); + + //Суммарный момент всех фаз (фазы - независимые) + p->motorInternals.torque = p->motorInternals.torque_a + p->motorInternals.torque_b + p->motorInternals.torque_c; + + // Расчет механики + MotorModel_MechModelExecute(p); + + p->motorInternals.tetaRM+=p->motorInternals.t*p->motorInternals.omega; + //p->motorInternals.tetaRM = 0.393; //угол с максимальным моментом для фазы A, для теста + if (p->motorInternals.tetaRM>2*MOTOR_MODEL_PI) + p->motorInternals.tetaRM-=2*MOTOR_MODEL_PI; + if (p->motorInternals.tetaRM<0) + p->motorInternals.tetaRM+=2*MOTOR_MODEL_PI; + + p->motorInternals.tetaR=p->motorInternals.tetaRM*p->motorInternals.pp; + while (p->motorInternals.tetaR>2*MOTOR_MODEL_PI) + p->motorInternals.tetaR-=2*MOTOR_MODEL_PI; + + p->adc_code_Speed=p->motorInternals.omega*p->motorInternals.speedK+ADC_HALF_VALUE; + p->motorInternals.iAtemp=p->motorInternals.isPhaseA*p->motorInternals.iSenseK; + p->motorInternals.iBtemp=p->motorInternals.isPhaseB*p->motorInternals.iSenseK; + p->motorInternals.iCtemp=p->motorInternals.isPhaseC*p->motorInternals.iSenseK; + + +} + +//основная функция расчета модели, вызывается в рперывании 10 кГц +void MotorModel_Execute(TMotorModel *p) { + + p->motorInternals.cmpr0 = p->motorInternals.tpr-p->cmpr0; //уставки сравнения ШИМ. С инверсией, потому что так настроен модуль ШИМ + p->motorInternals.cmpr1 = p->motorInternals.tpr-p->cmpr1; + p->motorInternals.cmpr2 = p->motorInternals.tpr-p->cmpr2; + p->motorInternals.cmpr3 = p->motorInternals.tpr-p->cmpr3; + + if (p->fault == 0) //если нет ошибки модели, считаем + { + if (p->motorInternals.type == MODEL_INDUCTION_MOTOR) { + Model_Execute_InductionMotor(p); + + } else if (p->motorInternals.type == MODEL_SYNC_MOTOR) { + Model_Execute_SyncMotor(p); + + } else if (p->motorInternals.type == MODEL_DC_MOTOR) { + Model_Execute_DCMotor(p); + + } + else if (p->motorInternals.type==MODEL_SRD_MOTOR){ + Model_Execute_SRDMotor(p); + } + } else {//модель в аварии + p->motorInternals.iAtemp=ADC_HALF_VALUE; + p->motorInternals.iBtemp=ADC_HALF_VALUE; + p->motorInternals.iCtemp=ADC_HALF_VALUE; + p->motorInternals.iDtemp=ADC_HALF_VALUE; + + } + + //Имитация сигнала с датчика Холла (3 элемента) в зависимости от текущего электрического положения + //рассчитываем номер электрического сектора, где сейчас ротор из электрического угла + Uint16 TempSector=p->motorInternals.tetaR * (1/(2 * MOTOR_MODEL_PI)*6); + TempSector=TempSector%6;//угол не ограничен, поэтому используем остаток от делеления на кол-во секторов + + switch (TempSector){//в зависимости от номера сектора формируем побитовый код на элементах Холла + case 0:{ + p->motorInternals.hallSensor=5;//101 + break; + } + case 1:{ + p->motorInternals.hallSensor=4;//100 + break; + } + case 2:{ + p->motorInternals.hallSensor=6;//110 + break; + } + case 3:{ + p->motorInternals.hallSensor=2;//010 + break; + } + case 4:{ + p->motorInternals.hallSensor=3;//011 + break; + } + case 5:{ + p->motorInternals.hallSensor=1;//001 + break; + } + + } + + if (p->motorInternals.hallSensor!=p->motorInternals.hallSensorPrev){//Пришла новая метка ДПР Холла + p->hallSensorOmega=p->motorInternals.hallSensorOmegaPrev;//На выход модели - скорость, которая была между предыдущими метками ДПР Холла + p->motorInternals.hallSensorOmegaPrev=p->motorInternals.omega;//Запоминаем текущую скорость, чтобы отдать её потом + p->hallSensorInterpAdd=0; + p->motorInternals.hallSensorPrev=p->motorInternals.hallSensor; + p->hallSensor=p->motorInternals.hallSensor; + } + + if (fabs(p->motorInternals.omega)<1){//если двигатель почти стоит + p->hallSensorOmega=0; + p->motorInternals.hallSensorOmegaPrev=0; + p->hallSensorInterpAdd=0; + } + if (p->hallSensorInterpAdd < (MOTOR_MODEL_PI/3)) //ограничиваем шестой частью угла + p->hallSensorInterpAdd = p->hallSensorInterpAdd + p->motorInternals.t * p->hallSensorOmega *p->motorInternals.pp; //механическое положение ротора + + p->motorInternals.power=p->motorInternals.omega*p->motorInternals.torque*0.001;//Мощность на валу в кВт + p->qepCounter=p->motorInternals.tetaRM*MODEL_INV_2PI*p->motorInternals.QEPResolution*4;//Имитация счетчика инкрементального энкодера из текущего угла двигателя + p->motorInternals.omega_rpm = p->motorInternals.omega*MODEL_INV_2PI*60;//Частота вращения вала из рад/с в об/мин + p->motorInternals.Udc_temp=p->motorInternals.udc*p->motorInternals.udSenseK;//Имитация измерения напряжения ЗПТ + + + //наложение шума АЦП + p->motorInternals.iAtemp += MotorModel_fastrand(); + p->motorInternals.iBtemp += MotorModel_fastrand(); + p->motorInternals.iCtemp += MotorModel_fastrand(); + p->motorInternals.iDtemp += MotorModel_fastrand(); + p->motorInternals.adcSpeedtemp += MotorModel_fastrand(); + p->motorInternals.Udc_temp += MotorModel_fastrand(); + + //насыщение каналов АЦП + if (p->motorInternals.iAtemp > ADC_MAX_VALUE) + p->motorInternals.iAtemp = ADC_MAX_VALUE; + if (p->motorInternals.iAtemp < 0) + p->motorInternals.iAtemp = 0; + if (p->motorInternals.iBtemp > ADC_MAX_VALUE) + p->motorInternals.iBtemp = ADC_MAX_VALUE; + if (p->motorInternals.iBtemp < 0) + p->motorInternals.iBtemp = 0; + if (p->motorInternals.iCtemp > ADC_MAX_VALUE) + p->motorInternals.iCtemp = ADC_MAX_VALUE; + if (p->motorInternals.iCtemp < 0) + p->motorInternals.iCtemp = 0; + if (p->motorInternals.iDtemp > ADC_MAX_VALUE) + p->motorInternals.iDtemp = ADC_MAX_VALUE; + if (p->motorInternals.iDtemp < 0) + p->motorInternals.iDtemp = 0; + if (p->motorInternals.adcSpeedtemp > ADC_MAX_VALUE) + p->motorInternals.adcSpeedtemp = ADC_MAX_VALUE; + if (p->motorInternals.adcSpeedtemp < 0) + p->motorInternals.adcSpeedtemp = 0; + if (p->motorInternals.Udc_temp > ADC_MAX_VALUE) + p->motorInternals.Udc_temp = ADC_MAX_VALUE; + if (p->motorInternals.Udc_temp < 0) + p->motorInternals.Udc_temp = 0; + + p->adc_code_iA = p->motorInternals.iAtemp; + p->adc_code_iB = p->motorInternals.iBtemp; + p->adc_code_iC = p->motorInternals.iCtemp; + p->adc_code_iD = p->motorInternals.iDtemp; + p->adc_code_Speed = p->motorInternals.adcSpeedtemp; + p->adc_code_Udc = p->motorInternals.Udc_temp; + +} + + +/*@}*/ diff --git a/Vsrc/V_PWM_Module.c b/Vsrc/V_PWM_Module.c new file mode 100644 index 0000000..1777f54 --- /dev/null +++ b/Vsrc/V_PWM_Module.c @@ -0,0 +1,815 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_PWM_Module.c + \brief Модуль реализации векторной ШИМ (см. TPWM_Module) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup V_PWM_Module + @{*/ + + +#include "V_IQmath.h" +#include "V_PWM_Module.h" +#include "main.h" + + +#ifdef HW_VECTORCARD_DRV8301_EVM +#define GPIO_INV_ON NT_GPIOG->MASKHIGHBYTE_bit[(1<<(8-8))].MASKHB = (1<<(8-8)) +//Для данной конфигурации выключение инвертора аппаратное не используется, выключение ключей осуществляется выводами упралвения ключами +#define GPIO_INV_OFF NT_GPIOG->MASKHIGHBYTE_bit[(1<<(8-8))].MASKHB = (1<<(8-8)) +#endif + +#ifdef HW_VECTORCARD_DRV8312_EVM +//A[10], F[2], F[4] +#define GPIO_INV_ON NT_GPIOA->MASKHIGHBYTE_bit[(1<<(10-8))].MASKHB = (1<<(10-8)); NT_GPIOF->MASKLOWBYTE_bit[(1<<2)].MASKLB = (1<<2);NT_GPIOF->MASKLOWBYTE_bit[(1<<4)].MASKLB = (1<<4) +#define GPIO_INV_OFF NT_GPIOA->MASKHIGHBYTE_bit[(1<<(10-8))].MASKHB = 0;NT_GPIOF->MASKLOWBYTE_bit[(1<<2)].MASKLB = 0;NT_GPIOF->MASKLOWBYTE_bit[(1<<4)].MASKLB = 0 +#endif + +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) +#define GPIO_INV_ON +#define GPIO_INV_OFF +#endif + +#if defined(HW_VECTOR_MK_40_4) +#define GPIO_INV_ON +#define GPIO_INV_OFF +#endif + +#if defined(HW_MOTORCONTROLBOARD) +#define GPIO_INV_ON +#define GPIO_INV_OFF +#endif + + +//! Инициализация + +//! \memberof TPWM_Module +void PWM_Module_Init(TPWM_Module *p) { + SIU->PWMSYNC_bit.PRESCRST = 0; //синхронизация таймеров - сброс внутренних счетчиков + +// ------------------------------------------------------------------------ + // Настраиваем модуль ePWM1 + // ------------------------------------------------------------------------ + if (p->Frequency < PWM_FREQ_MIN) + p->Frequency = PWM_FREQ_MIN; + if (p->Frequency > PWM_FREQ_MAX) + p->Frequency = PWM_FREQ_MAX; + PWM0->TBPRD = _IQ10div(_IQ10(APB0BusClock/1000.0), p->Frequency << 1) >> 10; //период + + p->k_pwm = PWM0->TBPRD; + p->FreqPrev = p->Frequency; //предыдущая частота + PWM0->TBPHS_bit.TBPHS = 0x0000; // Phase is 0 + PWM0->TBCTR = 0x0000; // Clear counter + + // Setup counter mode + PWM0->TBCTL_bit.PRDLD = TB_SHADOW; // загрузка TBPRD при TBCTR = 0 + PWM0->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down + PWM0->TBCTL_bit.PHSEN = TB_DISABLE; // Disable phase loading + PWM0->TBCTL_bit.PHSDIR = TB_UP; // Считать вверх после загрузки фазы + PWM0->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale + PWM0->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale + PWM0->TBCTL_bit.SYNCOSEL = TB_CTR_ZERO; // выдаём синхро-сигнал при TBCTR = 0 + + // Setup shadowing + PWM0->CMPCTL_bit.SHDWAMODE = CC_SHADOW; //включить SHADOW для сравнения + PWM0->CMPCTL_bit.LOADAMODE = CC_CTR_ZERO; // Load on zero + + PWM0->CMPCTL_bit.SHDWBMODE = CC_SHADOW; //включить SHADOW для сравнения + PWM0->CMPCTL_bit.LOADBMODE = CC_CTR_ZERO; // Load on zero + + // Set Compare values + PWM0->CMPA_bit.CMPA = 0; // Set compare A value + + // Set actions + PWM0->AQCTLA = AQ_EPWM_DISABLE; // для начала события для PWM1A запрещены + PWM0->AQCTLA_bit.ZRO = 1; //обнуляем при нуле счетчика + PWM0->AQCTLA_bit.CAU = 2; //включаем при сравнении и инкрементиовании + PWM0->AQCTLA_bit.CAD = 1; //обнуляем при сравнении и декрементровании + + //Для PWMB тоже самое, что для PWMА. Без инверсии. Инверсия далее в модуле МВ + PWM0->AQCTLB = PWM0->AQCTLA; // для начала события для PWM1B запрещены + PWM0->AQCTLB_bit.ZRO = PWM0->AQCTLA_bit.ZRO; //обнуляем при нуле счетчика + PWM0->AQCTLB_bit.CAU = PWM0->AQCTLA_bit.CAU; //включаем при сравнении и инкрементиовании + PWM0->AQCTLB_bit.CAD = PWM0->AQCTLA_bit.CAD; //обнуляем при сравнении и декрементровании + + PWM0->AQSFRC_bit.RLDCSF = 0; //по ТО надо писать 0 + + // Setup Deadband + // DBRED = DBFED = 150 * Tм_мкс / 4 + PWM0->DBRED = _IQ4mpy(_IQ4(150 / 4), p->DeadBand >> 20) >> 4; + PWM0->DBFED = PWM0->DBRED; + PWM0->DBCTL_bit.INMODE = DBA_RED_DBB_FED; //s4=0, s5=1 на картинке DT + PWM0->DBCTL_bit.OUTMODE = DB_FULL_ENABLE; //S1=1, S2=2 на картинке DT + PWM0->DBCTL_bit.POLSEL = DB_ACTV_HIC; // PWM1B = !PWM1A; S2=0, S3=1 + + PWM0->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT (шимовское) + PWM0->ETSEL_bit.INTEN = 0; // Disable INT + + + //разрешаем TZ быть источником аппаратной аварии (one-shot) + // PWM0->TZSEL_bit.OSHT1 = TZ_ENABLE; +// PWM0->TZSEL_bit.OSHT2 = TZ_ENABLE; +// PWM0->TZSEL_bit.OSHT3 = TZ_ENABLE; + + // Trip-Zone + PWM0->TZCTL_bit.TZA = TZ_STATE; // по событию "One-Shot Trip" переводим + PWM0->TZCTL_bit.TZB = TZ_STATE; // ШИМ выходы в нужное состояние + + //Для VectorCARD от ШИМа запускается ADC + //PWM0->ETSEL_bit.SOCAEN = 1; // Разрешить запуск ацп + //PWM0->ETSEL_bit.SOCASEL = 1; // Запускать при CTR == 0 (Underflow) + + // ------------------------------------------------------------------------ + // Настраиваем модуль ePWM2 + // ------------------------------------------------------------------------ + // Setup TBCLK + PWM1->TBPRD = PWM0->TBPRD; //период такой же + PWM1->TBPHS_bit.TBPHS = 0x0001; // Фаза равна 1 из-за задержки в один такт на синхронизацию + PWM1->TBCTR = 0x0000; // Clear counter + + // Setup counter mode + PWM1->TBCTL_bit.PRDLD = TB_SHADOW; // загрузка TBPRD при TBCTR = 0 + PWM1->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down + PWM1->TBCTL_bit.PHSEN = TB_ENABLE; // Enable phase loading + PWM1->TBCTL_bit.PHSDIR = TB_UP; // Считать вверх после загрузки фазы + PWM1->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale + PWM1->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale + PWM1->TBCTL_bit.SYNCOSEL = TB_SYNC_IN; // пропускаем синхро-сигнал "насквозь" + + // Setup shadowing + PWM1->CMPCTL_bit.SHDWAMODE = CC_SHADOW; //включить SHADOW для сравнения + PWM1->CMPCTL_bit.LOADAMODE = CC_CTR_ZERO; // Load on zero + + PWM1->CMPCTL_bit.SHDWBMODE = CC_SHADOW; //включить SHADOW для сравнения + PWM1->CMPCTL_bit.LOADBMODE = CC_CTR_ZERO; // Load on zero + + // Set Compare values + PWM1->CMPA_bit.CMPA = 0; // Set compare A value + + // Set actions + PWM1->AQCTLA = AQ_EPWM_DISABLE; // для начала события запрещены + PWM1->AQCTLA_bit.ZRO = 1; //обнуляем при нуле счетчика + PWM1->AQCTLA_bit.CAU = 2; //включаем при сравнении и инкрементиовании + PWM1->AQCTLA_bit.CAD = 1; //обнуляем при сравнении и декрементровании + + //Для PWMB тоже самое, что для PWMА. Без инверсии. Инверсия далее в модуле МВ + PWM1->AQCTLB = PWM0->AQCTLA; // для начала события для PWM1B запрещены + PWM1->AQCTLB_bit.ZRO = PWM0->AQCTLA_bit.ZRO; //обнуляем при нуле счетчика + PWM1->AQCTLB_bit.CAU = PWM0->AQCTLA_bit.CAU; //включаем при сравнении и инкрементиовании + PWM1->AQCTLB_bit.CAD = PWM0->AQCTLA_bit.CAD; //обнуляем при сравнении и декрементровании + + PWM1->AQSFRC_bit.RLDCSF = 0; //по ТО надо писать 0 + + // Active high complementary PWMs - Setup Deadband + PWM1->DBRED = PWM0->DBRED; + PWM1->DBFED = PWM1->DBRED; + PWM1->DBCTL_bit.INMODE = PWM0->DBCTL_bit.INMODE; + PWM1->DBCTL_bit.OUTMODE = PWM0->DBCTL_bit.OUTMODE; + PWM1->DBCTL_bit.POLSEL = PWM0->DBCTL_bit.POLSEL; + + // Interrupt where we will change the Compare Values + PWM1->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT + PWM1->ETSEL_bit.INTEN = 0; // Disable INT + + //разрешаем TZ быть источником аппаратной аварии (one-shot) + // PWM1->TZSEL_bit.OSHT1 = TZ_ENABLE; + // PWM1->TZSEL_bit.OSHT2 = TZ_ENABLE; + // PWM1->TZSEL_bit.OSHT3 = TZ_ENABLE; + + // Trip-Zone + PWM1->TZCTL_bit.TZA = TZ_STATE; // по событию "One-Shot Trip" переводим + PWM1->TZCTL_bit.TZB = TZ_STATE; // ШИМ выходы в нужное состояние + + // ------------------------------------------------------------------------ + // Настраиваем модуль ePWM3 + // ------------------------------------------------------------------------ + // Setup TBCLK + PWM2->TBPRD = PWM0->TBPRD; + PWM2->TBPHS_bit.TBPHS = 0x0001; // Фаза равна 1 из-за задержки в один такт на синхронизацию + PWM2->TBCTR = 0x0000; // Clear counter + + // Setup counter mode + PWM2->TBCTL_bit.PRDLD = TB_SHADOW; // загрузка TBPRD при TBCTR = 0 + PWM2->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down + PWM2->TBCTL_bit.PHSEN = TB_ENABLE; // Enable phase loading + PWM2->TBCTL_bit.PHSDIR = TB_UP; // Считать вверх после загрузки фазы + PWM2->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale + PWM2->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale + PWM2->TBCTL_bit.SYNCOSEL = TB_SYNC_IN; // разрешаем выдачу синхро-сигнала + + // Setup shadowing + PWM2->CMPCTL_bit.SHDWAMODE = CC_SHADOW; //включить SHADOW для сравнения + PWM2->CMPCTL_bit.LOADAMODE = CC_CTR_ZERO; // Load on zero + + PWM2->CMPCTL_bit.SHDWBMODE = CC_SHADOW; //включить SHADOW для сравнения + PWM2->CMPCTL_bit.LOADBMODE = CC_CTR_ZERO; // Load on zero + + // Set Compare values + PWM2->CMPA_bit.CMPA = 0; // Set compare A value + + // Set actions + PWM2->AQCTLA = AQ_EPWM_DISABLE; // для начала события запрещены + PWM2->AQCTLA_bit.ZRO = 1; //обнуляем при нуле счетчика + PWM2->AQCTLA_bit.CAU = 2; //включаем при сравнении и инкрементиовании + PWM2->AQCTLA_bit.CAD = 1; //обнуляем при сравнении и декрементровании + + //Для PWMB тоже самое, что для PWMА. Без инверсии. Инверсия далее в модуле МВ + PWM2->AQCTLB = PWM0->AQCTLA; // для начала события для PWM1B запрещены + PWM2->AQCTLB_bit.ZRO = PWM0->AQCTLA_bit.ZRO; //обнуляем при нуле счетчика + PWM2->AQCTLB_bit.CAU = PWM0->AQCTLA_bit.CAU; //включаем при сравнении и инкрементиовании + PWM2->AQCTLB_bit.CAD = PWM0->AQCTLA_bit.CAD; //обнуляем при сравнении и декрементровании + + PWM2->AQSFRC_bit.RLDCSF = 0; //по ТО надо писать 0 + + // Active high complementary PWMs - Setup Deadband + PWM2->DBRED = PWM0->DBRED; + PWM2->DBFED = PWM2->DBRED; + PWM2->DBCTL_bit.INMODE = PWM0->DBCTL_bit.INMODE; + PWM2->DBCTL_bit.OUTMODE = PWM0->DBCTL_bit.OUTMODE; + PWM2->DBCTL_bit.POLSEL = PWM0->DBCTL_bit.POLSEL; + + // Interrupt where we will change the Compare Values + PWM2->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT + PWM2->ETSEL_bit.INTEN = 0; // Disable INT + + //разрешаем TZ быть источником аппаратной аварии (one-shot) + // PWM2->TZSEL_bit.OSHT1 = TZ_ENABLE; + // PWM2->TZSEL_bit.OSHT2 = TZ_ENABLE; + // PWM2->TZSEL_bit.OSHT3 = TZ_ENABLE; + + + // Trip-Zone + PWM2->TZCTL_bit.TZA = TZ_STATE; // по событию "One-Shot Trip" переводим + PWM2->TZCTL_bit.TZB = TZ_STATE; // ШИМ выходы в нужное состояние + + // ------------------------------------------------------------------------ + // Настраиваем модуль ePWM3 под АЦП + // ------------------------------------------------------------------------ + // Setup TBCLK + PWM3->TBPRD = PWM0->TBPRD; + PWM3->TBPHS_bit.TBPHS = 0x0001; // Фаза равна 1 из-за задержки в один такт на синхронизацию + PWM3->TBCTR = 0x0000; // Clear counter + + // Setup counter mode + PWM3->TBCTL_bit.PRDLD = TB_SHADOW; // загрузка TBPRD при TBCTR = 0 + PWM3->TBCTL_bit.CTRMODE = TB_COUNT_UPDOWN; // Count up-down + PWM3->TBCTL_bit.PHSEN = TB_ENABLE; // Enable phase loading + PWM3->TBCTL_bit.PHSDIR = TB_UP; // Считать вверх после загрузки фазы + PWM3->TBCTL_bit.HSPCLKDIV = 0; // High Speed Time-base Clock Prescale + PWM3->TBCTL_bit.CLKDIV = 0; // Time-base Clock Prescale + PWM3->TBCTL_bit.SYNCOSEL = TB_SYNC_IN; // разрешаем выдачу синхро-сигнала + + // Interrupt where we will change the Compare Values + PWM3->ETSEL_bit.INTSEL = ET_DISABLE; // Disable INT + PWM3->ETSEL_bit.INTEN = 0; // Disable INT + + + PWM3->ETSEL_bit.SOCAEN = 1; // Разрешить запуск ацп + PWM3->ETSEL_bit.SOCASEL = 1; // Запускать при CTR == 0 (Underflow) + + //сбрасываем все флаги аварий + PWM0->TZCLR = 0x7; + PWM1->TZCLR = 0x7; + PWM2->TZCLR = 0x7; + + //настройка ножек +#ifdef HW_VECTORCARD_DRV8301_EVM + //ШИМ 6 выводов + NT_GPIOG->ALTFUNCSET = (1 << 2) + (1 << 3) + (1 << 4); //ePWMxA(0), (1), (2) + NT_GPIOA->ALTFUNCSET = (1 << 10); //ePWMxB(0) + NT_GPIOF->ALTFUNCSET = (1 << 2) + (1 << 4); //ePWMxB(1), (2) + + // Периферийная функция - PWM + NT_COMMON_REG->GPIOPCTLA_bit.PIN10 = 2;//ePWMxB(0) + NT_COMMON_REG->GPIOPCTLF_bit.PIN2 = 0;//ePWMxB(1) + NT_COMMON_REG->GPIOPCTLF_bit.PIN4 = 0;//ePWMxB(2) + + NT_COMMON_REG->GPIOPCTLG_bit.PIN2 = 0;//ePWMxA(0) + NT_COMMON_REG->GPIOPCTLG_bit.PIN3 = 0;//ePWMxA(1) + NT_COMMON_REG->GPIOPCTLG_bit.PIN4 = 0;//ePWMxA(2) + + //NT_GPIOG->DATAOUT |= (1 << 6); + NT_GPIOG->OUTENSET = (1 << 6); //InvEnable +#endif + +#if defined(HW_VECTORCARD_DRV8312_EVM) + //ШИМ 3 вывода управления верхними ключами (нижние ключи ШИМят сами драйвером) + NT_GPIOG->ALTFUNCSET = (1 << 2) + (1 << 3) + (1 << 4); //ePWMxA(0), (1), (2) + + // Периферийная функция - PWM + NT_COMMON_REG->GPIOPCTLG_bit.PIN2 = 0;//ePWMxA(0) + NT_COMMON_REG->GPIOPCTLG_bit.PIN3 = 0;//ePWMxA(1) + NT_COMMON_REG->GPIOPCTLG_bit.PIN4 = 0;//ePWMxA(2) + + //выключаем альтернативные функции (на всякий) + NT_GPIOA->ALTFUNCCLR = (1 << 10); //A[10] + NT_GPIOF->ALTFUNCCLR = (1 << 2) + (1 << 4); //F[2], F[4] + + //A[10], F[2], F[4] ножки резета + NT_GPIOA->OUTENSET = (1 << 10); + NT_GPIOF->OUTENSET = (1 << 2); + NT_GPIOF->OUTENSET = (1 << 4); +#endif + + +#ifdef HW_VECTOR_MK_40_4 + NT_GPIOG->ALTFUNCSET_bit.ALTFUNCSET = (1 << 2) + (1 << 3) + (1 << 4); //ePWMxA(0), (1), (2) + NT_GPIOF->ALTFUNCSET_bit.ALTFUNCSET = (1 << 0) + (1 << 2) + (1 << 4); //ePWMxB(0), (1), (2) + + // Периферийная функция - PWM + NT_COMMON_REG->GPIOPCTLF_bit.PIN0 = 0;//ePWMxB(0) + NT_COMMON_REG->GPIOPCTLF_bit.PIN2 = 0;//ePWMxB(1) + NT_COMMON_REG->GPIOPCTLF_bit.PIN4 = 0;//ePWMxB(2) + + NT_COMMON_REG->GPIOPCTLG_bit.PIN2 = 0;//ePWMxA(0) + NT_COMMON_REG->GPIOPCTLG_bit.PIN3 = 0;//ePWMxA(1) + NT_COMMON_REG->GPIOPCTLG_bit.PIN4 = 0;//ePWMxA(2) + + //Вход аппаратной аварии + NT_GPIOA->ALTFUNCCLR = (1<<8); //A[8] + +#endif + +#ifdef HW_MOTORCONTROLBOARD + //ШИМ 6 выводов + // в GpioPeripheralInit +#endif + + //Синхронный запуск ШИМ + SIU->PWMSYNC_bit.PRESCRST= 0b111; +} + + + +//! Нормирование входных величин. + +//!Учитывает компенсацию напряжения при изменении Ud, +//!выполняет вписывание вектора в окружность, если требуется, и +//!выполняет смену базиса, относительно которого идет нормировка. +//! \memberof TPWM_Module +void PWM_Module_NormInput(TPWM_Module* p) { + _iq knorm; + + p->UalphaNorm=p->UalphaRef; + p->UbetaNorm=p->UbetaRef; + + //находим амплитуду (без учета ограничения) + p->U_mag=_IQmag(p->UalphaNorm,p->UbetaNorm); + + + p->UdCorTmp=_IQdiv(_IQ(1.0),(_IQ(1.0)+_IQmpy((adc.Udc_meas-_IQ(1.0)),p->UdCompK))); + //учет пульсаций напряжения на Ud + if (p->UdCompEnable&1) { //он включен? + p->UalphaNorm=_IQmpy(p->UalphaNorm, p->UdCorTmp);//изменим пропорционально коэфф-ту коррекции + p->UbetaNorm=_IQmpy(p->UbetaNorm, p->UdCorTmp);//и это тоже + } + + //вписывание заданной амплитуды напряжения в окружность, вписываемую в шестиугольник базывых векторов + //когда U_lim=1.0, это и есть такая окружность. Бывает, что мы хотим вписывать в шестиугольник. Тогда просто задираем вверх огрианичение U_lim + if (p->U_lim>_IQ(1.0/0.866)) //но нет смысла задирать выше максимально-реализ. напряжения (больше базового вектора) + p->U_lim=_IQ(1.0/0.866); + /* рассчитываем амплитуду вектора, который хотим отработать*/ + knorm=_IQmag(p->UalphaNorm,p->UbetaNorm);//плюс нормируем от 540 к 311 + if (knorm>=p->U_lim) { //он больше, чем наше ограничение? + knorm=_IQdiv(p->U_lim,knorm);//в эту же переменную, для экономии, рассчитываем нормировку + p->UalphaNorm=_IQmpy(knorm,p->UalphaNorm);//уменьшаем пропорционально нормировке + p->UbetaNorm=_IQmpy(knorm,p->UbetaNorm);//и это + p->ULimitation=1;//флаг о том, что идет ограничение напряжения + } else + p->ULimitation=0; + + /* рассчитываем приведенные вектора*/ + /* До этого момента напряжение нормировалось относительно + базиса фазного амплитудного значения, например, 220*sqrt(2) + Теперь производится переход, где за единицу принимается максимально + реализуемое напряжение (длина базового вектора) + */ + p->UalphaNorm=_IQmpy(p->UalphaNorm,_IQ(0.866)); + p->UbetaNorm=_IQmpy(p->UbetaNorm,_IQ(0.866)); +} + + + +//! Функция 6ти секторной векторной ШИМ + +//! \memberof TPWM_Module +void PWM_Module_No_SV_Update(TPWM_Module *p) { + _iq lambda1; + _iq lambda2; + _iq lambda3; + + int16 gamma; + int16 gamma1; + long tmp_pwm; + + //Присвоение трех уставок сравнения только если счетчик таймера далек от нуля, чтобы + //предотвратить частичное применение скважностей, что в векторной ШИМ может быть критично и испортить период ШИМ. + DINT; + if (PWM0->TBCTR>30) { + PWM0->CMPA_bit.CMPA=(Uint16)p->GammaA; + PWM1->CMPA_bit.CMPA=(Uint16)p->GammaB; + PWM2->CMPA_bit.CMPA=(Uint16)p->GammaC; + } + EINT; + + PWM_Module_NormInput(p); + + //Расчет скважностей по методу Изосимова. + //Подробнее см. диссертацию Чуева П.В. http://motorcontrol.ru/wp-content/uploads/2015/11/Chuev_vector_control.pdf + tmp_pwm = _IQmpy(_1_SQRT3,p->UbetaNorm); /*делим на корень из 3*/ + lambda1 = _IQmpy(p->k_pwm,(p->UalphaNorm - tmp_pwm)); + lambda2 = _IQmpy(p->k_pwm,2*tmp_pwm); + lambda3 = _IQmpy(p->k_pwm,p->UalphaNorm + tmp_pwm); + + + if (lambda1<=0) + if (lambda3>0) { + gamma=lambda3; + gamma1=-lambda1; + p->sector=1; /*110 начало */ + p->GammaA=p->k_pwm-gamma; + p->GammaB=p->k_pwm-(gamma+gamma1+1); + p->GammaC=p->k_pwm-0; + + } else if (lambda2>0) { + gamma=lambda2; + gamma1=-lambda3; + p->sector=2; /*011 начало */ + p->GammaA=p->k_pwm-0; + p->GammaB=p->k_pwm-(gamma+gamma1+1); + p->GammaC=p->k_pwm-gamma1; + /*011 начало */ + } else if (lambda1!=0) { + gamma=-lambda1; + gamma1=-lambda2; + p->sector=3; /*011 начало */ + p->GammaA=p->k_pwm-0; + p->GammaB=p->k_pwm-gamma; + p->GammaC=p->k_pwm-(gamma+gamma1+1); + /*011 начало */ + } else { + gamma=-lambda3; + gamma1 = lambda1; + p->sector= 4; /*101 начало */ + p->GammaA=p->k_pwm-gamma1; + p->GammaB=p->k_pwm-0; + p->GammaC=p->k_pwm-(gamma+gamma1+1); + /*101 начало */ + + } + else if (lambda2>0) { + gamma=lambda1; + gamma1=lambda2; + p->sector= 0; /*110 начало */ + p->GammaA=p->k_pwm-(gamma+gamma1+1); + p->GammaB=p->k_pwm-gamma1; + p->GammaC=p->k_pwm-0; + /*110 начало */ + } else if (lambda3<0) { + gamma=-lambda3; + gamma1 = lambda1; + p->sector= 4; /*101 начало */ + p->GammaA=p->k_pwm-gamma1; + p->GammaB=p->k_pwm-0; + p->GammaC=p->k_pwm-(gamma+gamma1+1); + /*101 начало */ + } else { + gamma=-lambda2; + gamma1=lambda3; + p->sector=5; /*101 начало */ + p->GammaA=p->k_pwm-(gamma+gamma1+1); + p->GammaB=p->k_pwm-0; + p->GammaC=p->k_pwm-gamma; + /*101 начало */ + } + + + /*насыщения */ + + if (p->GammaA<0) p->GammaA=0; + if (p->GammaB<0) p->GammaB=0; + if (p->GammaC<0) p->GammaC=0; + + if (p->GammaA>p->k_pwm) p->GammaA=p->k_pwm+1; + if (p->GammaB>p->k_pwm) p->GammaB=p->k_pwm+1; + if (p->GammaC>p->k_pwm) p->GammaC=p->k_pwm+1; + + //Присвоение трех уставок сравнения только если счетчик таймера далек от нуля, чтобы + //предотвратить частичное применение скважностей, что в векторной ШИМ может быть критично и испортить период ШИМ. + //Второй раз - чтобы предотвратить ситуацию с постоянной "незагрузкой" при равенстве частот расчета и ШИМ + DINT; + if (PWM0->TBCTR>30) { + PWM0->CMPA_bit.CMPA=(Uint16)p->GammaA; + PWM1->CMPA_bit.CMPA=(Uint16)p->GammaB; + PWM2->CMPA_bit.CMPA=(Uint16)p->GammaC; + } + EINT; +} + +//! Функция синусоидальной ШИМ + +//! \memberof TPWM_Module +void PWM_Module_Sin_Update(TPWM_Module *p) { + _iq PhasePtsA; + _iq PhasePtsB; + _iq PhasePtsC; + _iq knorm; + + + p->UalphaNorm = p->UalphaRef; + p->UbetaNorm = p->UbetaRef; + + //находим амплитуду (без учета ограничения) + p->U_mag = _IQmag(p->UalphaNorm, p->UbetaNorm); + + /* рассчитываем амплитуду вектора, который хотим отработать*/ + knorm = _IQmag(p->UalphaNorm, p->UbetaNorm); + if (knorm >= p->U_lim) { //он больше, чем наше ограничение? + knorm = _IQdiv(p->U_lim, knorm); //в эту же переменную, для экономии, рассчитываем нормировку + p->UalphaNorm = _IQmpy(knorm, p->UalphaNorm); //уменьшаем пропорционально нормировке + p->UbetaNorm = _IQmpy(knorm, p->UbetaNorm); //и это + p->ULimitation = 1; //флаг о том, что идет ограничение напряжения + } else + p->ULimitation = 0; + + //Нормирование входного напряжения. Так как синусоидальная ШИМ формирует на 0.866 меньшее напряжение, + //чем векторная ШИМ (270В амплитудного фазного напряжения вместо 311В), то для того, чтобы при том же задании в переменных + //p->UalphaNorm, p->UbetaNorm получилось то же самое напряжение на выходе, что и в векторной ШИМ, нужно задания увеличить в 1/0.866 раз. + //Деление на два нужно для последующих формул, чтобы переменые менялись в половинном от максимального диапазоне. + p->UalphaNorm = _IQmpy(p->UalphaNorm, _IQ(1/0.866/2)); + p->UbetaNorm = _IQmpy(p->UbetaNorm, _IQ(1/0.866/2)); + + /*фазное преобразование из системы альфа, бетта в a,b,c */ + + PhasePtsA = _IQ(0.5) - (p->UalphaNorm); + PhasePtsB = _IQ(0.5) - (_IQmpy(p->UbetaNorm,_IQ(0.8660254)) - (p->UalphaNorm >> 1)); + PhasePtsC = _IQ(0.5) - (-_IQmpy(p->UbetaNorm, _IQ(0.8660254)) - (p->UalphaNorm >> 1)); + + p->GammaA = _IQmpy(p->k_pwm, PhasePtsA); + p->GammaB = _IQmpy(p->k_pwm, PhasePtsB); + p->GammaC = _IQmpy(p->k_pwm, PhasePtsC); + + /*насыщения */ + + if (p->GammaA < 0) + p->GammaA = 0; + if (p->GammaB < 0) + p->GammaB = 0; + if (p->GammaC < 0) + p->GammaC = 0; + + if (p->GammaA > p->k_pwm) + p->GammaA = p->k_pwm + 1; + if (p->GammaB > p->k_pwm) + p->GammaB = p->k_pwm + 1; + if (p->GammaC > p->k_pwm) + p->GammaC = p->k_pwm + 1; + + + PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA; + PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB; + PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC; + +} + +//! Функция ШИМ с раздельными фазами (для модели SRM) + +//! \memberof TPWM_Module +void PWM_Module_Separate_Update(TPWM_Module *p) { + _iq PhasePtsA; + _iq PhasePtsB; + _iq PhasePtsC; + _iq knorm; + + p->UPhARef = _IQmpy(p->UPhARef, _IQ(0.5)); + p->UPhBRef = _IQmpy(p->UPhBRef, _IQ(0.5)); + p->UPhCRef = _IQmpy(p->UPhCRef, _IQ(0.5)); + + PhasePtsA = _IQ(0.5) - p->UPhARef; + PhasePtsB = _IQ(0.5) - p->UPhBRef; + PhasePtsC = _IQ(0.5) - p->UPhCRef; + + p->GammaA = _IQmpy(p->k_pwm, PhasePtsA); + p->GammaB = _IQmpy(p->k_pwm, PhasePtsB); + p->GammaC = _IQmpy(p->k_pwm, PhasePtsC); + + /*насыщения */ + + if (p->GammaA < 0) + p->GammaA = 0; + if (p->GammaB < 0) + p->GammaB = 0; + if (p->GammaC < 0) + p->GammaC = 0; + + if (p->GammaA > p->k_pwm) + p->GammaA = p->k_pwm + 1; + if (p->GammaB > p->k_pwm) + p->GammaB = p->k_pwm + 1; + if (p->GammaC > p->k_pwm) + p->GammaC = p->k_pwm + 1; + + PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA; + PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB; + PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC; + +} + +void PWM_Module_DC_Update(TPWM_Module *p) +{ + int32 UalphaRef = 0, UbetaRef = 0; + int32 gamma1_DC = 0, gamma2_DC = 0; + int32 temp32; + + UalphaRef = p->UalphaRef; + UbetaRef = p->UbetaRef; + + if (UalphaRef > _IQ(1)) + UalphaRef = _IQ(1); + else if (UalphaRef < _IQ(-1)) + UalphaRef = _IQ(-1); + + if (UbetaRef > _IQ(1)) + UbetaRef = _IQ(1); + else if (UbetaRef < _IQ(0)) + UbetaRef = _IQ(0); + + //данное преобразование даёт возможность отрабатывать напряжения в диапазоне -1 - 0 - +1 (в относительных единицах) + //Напряжение 1 - скважность (1/2 + 0.5) = 1, Напряжение 0 - скважность 0,5 и т.д. + gamma1_DC = -(UalphaRef >> 1) + _IQ(0.5); // (IQ), Приводим заданное напряжение к соответствующей скважности. + + //На низких частотах величина p->k_pwm большая, значит большой может быть и temp32. + //по-этому для расчётов целесообразно использовать формат iq16. + gamma1_DC = gamma1_DC >> 8; // (IQ16) переводим то, что выше, в iq16. + temp32 = _IQ16mpy(gamma1_DC, _IQ16(p->k_pwm)); // (IQ16) переводим скважность в величину для загрузки в регистр сравнения. + p->GammaA = temp32 >> 16; // (IQ0) Загружем целую часть в регистр сравнения. + p->GammaB = p->k_pwm - p->GammaA; // в регистре сравнения EPwm2 то же, что и в EPwm1. + + //На низких частотах величина p->k_pwm большая, значит большой может быть и temp32. + //по-этому для расчётов целесообразно использовать формат iq16. + gamma2_DC = UbetaRef >> 8; // (IQ16) переводим то, что выше, в iq16. + temp32 = _IQ16mpy(gamma2_DC, _IQ16(p->k_pwm)); // (IQ16) переводим скважность в величину для загрузки в регистр сравнения. + p->GammaC = p->k_pwm - (temp32 >> 16); // (IQ0) Загружем целую часть в регистр сравнения. + + PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA; + PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB; + PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC; +} + +//! Функция ШИМ для начальной зарядки будстрепных конденсаторов инвертора + +//! \memberof TPWM_Module +void PWM_Module_ChargingMode(TPWM_Module *p) { + p->GammaA = p->k_pwm; + p->GammaB = p->k_pwm; + p->GammaC = p->k_pwm; + + DINT; + if (PWM0->TBCTR > 30) { + PWM0->CMPA_bit.CMPA = (Uint16) p->GammaA; + PWM1->CMPA_bit.CMPA = (Uint16) p->GammaB; + PWM2->CMPA_bit.CMPA = (Uint16) p->GammaC; + } + EINT; +} + +//! Общая функция-обертка для расчета ШИМ + +//Вызывающает ту версию ШИМ (ту функцию), что выбрана в настройках. + +//! \memberof TPWM_Module +void PWM_Module_Update(TPWM_Module *p) { + + if (p->ChargingMode) + PWM_Module_ChargingMode(p); + else { + switch (p->PWM_type) { + case PWM_TYPE_6SECT_NO_SV: { + PWM_Module_No_SV_Update(p); + break; + } + case PWM_TYPE_SIN_PWM: { + PWM_Module_Sin_Update(p); + break; + } + case PWM_TYPE_DC_DRIVE: { + PWM_Module_DC_Update(p); + break; + } + case PWM_TYPE_SRD: { + PWM_Module_Separate_Update(p); + break; + } + } + } + +} + +//! Медленный расчет + +//! Пересчитываются введенные пользователем величины +//! Величина мертвого времени, частота ШИМ и т.п. + +//! \memberof TPWM_Module +void PWM_Module_SlowCalc(TPWM_Module *p) { + Uint16 tmp; + //проверка ограничений величины мертвого времени + if (p->DeadBand < DEAD_BAND_MIN) + p->DeadBand = DEAD_BAND_MIN; + if (p->DeadBand > DEAD_BAND_MAX) + p->DeadBand = DEAD_BAND_MAX; + //пересчет МВ из формата IQ в мкс в такты таймера на 100мГц + PWM0->DBRED = _IQ4mpy(_IQ4(100), p->DeadBand >> 20) >> 4; + //во все ключи то же самое + PWM0->DBFED = PWM0->DBRED; + + PWM1->DBFED = PWM0->DBRED; + PWM1->DBRED = PWM0->DBRED; + PWM2->DBFED = PWM0->DBRED; + PWM2->DBRED = PWM0->DBRED; + + if (p->MinGammaLimit < DEAD_BAND_MIN) + p->MinGammaLimit = GAMMA_LIMIT_MIN; + if (p->MinGammaLimit > DEAD_BAND_MAX) + p->MinGammaLimit = GAMMA_LIMIT_MAX; + PWM0->FWDTH = _IQ4mpy(_IQ4(100), p->MinGammaLimit >> 20) >> 4; + PWM1->FWDTH = PWM0->FWDTH; + PWM2->FWDTH = PWM0->FWDTH; + //частота ШИМ. Смена "на лету". + if (p->FreqPrev != p->Frequency) { //сменили частоту + DINT; //запрещение прерываний + //проверка максимума/минимума + if (p->Frequency < PWM_FREQ_MIN) + p->Frequency = PWM_FREQ_MIN; + if (p->Frequency > PWM_FREQ_MAX) + p->Frequency = PWM_FREQ_MAX; + //изменяем период + p->k_pwm = _IQ10div(_IQ10(APB0BusClock/1000.0), p->Frequency << 1) >> 10; //период + PWM0->TBPRD = p->k_pwm; + //для всех стоек то же самое + PWM1->TBPRD = p->k_pwm; + PWM2->TBPRD = p->k_pwm; + PWM3->TBPRD = p->k_pwm; //таймер АЦП + + //посчитаем длину выборки для усреднения токов, исходя из частоты ШИМ + adc.IASampleLength = (p->Frequency >> 10) / 10; //Частота ШИМ в формате 22.10, приводим к инту и делим на 10 - частоту расчета системы управления + if (adc.IASampleLength > 4) //не более 4 точек + adc.IASampleLength = 4; + if (adc.IASampleLength < 1) //не менее 1 точки + adc.IASampleLength = 1; + adc.IBSampleLength = adc.IASampleLength; + adc.ICSampleLength = adc.IASampleLength; + adc.UdcSampleLength = adc.IASampleLength; + + p->FreqPrev = p->Frequency; //предыдущая частота + EINT; + } + + PWM3->TBPHS_bit.TBPHS = 1;//подбор сдвига для запуска АЦП: 1 - ровно на нуле таймера + +} + +//! Функция включения ШИМ (включение инвертора) + +//! \memberof TPWM_Module +void PWM_Module_On(TPWM_Module *p) { + p->Enabled = 1; //флаг "включено" + + // Снимаем принудительную установку выходов + PWM0->AQCSFRC = 0; + PWM1->AQCSFRC = 0; + PWM2->AQCSFRC = 0; + GPIO_INV_ON; + +} + +//! Функция выключения ШИМ (выключение инвертора) + +//! \memberof TPWM_Module +void PWM_Module_Off(TPWM_Module *p) { + + p->Enabled = 0; //флаг "выключено" + // Принудительно обнулим все ножки + + PWM0->AQCSFRC = 9; // 0x1 - 0 на выходе PWMxA, 0x8 - 1 на выходе PWMxB + PWM1->AQCSFRC = 9; // 0x1 - 0 на выходе PWMxA, 0x8 - 1 на выходе PWMxB + PWM2->AQCSFRC = 9; // 0x1 - 0 на выходе PWMxA, 0x8 - 1 на выходе PWMxB + GPIO_INV_OFF; + +} + +/*@}*/ diff --git a/Vsrc/V_QEP.c b/Vsrc/V_QEP.c new file mode 100644 index 0000000..dc4698f --- /dev/null +++ b/Vsrc/V_QEP.c @@ -0,0 +1,340 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_QEP.c + \brief Модуль оценки скорости и положения при помощи eQEP (см. TposspeedEqep) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup V_QEP + @{*/ + +#include "DSP.h" +#include "V_IQmath.h" +#include "V_QEP.h" +#include "math.h" +#include "stdlib.h" +#include "main.h" + +#define FIRST_LAUNCH_UP 1//!< первый пуск при переходе с низкой скорости на более высокую +#define NOT_FIRST_LAUNCH 0//!< не первый пуск +#define SCALE_IQ_K 10 +#define LOWEST_UPSS 0 + + +//Как рассчитывать скорость - +//Таймеров QEP между метками аппаратно +#define SPEED_CALC_TYPE_BY_QEP 0 +//Программно по производной угла +#define SPEED_CALC_TYPE_BY_SOFT 1 + + +//! Инициализация + +//! \memberof TposspeedEqep +void TposspeedEqep_init(TposspeedEqep *p) { + + QEP0->QCAPCTL_bit.UPPS = LOWEST_UPSS; + QEP0->QCAPCTL_bit.CCPS = 4; + + //Вкл. режим квадратурного счёта + QEP0->QDECCTL_bit.QSRC = 0; + //Режим отладчика + QEP0->QEPCTL_bit.FREESOFT = 0; + //Значение счётчика положения после инициализации или положительного переполнения + QEP0->QPOSINIT = 0; + //Сброс счётчика + QEP0->QEPCTL_bit.SWI = 1; + //Максимальное значение счётчика, после чего обнуление + QEP0->QPOSMAX = (p->resol << 2) - 1; + //Проверка направления движения + if (p->Posspeed_CTL.bit.dir == 1) { + QEP0->QDECCTL_bit.QAP = 1; + } + //Вкл. квадратурного счётчика + QEP0->QEPCTL_bit.QPEN = 1; + //Отчистка всех флагов + QEP0->QCLR = 0xFFFF; + //Режим захвата - по умолчанию, по событию отработки заданного числа импульсов + QEP0->QEPCTL_bit.QCLM = 0; + //Режим обнуления счётчика - по реперному событию + if (p->Posspeed_CTL.bit.index_en == 1) { //если индексная метка есть + QEP0->QEPCTL_bit.PCRM = 0; + QEP0->QEINT_bit.IEL = 1; + } else { + //Режим обнуления счётчика - по максимальному значению + QEP0->QEPCTL_bit.PCRM = 1; + } + //Ввод периода сторожевого таймера + QEP0->QWDPRD = 200000 / (1 << 2); + //Вкл. сторожевого таймера + QEP0->QEPCTL_bit.WDE = 1; + /*Расчёт вспомогательного коэффициента для расчёта скорости, + где 15=60/4, 60 - для перевода в об/мин; 4 - для получения интерполяции разрешения датчика (1 период дает 4 фронта); + CORE_CLK - частота процессора*/ + p->k_low = CORE_CLK / ((float) p->resol * p->speed_nom) * 15.0; + //В iq формате уменьшаем число в 1<<(24-SCALE_IQ_K), где 24 - дробная часть iq, а SCALE_IQ_K - то, насколько сдвигается величина + //с которой speedK дальше участвует в формуле + p->speedK = _IQ(p->k_low / (1 << (24 - 10))); + + p->resol_inv = 1.0 / ((float) p->resol); + + if (p->Posspeed_CTL.bit.index_en){//если индексная метка есть + // TODO переделать NT_COMMON_REG->GPIOPCTLG_bit.PIN12 = 1; //QEP1 I + } + + +} + +//! Функция расчёта скорости и положения, вызывается с необходимой дискретностью + +//! \memberof TposspeedEqep +void TposspeedEqep_Calc(TposspeedEqep *p) { + long temp; + //Текущее значение GPIO для отладки. Можно смотреть в осцах + p->GPIOsValue = (GPIOG->DATA >> 10) & 3; + + //если скорость высокая, а делитель UPEVNT не высокий + if ((labs(p->speed_elec) > _IQ(2)) && (QEP0->QCAPCTL_bit.UPPS != 5)) { + QEP0->QCAPCTL_bit.UPPS = 5; //делаем делитель UPEVNT высокий + p->skip_counter = 2; //два такта пропустим расчет скорости + } + + //если скорость низкая, а делитель не низкий + if ((labs(p->speed_elec) < _IQ(1.5)) && (QEP0->QCAPCTL_bit.UPPS != LOWEST_UPSS)) { + QEP0->QCAPCTL_bit.UPPS = LOWEST_UPSS; //делаем делитель UPEVNT низкий + p->skip_counter = 2; //два такта пропустим расчет скорости + } + + p->UPPS_forWatch = QEP0->QCAPCTL_bit.UPPS; //для отображения UPPS наружу + + if (p->Posspeed_CTL.bit.CmdInit == 1) { //Команда переинициализации - все обнуляем + QEP0->QEPCTL_bit.SWI = 1; + p->Posspeed_FLG1.bit.first_theta = 1; + p->Posspeed_FLG2.bit.pos_ident = 0; + p->Posspeed_CTL.bit.CmdInit = 0; + p->theta_elec = 0; + p->Poscnt_res = 0; + } + p->Poscnt_resPrev=p->Poscnt_res; +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + p->Poscnt_res = (unsigned long) model.qepCounter; //захват положения +#else + p->Poscnt_res = (unsigned long) QEP0->QPOSCNT; //захват положения +#endif + + p->Poscnt_res16=p->Poscnt_res;//Для наблюдения на осциллографе + p->Posspeed_FLG1.bit.PCO_tmp = QEP0->QFLG_bit.PCO; //копия флага положительного переполнения счётчика + p->Posspeed_FLG1.bit.PCU_tmp = QEP0->QFLG_bit.PCU; //копия флага отрицательного переполнения счётчика + QEP0->QCLR_bit.PCO = 1; //отчистка флага положительного переполнения счётчика + QEP0->QCLR_bit.PCU = 1; //отчистка флага отрицательного переполнения счётчика + + //перевод угла в метках на обороте в механический угол + //Здесь расчет во float - желательно переделать в IQ + p->theta_mech = _IQ((float )p->Poscnt_res * p->resol_inv * 0.25); //расчёт механического угла + p->theta_mech &= 0x00FFFFFF; + + + // Подсчёт количества полных оборотов. Через PCO и PCU получается как-то глючно + if (p->prevThetaMech - p->theta_mech > _IQ(0.5)) + p->RevolutionCounter++; + if (p->prevThetaMech - p->theta_mech < _IQ(-0.5)) + p->RevolutionCounter--; + p->prevThetaMech=p->theta_mech; + + //угол в метках без обнуления на обороте, абсолютный + p->Poscnt_resContinouosLong=p->Poscnt_res+((QEP0->QPOSMAX+1)*p->RevolutionCounter); + p->Poscnt_resContinouosInt=p->Poscnt_resContinouosLong;//чтобы было уднобно смотреть в 16ти разрядном осциллографе + p->Poscnt_resContinouosInt8=p->Poscnt_resContinouosLong&0xF;//чтобы видеть метки в крупном масштабе + + + //перевод угла в метках абсолютных (не обнуляемых наобороте) в механический угол + //на 127 оборотах всё переполнится, но для демо сгодится + p->theta_mechContinouos = _IQ((float )p->Poscnt_resContinouosLong * p->resol_inv * 0.25); //расчёт механического угла + p->theta_elecContinouos = p->theta_mechContinouos*p->pole_pairs+ p->AngleOffset;//электрический угол абсолютный (не обнуляемый) + + //Расчёт электрического положения обнулемого по достижению 360 градусов + p->theta_el_tmp = p->theta_mech*p->pole_pairs + p->AngleOffset; + p->theta_elec = p->theta_el_tmp & 0x00FFFFFF; + + //рассчитывать скорость аппаратно, засекая время между метками средствами QEP + if (p->SpeedCalcType==SPEED_CALC_TYPE_BY_QEP){ + + /*Проверка на срабатывание сторожевого таймера - не пришло не единого импульса*/ + if (QEP0->QFLG_bit.WTO == 1) { + p->Posspeed_FLG1.bit.first_launch = FIRST_LAUNCH_UP; //указатель первого запуска алгоритма после срабатывания таймера + p->speed_elec = 0; //обнуление скорости + QEP0->QCLR_bit.WTO = 1; //отчистка флага + QEP0->QWDTMR = 0; //обнуление таймера + } else { + /*переключение по первому запуску для инициализации*/ + if (p->Posspeed_FLG1.bit.first_launch == FIRST_LAUNCH_UP) { + //Откл. блока захвата + QEP0->QCAPCTL_bit.CEN = 0; + QEP0->QCAPCTL_bit.CEN = 1; + p->Posspeed_FLG1.bit.first_launch = NOT_FIRST_LAUNCH; + } + + p->QEPSTS=QEP0->QEPSTS;//копия регистра статуса + + if (p->QEPSTS_bit.UPEVNT == 1) { //есть событие UPEVNT, значит в таймере захвачено время + p->Qcprdlat_tmp = QEP0->QCPRD; //копия счетчика времени + p->speed_calc_skip = 0; //пропуск расчета скорости - не пропускать + + if (p->QEPSTS_bit.COEF == 1) { //проверка флага переполнения таймера + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + QEP0->QEPSTS = 1 << 3; + } + + if (p->QEPSTS_bit.CDEF == 1) { //проверка на изменения направления движения во время захвата + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + QEP0->QEPSTS = 1 << 2; + } + + if (p->Qcprdlat_tmp<7){//ложный фронт + p->speed_calc_skip = 1; //пропустить расчет скорости + } + + if (p->QEPSTS_bit.QDF!=p->DirPrev){//сменилось направление движения + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + } + p->DirPrev=p->QEPSTS_bit.QDF; + + if (p->skip_counter != 0) { //Сменился UPPS + p->skip_counter--; + p->speed_calc_skip = 1; //пропустить расчет скорости + } + + + if (p->Qcprdlat_tmp > ((1<<(32-SCALE_IQ_K-1)))) { //Счетчик 32 разряда, а драйвер предназначен для меньшего числа, определяемого SCALE_IQ_K + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + } + + if (!p->speed_calc_skip) { //если расчет скорости пропускать не надо + if (p->QEPSTS_bit.QDF == 1) //в зависимости от направления движения + p->speed_tmpIQ = _IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K); //коэффициет скорости делется на 16ти разрядное время, подвинутое вверх на 15 + else + p->speed_tmpIQ = -_IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K); + + //На сколько нужно подвинуть результат в зависимости от + //делителей на UPEVNT и тактировании счетчика времени + p->MoveK = QEP0->QCAPCTL_bit.UPPS + - QEP0->QCAPCTL_bit.CCPS; + + if (p->MoveK >= 0) //надо подвинуть вверх + p->speed_tmpIQ = p->speed_tmpIQ << p->MoveK; + else + //вниз + p->speed_tmpIQ = p->speed_tmpIQ >> -p->MoveK; + p->speed_elec = p->speed_tmpIQ; //готовая скорость в формате 8.24 + } + + QEP0->QEPSTS = 1 << 7; + } + else if (QEP0->QCTMR > QEP0->QCPRD) + { //нет события UPEVNT, считаем по таймеру QCTMR, а не по периоду QCPRD + p->Qcprdlat_tmp = QEP0->QCTMR; //копия счетчика + + if (p->QEPSTS_bit.COEF == 1) { //проверка флага переполнения таймера + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + } + + if (p->QEPSTS_bit.CDEF == 1) { //проверка на изменения направления движения во время захвата + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + } + if (p->Qcprdlat_tmp<7){//ложный фронт + p->speed_calc_skip = 1; //пропустить расчет скорости + } + + if (p->Qcprdlat_tmp > ((1<<(32-SCALE_IQ_K-1)))) { //Счетчик 32 разряда, а драйвер предназначен для меньшего числа, определяемого SCALE_IQ_K + p->speed_elec = 0; + p->speed_calc_skip = 1; //пропустить расчет скорости + } + + if (!p->speed_calc_skip) { //если расчет скорости пропускать не надо + if (p->QEPSTS_bit.QDF == 1) //в зависимости от направления движения + p->speed_tmpIQ = _IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K); //коэффициет скорости делется на 16ти разрядное время, подвинутое вверх на 15 + else + p->speed_tmpIQ = -_IQdiv(p->speedK, p->Qcprdlat_tmp << SCALE_IQ_K); + + //На сколько нужно подвинуть результат в зависимости от + //делителей на UPEVNT и тактировании счетчика времени + p->MoveK = QEP0->QCAPCTL_bit.UPPS + - QEP0->QCAPCTL_bit.CCPS; + + if (p->MoveK >= 0) //надо подвинуть вверх + p->speed_tmpIQ = p->speed_tmpIQ << p->MoveK; + else + //вниз + p->speed_tmpIQ = p->speed_tmpIQ >> -p->MoveK; + p->speed_elec = p->speed_tmpIQ; //готовая скорость в формате 8.24 + } + } + } + + } + + //рассчитывать скорость программно через производную угла + if (p->SpeedCalcType==SPEED_CALC_TYPE_BY_SOFT){ + //Сначала легкий фильтр на сам угол + //0.5 и маски - это магия нечувствительности фильтра к разнице углов больше 360 + //Чтобы при обнулении угла при переходе через 360 градусов при + //вычитании из 5 градусов 355 получилось 10 (в IQ формате) + p->theta_finish=p->theta_finish+_IQmpy(_IQ(0.5),((p->theta_elec-p->theta_finish+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5)); + p->theta_finish&=0x00FFFFFF; + //расчитываем приращение угла + temp = (p->theta_finish << 8) - (p->theta_start << 8); + p->d_fi = (temp >> 8); + p->theta_start = p->theta_finish; + + //скорость нефильтрованная, рассчитанная из производной угла за один период + p->speed_elec_temp=_IQmpy(p->d_fi,p->KThetaToSpeed)<<3; + + //инерционный фильтр для скорости + p->speed_filter.input = p->speed_elec_temp; + p->speed_filter.calc(&p->speed_filter); + p->speed_elec=p->speed_filter.output; + } + +//В симуляторе доступен только один способ измерения скорости - по углу программно. +#if (defined(HW_VECTORCARD_SIMULATOR)) || (defined(HW_NIIET_BOARD_SIMULATOR)) + p->SpeedCalcType=SPEED_CALC_TYPE_BY_SOFT; +#endif + + +} + +//! Функция обработки репера (событие индекса) + +//! \memberof TposspeedEqep +void TposspeedEqep_IndexEvent(TposspeedEqep *p) { + p->Posspeed_FLG2.bit.pos_ident = 1; +} + +//! \memberof TposspeedEqep +void TposspeedEqep_SlowCalc(TposspeedEqep *p) { + //коэффициент перевода производной от угла (вычисляемую неизвестно в чем) в скорость + //сдвиг на 3 чтобы результат деления не переполнил 127, потом при использовании коэфа + //сдвинется назад на 3 + p->KThetaToSpeed=_IQdiv(_IQ(1.0),_IQmpyI32(drv_params.freq_nom,FAST_CALC_TS)<<3); +} +/*@}*/ + diff --git a/Vsrc/V_RTC_Clock.c b/Vsrc/V_RTC_Clock.c new file mode 100644 index 0000000..e6b031b --- /dev/null +++ b/Vsrc/V_RTC_Clock.c @@ -0,0 +1,206 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_RTC_Clock.c + \brief Модуль для работы с часами реального времени + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/* + + * + * Часы DS1340 работают в режиме слэйва и имеют 10 регимтров данных/контроля (0x0 ... 0x9). + * Время и дата лежат в регистрах 0x0 ... 0x6. + * Регистр контроля часов, регистр заряда акк., и регистр флагов лежат в 0x7 ... 0x9. + * Указатель на текущий регистр можно поменять, отправив в часы соответствующий номер . + * Чтобы прочитать что-то из часов, сначала нужно обратиться к часам в режиме записи и передать номер + * регистра, с которого нужно считать данные. После этого снова нужно обратиться к часам, но уже + * в режиме чтения. Тогда часы начнут слать содержимое всех регистров по очереди, начиная с того + * регистра, адрес которого был передан в предыдущем обращении. При такой "потоковой" передаче + * указатель на текущий регистр будет автоинкрементироваться, причем в такой последовательности + * (предположим, был установлен адрес 0x5) + * 0x5 -> 0x6 -> 0x7 -> 0x0 -> 0x1 -> ... -> 0x7 -> 0x0 + * Чтобы попасть в последние два регистра, нужно передать их адреса явно. + * + * Для того, чтобы записать в часики время, нужно проделать примерно то же самое. + * В режиме записи отправляется сначала номер регистра, в который нужно записать что-то, а затем + * данные, которые нужно туда положить. Указатель на регистры при потоковой передаче инкрементируется + * так же, как и при чтении. + * + * Данные хранятся в двоично-десятичном формате. + */ + +//Закомменченные функции вверху отличаются от нижних регистрами (RTC и RTC_REG). Нужны ли закомменченные - не знаю. +#include +#include +// Включатель постоянного считывания времени с ЧРВ. Если дефайн закоменчен - считывание производится только при запуске, а потом +// время считается программно. Если раскомменчен - каждую секунду время считается с часов (секунда отсчитывается в мс) +#define USE_RTC + +/* Инициализация RTC */ +void RTC_Clock_Init(TRTCClock *p) { + +} + +/* Функция считывания текущего времени */ +void RTC_Clock_Read_Time(TRTCClock *p) { + Uint16 tempSec, tempMin, tempHour, tempDOW, tempDay, tempMonth, tempYear; + + /* Остановить обновление теневых регисторв */ + RTC->SHDW = 0x0; + + /* Прочитать время */ + tempSec = RTC->SEC; + tempMin = RTC->MIN; + tempHour = RTC->HOUR; + tempDOW = RTC->DOW; + tempDay = RTC->DAY; + tempMonth = RTC->MONTH; + tempYear = RTC->YEAR; + + /* Запустить обновление теневых регисторв */ + RTC->SHDW = 0x80; + + // Затем нужно отформатировать пришедшие данные, т.к. они приходят в виде двоично-десятичных чисел (отстой) + p->second = (tempSec & 0xF) + (((tempSec & 0x70) >> 4) * 10); + p->minute = (tempMin & 0xF) + (((tempMin & 0x70) >> 4) * 10); + p->hour = (tempHour & 0xF) + (((tempHour & 0x30) >> 4) * 10); + p->DOW = (tempDOW & 0x7); + p->day = (tempDay & 0xF) + (((tempDay & 0x30) >> 4) * 10); + p->month = (tempMonth & 0xF) + (((tempMonth & 0x10) >> 4) * 10); + p->year = (tempYear & 0xF) + (((tempYear & 0xF0) >> 4) * 10); + + // Наконец, упаковка основных показателей в структурку + p->packed_time = ((Uint32) p->day << 27) + ((Uint32) p->month << 23) + + ((Uint32) p->year << 17) + ((Uint32) p->hour << 12) + + ((Uint32) p->minute << 6) + (Uint32) p->second; + +} + +/* Функция установки времени */ +void RTC_Clock_Set_Time(TRTCClock *p) { + // Временные переменные (секунды, минуты, часы...) + unsigned char tempSec, tempMin, tempHour, tempDOW, tempDay, tempMonth, + tempYear; + p->tryCounter = 0; + + // Сначала нужно распаковать дату + p->second = p->timeToSet & 0x3F; + p->minute = (p->timeToSet >> 6) & 0x3F; + p->hour = (p->timeToSet >> 12) & 0x1F; + p->year = (p->timeToSet >> 17) & 0x3F; + p->month = (p->timeToSet >> 23) & 0xF; + p->day = (p->timeToSet >> 27) & 0x1F; + + tempSec = ((p->second / 10) << 4) + ((p->second % 10) & 0xF); + tempMin = ((p->minute / 10) << 4) + ((p->minute % 10) & 0xF); + tempHour = ((p->hour / 10) << 4) + ((p->hour % 10) & 0xF); + tempDOW = p->DOW & 0x3; + tempDay = ((p->day / 10) << 4) + ((p->day % 10) & 0xF); + tempMonth = ((p->month / 10) << 4) + ((p->month % 10) & 0xF); + tempYear = ((p->year / 10) << 4) + ((p->year % 10) & 0xF); + + p->msInDay = (Uint32) p->hour * 3600000 + (Uint32) p->minute * 60000 + + (Uint32) p->second * 1000; + + // Расчёт дня недели (пижонство) + int16 a = (14 - p->month) / 12; + int16 y = p->year - a; + int16 m = p->month + 12 * a - 2; + p->DOW = (7000 + (p->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) + % 7; + + RTC->YEAR = tempYear; + RTC->MONTH = tempMonth; + RTC->DAY = tempDay; + RTC->DOW = tempDOW; + RTC->HOUR = tempHour; + RTC->MIN = tempMin; + RTC->SEC = tempSec; +} + +void RTC_Clock_Ms_Calc(TRTCClock *p) { + p->ms++; + p->msInDay++; +#ifdef USE_RTC + if (p->ms > 999) { + p->ms = 0; + p->readTimeFlag = 1; + } + + //проверка работы часов реального времени и установка, в зависимсоти от этого, указателя для банка аварий + if (p->secondPrev == p->second) //секунда не меняется + p->stoppedCounter++; //считаем, как долго + else //сменилась, значит часы работают + p->stoppedCounter = 0; + + if ((p->stoppedCounter < RTC_SECOND_WAITING_TIMEOUT) && (p->year<48)) //часы работают - тикают и год не 2048 (как когда нет батарейки) + p->ClockOk=1; + + else + { + p->ClockOk=0; + p->stoppedCounter = RTC_SECOND_WAITING_TIMEOUT; + } + p->secondPrev = p->second; + + + + + +#else + + if (p->ms == 1000) { + p->ms = 0; + p->second++; + + if (p->second == 60) { + p->second = 0; + p->minute++; + if (p->minute == 60) { + p->minute = 0; + p->hour++; + if (p->hour == 24) { + p->hour = 0; + p->msInDay = 0; + p->day++; + } + } + } + p->packed_time = ((Uint32)p->day << 27) + ((Uint32)p->month << 23) + ((Uint32)p->year << 17) + + ((Uint32)p->hour << 12) + ((Uint32)p->minute << 6) + (Uint32)p->second; + } + +#endif + +} + +void RTC_Clock_Slow_Calc(TRTCClock *p) { + if (p->setTimeFlag == 1) { + p->timeToSet = p->packed_time; + p->set(p); + p->read(p); + p->msInDay = (Uint32) p->hour * 3600000 + (Uint32) p->minute * 60000 + + (Uint32) p->second * 1000; + p->setTimeFlag = 0; + } else if (p->readTimeFlag == 1) { + p->read(p); + p->readTimeFlag = 0; + } +} + + diff --git a/Vsrc/V_SSI_Encoder.c b/Vsrc/V_SSI_Encoder.c new file mode 100644 index 0000000..1d0a67c --- /dev/null +++ b/Vsrc/V_SSI_Encoder.c @@ -0,0 +1,139 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_SSI_Encoder.c + \brief Модуль оценки скорости и положения при помощи цифрового энкодера, работающего по интерфейсу SSI (см. TSSI_Encoder) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 25/04/2016 + + \addtogroup V_QEP + @{*/ + +#include "DSP.h" +#include "V_IQmath.h" +#include "V_SSI_Encoder.h" +#include "math.h" +#include "stdlib.h" +#include "main.h" + +//! Инициализация + +//! \memberof TSSI_Encoder +void SSI_Encoder_init(TSSI_Encoder *p) { + volatile long delay; + volatile Uint32 tempREG; + + + // Настройка ног SPI +#ifdef HW_MOTORCONTROLBOARD +#define SSI_NT_SPI SPI0 //Настройка номера SPI + // В GpioPeripheralInit +#else + +#define SSI_NT_SPI SPI2 //Настройка номера SPI + +#endif + + + // Настройка самого модуля SPI + // Продолжение настройки тактирования. + // Полученная ранее частота f_SSP_IN проходит ещё через два делителя. + // SSPCPSR - первый делитель, в диапазоне 2 ... 254, может быть только чётным (младший бит всегда хардварно равен 0) + // SSPCR0.bit.SCR - второй делитель от 0 до 255. + // Битрейт в итоге BitRate = f_SSP_IN / ( SSPCPSR * (SCR + 1) ) + // Тактирование 25 МГц задано в system_K1921VK028.c + + SSI_NT_SPI->CR1 = 0;// Режим - мастер, LoopBack отключён, сам модуль SSP тоже отключён + SSI_NT_SPI->IMSC = 0x0; // Запретить все прерывания + SSI_NT_SPI->DMACR = 0; // Запретить DMA + SSI_NT_SPI->ICR = 0x3; // Очистка прерываний ("переполнение FIFO приёма" и "необслуженное FIFO приёма") + + SSI_NT_SPI->CPSR_bit.CPSDVSR = 4; // Деление входной частоты на 4 -> 6,25 MHz + SSI_NT_SPI->CR0_bit.SCR = 0x3F; // Второй делитель + SSI_NT_SPI->CR0_bit.DSS = 12; // Размер данных - 12 бит + SSI_NT_SPI->CR0_bit.FRF = 0x0; // Выбор протокола: 0 = SPI + SSI_NT_SPI->CR0_bit.SPO = 0x0; // При неактивной линии держать клок в "0" + SSI_NT_SPI->CR0_bit.SPH = 0x0; // Читать данные по заднему фронту клока + SSI_NT_SPI->CR1_bit.SSE = 1; // Разрешить работу + + p->resol_inv = 1.0 / ((float) p->resol); + + p->read(p); +} + + +//! Функция расчёта скорости и положения, вызывается с необходимой дискретностью + +//! \memberof TSSI_Encoder +void SSI_Encoder_Calc(TSSI_Encoder *p) { + p->read(p); +} + + + +void SSI_Encoder_Read(TSSI_Encoder*p) { + _iq theta_elec_temp; + Uint16 Data_read=0; + _iq theta_mech_temp; + + if (SSI_NT_SPI->SR_bit.BSY == 0){ + //SPI свободен + Data_read = SSI_NT_SPI->DR; //код с датчика (число от 0 до resol) + SSI_NT_SPI->DR = 0xff; //отправляем что угодно, главное, чтобы тактирование шло + + + if (p->rotation_dir)//обратное направление вращения + Data_read = (p->resol - 1) - Data_read;//период - текущее + p->Poscnt_res=Data_read; + } + + //перевод угла в метках на обороте в механический угол + //Здесь расчет во float - желательно переделать в IQ + p->theta_mech = _IQ((float )p->Poscnt_res * p->resol_inv); //расчёт механического угла + p->theta_mech &= 0x00FFFFFF; + //Фильтр угла + if (p->theta_mech_filterK!=0) { + p->theta_mech_filtered=p->theta_mech_filtered+_IQmpy(p->theta_mech_filterK,((p->theta_mech-p->theta_mech_filtered+_IQ(0.5))&0x00FFFFFF)-_IQ(0.5)); + p->theta_mech_filtered&=0x00FFFFFF; + } else { + p->theta_mech_filtered=p->theta_mech; + } + // Подсчёт количества полных оборотов. + if (p->prevThetaMech - p->theta_mech_filtered > _IQ(0.5)) + p->RevolutionCounter++; + if (p->prevThetaMech - p->theta_mech_filtered < _IQ(-0.5)) + p->RevolutionCounter--; + p->prevThetaMech=p->theta_mech_filtered; + + //угол в метках без обнуления на обороте, абсолютный + p->Poscnt_resContinouosLong=p->Poscnt_res+(p->resol*p->RevolutionCounter); + p->Poscnt_resContinouosInt=p->Poscnt_resContinouosLong;//чтобы было уднобно смотреть в 16ти разрядном осциллографе + p->Poscnt_resContinouosInt8=p->Poscnt_resContinouosLong&0xF;//чтобы видеть метки в крупном масштабе + + //перевод угла в метках абсолютных (не обнуляемых наобороте) в механический угол + //на 127 оборотах всё переполнится, но для демо сгодится + p->theta_mechContinouos = p->theta_mech_filtered + _IQ(p->RevolutionCounter); //расчёт механического угла + p->theta_elecContinouos = p->theta_mechContinouos*p->pole_pairs+ p->AngleOffset;//электрический угол абсолютный (не обнуляемый) + + //Расчёт электрического положения обнулемого по достижению 360 градусов + p->theta_el_tmp = p->theta_mech_filtered*p->pole_pairs + p->AngleOffset; + p->theta_elec = p->theta_el_tmp & 0x00FFFFFF; + +} + + + +/*@}*/ + diff --git a/Vsrc/V_TMU.c b/Vsrc/V_TMU.c new file mode 100644 index 0000000..df79e19 --- /dev/null +++ b/Vsrc/V_TMU.c @@ -0,0 +1,235 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_TMU.c + \brief Модуль блока тригонометрических преобразований (см. TTMU, TTMUPark, TTMUIPark) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 24/06/2019 + + \addtogroup V_TMU + @{*/ + + +#include "main.h" + +//Функция преобразования Парка. Принимает на вход аргументы в относительных единицах в IQ24. По величине аргументы ограничены только самим форматом IQ24. +void TMU_park_calc_IQ24PU (TTMUPark *p) { + TMU->PHIN = _IQ24mpy(((p->ang & 0x00FFFFFF) << 4), _IQ24(2.0*_PI)); //ограничиваем угол единицей в IQ24, преобразуем в IQ28, а затем в абсолютный угол в радианах, как требует того блок TMU + + TMU->YIN = (p->ds >> 3); //преобразуем неограниченное число в формате IQ24 в ограниченное единицей в формате IQ28 + TMU->XIN = (p->qs >> 3); //то же + + TMU->CMD = (3 << TMU_CMD_FUNC_Pos) | // Повернуть вектор + (0 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ28 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + p->de = ((int32)TMU->YOUT << 3); //преобразуем реультат обратно от максимально возможной единицы для блока TMU в IQ28 до максимально возможного числа в IQ24 + p->qe = ((int32)TMU->XOUT << 3); //то же +} + + +//Функция обратного преобразования Парка. Принимает на вход аргументы в относительных единицах в IQ24. По величине аргументы ограничены только самим форматом IQ24. +void TMU_ipark_calc_IQ24PU (TTMUIPark *p) { + TMU->PHIN = _IQ24mpy(((p->ang & 0x00FFFFFF) << 4), _IQ24(2.0*_PI)); //ограничиваем угол единицей в IQ24, преобразуем в IQ28, а затем в абсолютный угол в радианах, как требует того блок TMU + + TMU->YIN = (p->qe >> 3); //преобразуем неограниченное число в формате IQ24 в ограниченное единицей в формате IQ28 + TMU->XIN = (p->de >> 3); //то же + + TMU->CMD = (3 << TMU_CMD_FUNC_Pos) | // Повернуть вектор + (0 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ28 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + p->qs = ((int32)TMU->YOUT << 3); //преобразуем реультат обратно от максимально возможной единицы для блока TMU в IQ28 до максимально возможного числа в IQ24 + p->ds = ((int32)TMU->XOUT << 3); //то же +} + + +//Функция синуса. Принимает на вход угол в относительных единицах в IQ24. По величине угол ограничен только самим форматом IQ24. +_iq TMU_sin_IQ24PU (_iq angle) { + TMU->PHIN = _IQ24mpy(angle & 0x00FFFFFF, _IQ24(2.0*_PI)); //ограничиваем угол единицей в IQ24 и преобразуем в абсолютный угол в радианах, как требует того блок TMU + + TMU->CMD = (0 << TMU_CMD_FUNC_Pos) | // Вычислить синус/косинус + (4 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ24 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + return (TMU->YOUT); +} + + +//Функция косинуса. Принимает на вход угол в относительных единицах в IQ24. По величине угол ограничен только самим форматом IQ24. +_iq TMU_cos_IQ24PU (_iq angle) { + TMU->PHIN = _IQ24mpy(angle & 0x00FFFFFF, _IQ24(2.0*_PI)); //ограничиваем угол единицей в IQ24 и преобразуем в абсолютный угол в радианах, как требует того блок TMU + + TMU->CMD = (0 << TMU_CMD_FUNC_Pos) | // Вычислить синус/косинус + (4 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ24 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + return (TMU->XOUT); +} + + +//Функция арктангенса. Принимает на вход аргументы в относительных единицах в IQ24. По величине аргументы ограничены только самим форматом IQ24. +_iq TMU_atan2_IQ24PU (_iq inY, _iq inX) { + TMU->XIN = (inX >> 3); //преобразуем неограниченное число в формате IQ24 в ограниченное единицей в формате IQ28 + TMU->YIN = (inY >> 3); //то же + + TMU->CMD = (1 << TMU_CMD_FUNC_Pos) | // Перевод из прямоугольной системы координат в полярную + (0 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ28 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + return (_IQ24mpy((((int32)TMU->PHOUT) >> 4), _IQ24(0.15915494309189533576))); //преобразуем угол из IQ28 в IQ24 и затем делим на 2Пи для преобразования в относительный угол +} + + +//Функция преобразования координат из прямоугольной системы в полярную. Принимает на вход аргументы в относительных единицах в IQ24. По величине аргументы ограничены только самим форматом IQ24. +void TMU_cartesianToPolar_calc_IQ24PU (TTMUCarToPol *p) { + TMU->XIN = (p->x >> 3); //преобразуем неограниченное число в формате IQ24 в ограниченное единицей в формате IQ28 + TMU->YIN = (p->y >> 3); //то же + + TMU->CMD = (1 << TMU_CMD_FUNC_Pos) | // Перевод из прямоугольной системы координат в полярную + (0 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ28 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + p->r = ((int32) TMU->XOUT << 3); //преобразуем реультат обратно от максимально возможной единицы для блока TMU в IQ28 до максимально возможного числа в IQ24 + p->phi = _IQ24mpy((((int32)TMU->PHOUT) >> 4), _IQ24(0.15915494309189533576)); //преобразуем угол из IQ28 в IQ24 и затем делим на 2Пи для преобразования в относительный угол +} + + +//Функция преобразования координат из полярной системы в прямоугольную. Принимает на вход аргументы в относительных единицах в IQ24. По величине аргументы ограничены только самим форматом IQ24. +void TMU_polarToCartesian_calc_IQ24PU (TTMUPolToCar *p) { + TMU->XIN = (p->r >> 3); //преобразуем неограниченное число в формате IQ24 в ограниченное единицей в формате IQ28 + TMU->PHIN = _IQ24mpy(((p->phi & 0x00FFFFFF) << 4), _IQ24(2.0*_PI)); //ограничиваем угол единицей в IQ24, преобразуем в IQ28, а затем в абсолютный угол в радианах, как требует того блок TMU + + TMU->CMD = (2 << TMU_CMD_FUNC_Pos) | // Перевод из полярной системы координат в прямоугольную + (0 << TMU_CMD_ARGT_Pos) | // Аргументы в IQ28 + (1 << TMU_CMD_START_Pos); // Поехали + + //Ждем, пока блок TMU закончит вычисления + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + asm ("nop"); + + p->x = ((int32) TMU->XOUT << 3) ; //преобразуем реультат обратно от максимально возможной единицы для блока TMU в IQ28 до максимально возможного числа в IQ24 + p->y = ((int32) TMU->YOUT << 3); //то же +} + +/*@}*/ diff --git a/Vsrc/V_UdControl.c b/Vsrc/V_UdControl.c new file mode 100644 index 0000000..4ef3fce --- /dev/null +++ b/Vsrc/V_UdControl.c @@ -0,0 +1,119 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_UdControl.c + \brief Модуль плавного заряда ЗПТ + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 25/08/2017 + + \addtogroup + @{*/ + + +#include "main.h" + + +//!Инициализация. + +//!Конфигурируем ножку контроллера, управляющую цепью заряда на вывод. + +//! \memberof TUdControl +void UdControl_init(TUdControl *p) { + +#ifdef HW_MOTORCONTROLBOARD + p->Enabled = 1; //Включаем блок заряда ЗПТ + //ножка, управляющая цепью заряда + // D GpioPeripheralInit + UD_CONTROL_OFF; //сначала выключим + p->state = UD_CONTROL_STATE_OFF; //и еще в состояние "выключено" + p->StateOn = 0; +#else + p->Enabled = 0; //Выключить блок заряда ЗПТ +#endif + +} + +//!Расчет. + +//!Дискретный автомат, управляющий цепью заряда. Вызывать надо в каком-нибудь +//!быстром прерывании (например 10кГц). Может, будет работать и в 1кГц, но +//!не проверялось. Имеет три состояния: выключено, ожидание заряда и включено. +//!все переключения происходят на основе измеряемого напряжения на ЗПТ. + +//! \memberof TUdControl +void UdControl_calc(TUdControl *p) { + if (p->Enabled){//если есть цепь управления зарядом ЗПТ + p->fUdc.input = adc.Udc_meas; //на вход фильтра - напряжение с ЗПТ + p->fUdc.calc(&(p->fUdc)); + //считаем дискретный автомат + p->state_shadow = p->state; + if (p->state_prev != p->state_shadow) + p->E = 1; //первое вхождение + else + p->E = 0; + p->state_prev = p->state_shadow; + + switch (p->state_shadow) { + case UD_CONTROL_STATE_OFF: //ключ выключен + { + UD_CONTROL_OFF; //выключаем ключ + p->StateOn = 0; //состояние выключено + if (adc.Udc_meas > p->U_on) //напряжение почти высоко + p->state = UD_CONTROL_STATE_WAIT; //переходим в ожидание + break; + } + + case UD_CONTROL_STATE_WAIT: //ключ выключен, готовимся включить + { + if (p->E == 1) //первое вхождение + { + p->StateCounter = 0; + } + p->StateCounter += global_time.relative_time1.delta_millisecond; + UD_CONTROL_OFF; //выключаем ключ + p->StateOn = 0; //состояние выключено + if (adc.Udc_meas < p->U_off) //хотели вроде включать, но напряжение снизилось... + p->state = UD_CONTROL_STATE_OFF; + + if (global_time.relative_time1.delta_millisecond) { //если стоит бит миллисекунды + //производная на миллисекунде + p->deriv_time_ZPT = (labs(p->fUdc.output - p->fUdc_output_prev))<<11; //поднимем значение производной для получения уровня около 1 + p->fUdc_output_prev = p->fUdc.output; + } + //таймаут включения и производная + if ((p->StateCounter >= p->Timeout_on) && (p->deriv_time_ZPT < p->deriv_const) && (adc.Udc_meas > p->U_off)) { //и производная меньше заданного уровня + p->state = UD_CONTROL_STATE_ON; + p->StateCounter = 0; + } + break; + } + + case UD_CONTROL_STATE_ON: { + if ((adc.Udc_meas < p->U_off) && (drv_status.bit.running == 0)) //работали-работали, а тут напряжение снизилось... Если вдруг напряжение снизилось во время работы, то размыкать не даем + p->state = UD_CONTROL_STATE_OFF; + UD_CONTROL_ON; //включем ключ + p->StateOn = 1; //состояние включено + break; + + } + + } + } + + +} + +/*@}*/ + diff --git a/Vsrc/V_UserMemory.c b/Vsrc/V_UserMemory.c new file mode 100644 index 0000000..90840f5 --- /dev/null +++ b/Vsrc/V_UserMemory.c @@ -0,0 +1,258 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_UserMemory.c + \brief Работа с пользовательской энергонезависимой памятью 1921BK028 (см. TUserMemory) + \author Лашкевич М.М., Шпак Д.М. + \version v 1.0 21/03/2019 +*/ + +/** \addtogroup TUserMemory */ +/*@{*/ + +#include "main.h" +#include "DSP.h" + + + + +//!Инициализация + +//!Инициализация USERMEMORY +//! \memberof TUserMemory +void USERMEMORY_Init(TUserMemory *p) +{ + USERMEMORY_ReadToCache(p,0);//читаем в оперативку нулевой страницы (чтобы была текущая страница и все работало корректно дальше) +} + +//! Вспомогательная функция ожидания операции, возвращет "0" если всё ОК, и "1", если не всё ОК +Uint16 waitUserFlashBusy (TUserMemory *p) { + p->waitClocks = 0; + __NOP(); // В документации сказали подождать перед проверкой статуса + __NOP(); + __NOP(); + __NOP(); + __NOP(); + while(NVRFLASH->STAT_bit.BUSY == 0x1){//ждем + p->waitClocks++; + if (p->waitClocks > USERMEMORY_MAX_WAITCLOCKS){//устали ждать + return 1; + } + } + return 0; +} +//! Проверка, не нужно ли сменить страницу + +//! Проверяет текущий адрес на флешке, с которым работает пользователь. Если адрес вышел из текущей страницы, страница записывается на флеш и читается в RAM новый +//! \memberof TUserMemory +void USERMEMORY_UpdateCurrentPage(TUserMemory *p, Uint16 spiaddr) +{ + Uint16 newPage=spiaddr>>PAGE_SIZE_LOG2;//номер страницы - это верхнее значение адреса, так как страница 256 байт + if (newPage!=p->PageInCache){//страница другая? + if (p->PageRAM_and_FLASH_IdenticalFlag==0)//и есть измененные данные в этой странице в оперативке в кеше? + USERMEMORY_Flush(p);//загоняем страницу на флеш + if (p->receivedCode!=USERMEMORY_OP_OK)//не вышло? + return; + //читаем в оперативку новую страницу + USERMEMORY_ReadToCache(p,newPage); + if (p->receivedCode!=USERMEMORY_OP_OK)//не вышло? + return; + } +} + + +//! Запись в память + +//!Медленная функция, записывающая на flash заданные данные. +//!Работает с закешированными в оперативке данными, а физическ пишет на флеш только если адрес вылез за границы текущей страницы + +//! Адрес во флеше spiaddr, адрес 16ти разрядных данных пользователя startaddr, размер data_length. Все в байтах +//! При выполении операции startaddr инкрементируется, а spiaddr нет +//! \memberof TUserMemory +void USERMEMORY_Write(TUserMemory *p) +{ + Uint16 i = 0; + Uint16 spiaddrTmp=p->MemStartAddr;//адрес на флеше в байтах + p->MCUStartAddr8=(Uint8*)p->MCUStartAddr;//меняем указатель на данные - из указателя на 16ти разрядные данные на указатель на байты - так удобнее + for(i = 0; i < p->data_length; i++){//по всем данным, что хочет пользователь + USERMEMORY_UpdateCurrentPage(p,spiaddrTmp);//сменить и перечитать страницу, если она другая + Uint16 addrInPage=spiaddrTmp&0xFFFF;//адрес внутри страницы + if (p->cacheArr[addrInPage] != (*(p->MCUStartAddr8))){//данные на совпадают с тем, что уже в оперативке в этом месте? + p->cacheArr[addrInPage]=(*(p->MCUStartAddr8));//кладем данные в оперативку + p->PageRAM_and_FLASH_IdenticalFlag=0;//флаг, что данные в оперативке отличаются от записанных на флеше + } + spiaddrTmp++; + p->MCUStartAddr8++; + } + //p->MCUStartAddr=(Uint16*)p->MCUStartAddr8;//чтобы адрес на данные поменялся (не знаю, надо это кому или нет) + p->receivedCode = USERMEMORY_OP_OK; +} + + +//! Чтение из памяти + +//!Медленная функция, считывающая из flash заданные данные. Подробности см. TUserMemory. + +//! Адрес во флеше spiaddr, адрес адрес 16ти разрядных данных пользователя startaddr, размер data_length. Все в байтах. +//! При выполении операции startaddr инкрементируется, а spiaddr нет +//! \memberof TUserMemory +void USERMEMORY_Read(TUserMemory *p) +{ + Uint16 i = 0; + Uint16 spiaddrTmp=p->MemStartAddr; + p->MCUStartAddr8=(Uint8*)p->MCUStartAddr; + for(i = 0; i < p->data_length; i++){//по всем данным, что хочет пользователь + USERMEMORY_UpdateCurrentPage(p,spiaddrTmp);//сменить и перечитать страницу, если она другая + Uint16 addrInPage=spiaddrTmp&0xFFFF;//адрес внутри страницы + *(p->MCUStartAddr8) = p->cacheArr[addrInPage];//отдаем данные из оперативки, они должны быть там актуальные после USERMEMORY_UpdateCurrentPage + spiaddrTmp++; + p->MCUStartAddr8++; + } + p->MCUStartAddr=(Uint16*)p->MCUStartAddr8;//чтобы адрес на данные поменялся (не знаю, надо это кому или нет) + p->receivedCode = USERMEMORY_OP_OK; +} + + +//! Записывает страницу данные на флешку из кеша (из оперативки одну страницу) + +//! \memberof TUserMemory +void USERMEMORY_WriteFromCache(TUserMemory *p, int16 pageNum) +{ + int16 i = 0, readDataWord = 0; + Uint32 *arrayPointer; + Uint16 addrOffset=pageNum*USERMEMORY_PAGE_SIZE;//начальный адрес на флешке (от начала страницы) + NVRFLASH->STAT = 0x3;//сброс статуса + NVRFLASH->ADDR = addrOffset;//адрес начала страницы + NVRFLASH->CMD = (USERMEMORY_USERFLASH_KEY | USERMEMORY_CMD_PAGE_ERASE);//стираем страницу + + if (waitUserFlashBusy(p) != 0){ + p->receivedCode = USERMEMORY_WRITE_TIMEOUT; + return; + } + + for(i = 0; i < USERMEMORY_PAGE_SIZE; i += NUMBER_OF_BYTE_ON_PAGE){//цикл по размеру страницы + NVRFLASH->STAT = 0x3; //сброс статуса + NVRFLASH->ADDR = addrOffset + i; //адрес + + arrayPointer = (Uint32*)(&p->cacheArr[i]); + for (readDataWord = 0; readDataWord < NUMBER_OF_32BIT_WORDS_AT_ONCE; readDataWord++){ + NVRFLASH->DATA[readDataWord].DATA = *arrayPointer; + arrayPointer++; + } + + NVRFLASH->CMD = (USERMEMORY_USERFLASH_KEY | USERMEMORY_CMD_WRITE);//команда на запись байта + + if (waitUserFlashBusy(p) != 0){ + p->receivedCode = USERMEMORY_WRITE_TIMEOUT; + return; + } + } + NVRFLASH->STAT = 0x3;//сброс статуса + p->receivedCode = USERMEMORY_OP_OK;//все хорошо + p->PageRAM_and_FLASH_IdenticalFlag=1;//данные страницы в оперативке и во флеше теперь идентичны +} + + + +//! Читает страницу данных из флеша в кеш (в оперативку) + +//! \memberof TUserMemory +void USERMEMORY_ReadToCache(TUserMemory *p, int16 pageNum) +{ + int16 i = 0, readDataWord = 0; + Uint16 addrOffset = pageNum * USERMEMORY_PAGE_SIZE;//начальный адрес на флешке (от начала страницы) + Uint32 *arrayPointer; + for(i = 0; i < USERMEMORY_PAGE_SIZE; i += NUMBER_OF_BYTE_ON_PAGE){//цикл по размеру страницы + NVRFLASH->STAT = 0x3;//сброс статуса + NVRFLASH->ADDR = addrOffset + i;//адрес + NVRFLASH->CMD = (USERMEMORY_USERFLASH_KEY | USERMEMORY_CMD_READ);//команда на чтение байта + + + if (waitUserFlashBusy(p) != 0){ + p->receivedCode = USERMEMORY_READ_TIMEOUT; + return; + } + arrayPointer = (Uint32*)&(p->cacheArr[i]); + + // Считывается по 16 или 4 32-разрядных слова{ + for (readDataWord = 0; readDataWord < NUMBER_OF_32BIT_WORDS_AT_ONCE; readDataWord++){ + *arrayPointer = NVRFLASH->DATA[readDataWord].DATA;//данные (один байт) в оперативку + arrayPointer++; + } + + } + NVRFLASH->STAT = 0x3;//сброс статуса + p->receivedCode = USERMEMORY_OP_OK; + p->PageInCache=pageNum;//какая страница теперь в кеше + p->PageRAM_and_FLASH_IdenticalFlag=1;//данные в оперативке (в кеше) идентичны с флешем +} + + +//! Стереть всю флешку (будут FF) + +//! \memberof TUserMemory +void USERMEMORY_Full_Erase(TUserMemory *p){ + // Cброс статуса, команда стирания и ожидание завершения + NVRFLASH->STAT = 0x3; + NVRFLASH->CMD = (USERMEMORY_USERFLASH_KEY | USERMEMORY_CMD_FULL_ERASE);//команда на стирание фсей флеши + __NOP(); // В документации сказали подождать перед проверкой статуса + __NOP(); + __NOP(); + __NOP(); + __NOP(); + while(NVRFLASH->STAT_bit.BUSY == 0x1){}; + +} + + +//! Сбросить кеш из оперативки на флешку + +//! \memberof TUserMemory +void USERMEMORY_Flush(TUserMemory *p){ + USERMEMORY_WriteFromCache(p,p->PageInCache); +} + +//! Медленный фоновый постоянный расчет - нужен пока для систематического сброса кеша на флешку по времени + +//! \memberof TUserMemory +void USERMEMORY_slow_calc(TUserMemory *p){ + if (p->NeedFlushRequest){//надо флушить? + USERMEMORY_Flush(p); + p->NeedFlushRequest=0; + } +} + +//! Миллисекундный расчет - нужен пока для систематического сброса кеша на флешку по времени + +//! \memberof TUserMemory +void USERMEMORY_ms_calc(TUserMemory *p){ + + if (!p->PageRAM_and_FLASH_IdenticalFlag)//данные на флешке и в оперативке не идентичны + p->autoFlushCounter++; + + if (p->autoFlushCounter>10000) //зищита от переполнения + p->autoFlushCounter=10000; + + if (p->autoFlushCounter>500){//долго не сбрасывается на флешку + p->NeedFlushRequest=1;//надо флушить, но тут это делать нельзя, ибо прерывание, ставим реквест фону + p->autoFlushCounter=0; + } + +} + + + +/*@}*/ + diff --git a/Vsrc/V_adc.c b/Vsrc/V_adc.c new file mode 100644 index 0000000..dc365bc --- /dev/null +++ b/Vsrc/V_adc.c @@ -0,0 +1,212 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_adc.c + \brief Модуль обработки АЦП (см. TAdcDrv) MCB_028 + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 22/03/2019 + + \addtogroup V_adc + @{*/ + +/* Расписание каналов + * ADC13 Ia + * ADC19 Ic + * ADC1 Udc + * ADC31 0.75V + * ADC18 0.03V + * ADC20 Pot + * ADC15 AIN1 + * ADC27 AIN2 + * ADC29 TempSens + */ + +#include "main.h" + +//!Инициализация. + +//! Настраиваются секвенсоры и тип оцифровки данных. каналы для оцифровки, частота. +//! В данном случае оцифровка происходит по событию таймера,частота которого +//! равна частоте ШИМ, чтобы измерять ровно посередине периода ШИМ (требуется для шунтовых +//! датчиков тока) +//Запуск оцифровки производится по таймеру NT_PWM3, который синхронизирован с другими таймерами ШИМ. +//Оцифрованные измерения складываются в ФИФО. Каждый канал АЦП настроен на отдельный секвенсор с ФИФО длиной до 16 измерений. +//В прерывании с частотой 10 кГц данные забираются из ФИФО и складываются в кольцевые массивы (старые затираются новыми). +//В том же прерывании из кольцевого массива берется N последних точек и из них вычисляется среднее арифметическое. +//Число выборок для усреднения N зависит от частоты ШИМ и равна Fшим/10кГц. Если частоты ШИМ меньше 10 кГц, то берется одна выборка, если больше 40 кГц - 4 выборки. +//К вычисленному среднему значению добавляется калибровочный сдвиг, и оно умножается на коэффициент измерения, в результате получается окончательный результат измерения. + +//! \memberof TAdcDrv +void AdcDrv_init(TAdcDrv *p) { + PWM0->ETSEL_bit.SOCAEN = 1; + PWM0->ETSEL_bit.SOCASEL = ET_CTR_ZERO; + PWM0->ETPS_bit.SOCAPRD = 0; + + Uint32 AdcClock, AdcDiv, trash; + + // Сколько SYSCLKOUT тактов занимает период ШИМ + Uint32 pwmPrd = PWM0->TBPRD * (SystemCoreClock / APB0BusClock); + if (PWM0->TBCTL_bit.CTRMODE == TB_COUNT_UPDOWN) + pwmPrd = pwmPrd << 1; + + // Сколько SYSCLKOUT тактов занимает один такт АЦП (AdcDiv) + AdcDiv = 2 * (RCU->ADCCFG_bit.DIVN + 1); // Итого деление частоты + AdcClock = SystemCoreClock / AdcDiv; // Снимаем сброс + + //Инициализация ADC + ADC->ACTL[0].ACTL_bit.ADCEN = 0x1; // Разрешаем работу АЦП + ADC->ACTL[0].ACTL_bit.SELRES = ADC_ACTL_ACTL_SELRES_12bit; + ADC->ACTL[1].ACTL_bit.ADCEN = 0x1; // Разрешаем работу АЦП + ADC->ACTL[1].ACTL_bit.SELRES = ADC_ACTL_ACTL_SELRES_12bit; + ADC->ACTL[2].ACTL_bit.ADCEN = 0x1; // Разрешаем работу АЦП + ADC->ACTL[2].ACTL_bit.SELRES = ADC_ACTL_ACTL_SELRES_12bit; + ADC->ACTL[3].ACTL_bit.ADCEN = 0x1; // Разрешаем работу АЦП + ADC->ACTL[3].ACTL_bit.SELRES = ADC_ACTL_ACTL_SELRES_12bit; + + //Настройка секвенсора 0 + // CH0, CH1, CH2, CH3. + ADC->EMUX_bit.EM0 = ADC_EMUX_EM0_PWM012A; // Запуск от таймера + ADC->SEQSYNC = ADC_SEQSYNC_SYNC0_Msk; // Разрешить секвенсор SEQ0 + ADC->SEQ[0].SRQCTL_bit.RQMAX = 0x6; // Опрашивать 4 канала за раз = RQMAX + 1 + ADC->SEQ[0].SRQSEL0_bit.RQ0 = 13; // Какой вход АЦП когда опрашивается + ADC->SEQ[0].SRQSEL0_bit.RQ1 = 19; // --//-- + ADC->SEQ[0].SRQSEL0_bit.RQ2 = 1; // --//-- + ADC->SEQ[0].SRQSEL0_bit.RQ3 = 31; // --//-- + ADC->SEQ[0].SRQSEL1_bit.RQ4 = 18; // --//-- + ADC->SEQ[0].SRQSEL1_bit.RQ5 = 27; // --//-- + ADC->SEQ[0].SRQSEL1_bit.RQ6 = 29; // --//-- + ADC->SEQ[0].SCCTL_bit.RCNT = 3; // Делать ещё три перезапуска после первого запуска + ADC->SEQ[0].SRTMR_bit.VAL = pwmPrd / (ADC->SEQ[0].SCCTL_bit.RCNT + 1) / AdcDiv; // Пауза между пусками АЦП на период ШИМ в тактах ACLK + ADC->SEQ[0].SCCTL_bit.RAVGEN = 1; // Разрешить усреднять по 4 точкам + ADC->SEQEN_bit.SEQEN0 = 1; // Разрешить секвенсор 0 + ADC->SEQ[0].SCCTL_bit.ICNT = 6; // Вызов прерывания через каждые (ICNT + 1) записи в fifo + + // Очистка FIFO + while (ADC->SEQ[0].SFLOAD) + trash = ADC->SEQ[0].SFIFO; + + // Ждём, пока АЦП выставит флаг "ГОТОВ" (можно вставить этот цикл после "ADCEN = 1") + while (!ADC->ACTL[0].ACTL_bit.ADCRDY) {}; + while (!ADC->ACTL[1].ACTL_bit.ADCRDY) {}; + while (!ADC->ACTL[2].ACTL_bit.ADCRDY) {}; + while (!ADC->ACTL[3].ACTL_bit.ADCRDY) {}; + + // Разрешить прерывание от первого секвенсера + ADC->IM_bit.SEQIM0 = 1; + NVIC_EnableIRQ(ADC_SEQ0_IRQn); + NVIC_SetPriority(ADC_SEQ0_IRQn, IRQ_PRIORITY_ADC); +} + + +//!Расчет АЦП с частотой основного расчета всей системы управления (обычно 10кГц). + +//! Занимается обработкой измеренных АЦП значений и преобразует в формат IQ24. +//! Токи фаз для повышения точности усредняются за несколько измерений + +//! \memberof TAdcDrv + +void AdcDrv_fast_calc(TAdcDrv *p) { + Uint32 trash; + Uint16 pot, ain1, ain2, temper; + + // Если всё пошло хорошо, то в ФИФЕ будут уже усреднённые результаты - 4 штуки. + p->IA_temp = ADC->SEQ[0].SFIFO; + p->IC_temp = ADC->SEQ[0].SFIFO; + p->Udc_temp = ADC->SEQ[0].SFIFO; + pot = ADC->SEQ[0].SFIFO; + ain1 = ADC->SEQ[0].SFIFO; + ain2 = ADC->SEQ[0].SFIFO; + temper = ADC->SEQ[0].SFIFO; + + // Очистка FIFO на случай, если почему-то там оказалось больше чем надо значений (бывает после остановки житагом) + while (ADC->SEQ[0].SFLOAD) + trash = ADC->SEQ[0].SFIFO; + + // Преобразование + p->Imeas_a = p->IaGainNom * (((p->IA_temp<< 4) + p->Imeas_a_offset)); + p->Imeas_c = p->IcGainNom * (((p->IC_temp<< 4) + p->Imeas_c_offset)); + p->Udc_meas = p->UdcGainNom * (p->Udc_temp + p->Udc_meas_offset); + p->Imeas_b = -p->Imeas_a - p->Imeas_c; +} + +//!Медленный расчет. + +//!Занимается пересчетом коэффициентов, используемых в скоростной функции расчета, +//!чтобы не занимать процессорное время там. Находит коэффициенты, +//!на которые надо умножить полученное с АЦП значение, чтобы получить +//!относительные единицы с заданной базой. + +//! Пример p->PvalveGainNom=_IQ16mpy(p->Pvalve_gain,_IQ(1.0/100)); +//! Pvalve_gain - значение в формате int. задается пользователем в UniCON. +//!Определяет, скольким процентам соответствует полный диапазон АЦП. В простейшем случае +//!равен 100. Т.е. когда на АЦП максимальный сигнал, это соответствует 100%. + +//!_IQ(1.0/100) обратное значение для масштабирующего коэффициента. Так как величину процентов +//!естественнее всего перевести в относительные единицы так, что 100% соответствут 1.0, +//!то масштабирующий коэффициент (база) равен 100. Т.е. UniCON, прочитав из системы управления +//! число 1.0 в формате 8.24 должен умножить его на 100, чтобы отобразились проценты. +//! Здесь коэффициент задан явно как 1.0/100, но для ряда случаев базовое значение нужно менять. +//!Так, для токов фаз используется значение _1_I_nom, в формате 8.24, соответствующее единице деленной на +//базовое значение тока, например, 200 А. Так как в зависимости от мощности преобразователя базовый ток может меняться, +//то это значение, в отличие от процентов, сделано настраиваемым. Расчет _1_I_nom идет в другом месте, так как +//занимает много тактов расчета. + +//Для беззнакового значения АЦП измеряет число от 0 до 65535. (16 разрядов, где заполнены верхние). +//Для примера с процентами необходимо сделать так, чтобы получилось результирующее значение в формате 8.24, +//где 1.0 это 65535. Таким образом, нужно сдвинуть число 65535 на 24-16=8 разрядов. +//Сдвиг на 8 разрядов - это умножение на число 255. Число 255 - это 1.0 в формате 24.8. + +//Таким образом, PvalveGainNom - это коэффициент в формате 24.8. он получается в результате использования функции +//_IQ16mpy, аргумены которой Pvalve_gain (int) и 1.0/100 в формате 8.24. Функция IQ множения +//по сути представляет собой обычное оуможение в 64 разрядах со сдвигом результата вправо на Q разрядов. +//Т.е. _IQ16mpy умножает число в формате IQ24 9второй аргумент) на целочисленный коэффициент (первый аргумент), +//а потом сдвигате результат на 16 разрядов вправо. +//Так, в результате _IQ16mpy(p->Pvalve_gain,_IQ(1.0/100)); получается целочисленное число 255, являющейся +//1.0 в формате 24.8 из-за сдвига на 16 разрядов вправо. + +//Всё вышеприведенное мутево сделано с одной целью - увеличить производитлеьность обработки АЦП. + +//! \memberof TAdcDrv +void AdcDrv_slow_calc(TAdcDrv *p) { + // Пересчёт пауз между перезапусками + volatile Uint16 pwmPrd = PWM0->TBPRD * (SystemCoreClock / APB0BusClock); + + // Если считает вверх-вниз, то период на деле в два раза больше + if (PWM0->TBCTL_bit.CTRMODE == TB_COUNT_UPDOWN) + pwmPrd = pwmPrd << 1; + + // Делитель частоты АЦП + Uint16 AdcDiv = 2 * (RCU->ADCCFG_bit.DIVN + 1); + if (pwmPrd < 1000) pwmPrd = 1000; + + // Пауза между перезапускмами + // VAL = (Период ШИМ в тактах SysClkOut) / (Кол-во перезапусков) / (Делитель частоты АЦП) + ADC->SEQ[0].SRTMR_bit.VAL = pwmPrd / (ADC->SEQ[0].SCCTL_bit.RCNT + 1) / AdcDiv; + + p->IaGainNom = _IQ16mpy(p->Imeas_a_gain, drv_params._1_I_nom) << 1; + p->IbGainNom = _IQ16mpy(p->Imeas_b_gain, drv_params._1_I_nom) << 1; + p->IcGainNom = _IQ16mpy(p->Imeas_c_gain, drv_params._1_I_nom) << 1; + p->UdcGainNom = _IQ16mpy(p->Udc_meas_gain, drv_params._1_Udc_nom) << 4; +} + +//! Миллисекундный расчет + +//! \memberof TAdcDrv +void AdcDrv_ms_calc(TAdcDrv *p) { + +} + +/*@}*/ + diff --git a/Vsrc/V_bits_to_enum_numbers.c b/Vsrc/V_bits_to_enum_numbers.c new file mode 100644 index 0000000..b84efd3 --- /dev/null +++ b/Vsrc/V_bits_to_enum_numbers.c @@ -0,0 +1,72 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_bits_to_enum_numbers.c + \brief Модуль "листания" битовых переменных (см. TBitsToEnumNums) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup V_bits_to_enum_numbers */ +/*@{*/ + +#include "DSP.h" +#include "V_bits_to_enum_numbers.h" + +//! Преобразует битовые переменные в числа + +//!Требуется в основном для модуля защит или предупреждений, +//!для преобразования выставленных бит аварии в словах аварии в +//!порядковый номер этих бит и "листания" этих номеров с определенной +//!частотой, если выставлено несколько бит. Такое преобразование нужно для +//!удобства наблюдения аварий/предупреждений пользователем. +//!Вызывать необходимо с определенной дискретизацией (например, 10кГц). +//! \memberof TBitsToEnumNums +void BitsToEnumNums(TBitsToEnumNums* p) { + Uint16 i; + + p->counter++; + if (p->counter < p->out_refresh_devisor) + return; + p->counter = 0; + + //проверка правильности вызова + if ((p->num_of_words > NUM_OF_W_PTRS) || (p->num_of_words == 0)) + return; + + //перебираем биты в порядке возрастания + for (i = 0; i < (16 * p->num_of_words); i++) { + p->last_bit++; + if (p->last_bit > 15) { + p->last_bit = 0; + p->last_word++; + if (p->last_word > (p->num_of_words - 1)) + p->last_word = 0; + } + //делаем проверку бита + if ((*(p->w_ptrs[p->last_word])) & (0x1 << p->last_bit)) { + //битик имеется выводим результат + p->output = p->last_word * 16 + p->last_bit + 1; + return; + } + } + + //если дошли до сюда значит нет битиков, потому выдаем 0 + p->output = 0; +} + +/*@}*/ + diff --git a/Vsrc/V_data_log.c b/Vsrc/V_data_log.c new file mode 100644 index 0000000..909864f --- /dev/null +++ b/Vsrc/V_data_log.c @@ -0,0 +1,281 @@ +/*! + \file v_data_log.c + \brief 4-х канальный логгер длЯ осциллографированиЯ в реальном времени TDataLog (см. TDataLog) + + \author Коллектив ООО НПФ Вектор + \version v 2.01 18/09/2012 + */ + +/** \addtogroup v_data_log */ +/*@{*/ + +#include "DSP.h" +#include "co_ODvars.h" +#include "V_data_log.h" +#include "CANOpen_drv.h" + +//! Фоновый обработчик. + +/*! работает в фоне. Нужно длЯ установки адресов переменных через CAN. + если нет CAN, можно записать нужные адреса вручную в TDataLog.dlog_iptr */ +//! \memberof TDataLog +void dlog_background_analizer(TDataLog *p) { + //перевод длины предыстории из % в точки + p->trig_shift_int = (p->trig_shift&0xFFFFFF)>>16; //делаем количество точек + if (p->trig_shift_int > 255) //ограничим + p->trig_shift_int = 255; + + unsigned char mode; + + //если не стоит хоть один из первых шести бит control, + //то ничего анализировать и делать не надо + if (!(p->control & 0x3F)) + return; + //В любом случае перед всеми изменениЯми + //тормозим даталоггер. Иначе он может начать записывать данные по прерыванию, + //пока тут, в фоне, идет, скажем, запись адресов. + //И тогда в лучшем случае будет каша из данных, в худшем - останов контроллера + //при обращении по неправильному адресу. + p->mode_reset = 0; + p->valid_points_num = 0; //т.к. даталоггер останавливался (mode = 0), то предыстория неактуальна, т.к. + //1) за время стопа даталоггера между записанной предысторией и новыми данными будет разрыв по времени и + //2) выбранные записываемые переменные вообще могли смениться и предыстория останется от старых, а новые данные - от новых + //спрашиваем адреса у драйвера CANopen +#if DLOG_DATA_SIZE == 16 + if (p->control & 1) + if (!(p->dlog_iptr1 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind1))) //если адрес=0 + p->dlog_iptr1 = (type_data*)&p->ind_subind1; //пусть указывает на ind_subind + if (p->control & 2) + if (!(p->dlog_iptr2 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind2))) + p->dlog_iptr2 = (type_data*)&p->ind_subind2; + if (p->control & 4) + if (!(p->dlog_iptr3 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind3))) + p->dlog_iptr3 = (type_data*)&p->ind_subind3; + if (p->control & 8) + if (!(p->dlog_iptr4 = (type_data*)co_getAddr(p->pco_vars, p->ind_subind4))) + p->dlog_iptr4 = (type_data*)&p->ind_subind4; +#endif +#if DLOG_DATA_SIZE == 32 + if (p->control & 1) + { + if (co_getObjectInfo(p->pco_vars, p->ind_subind1, (TObjectInfo*)&p->object1Info) == 0) + { + p->object1Info.varAddr = (void*)(&p->ind_subind1); + p->object1Info.varSize = 32; + } + } + if (p->control & 2) + { + if (co_getObjectInfo(p->pco_vars, p->ind_subind2, (TObjectInfo*)&p->object2Info) == 0) + { + p->object2Info.varAddr = (void*)(&p->ind_subind2); + p->object2Info.varSize = 32; + } + } + if (p->control & 4) + { + if (co_getObjectInfo(p->pco_vars, p->ind_subind3, (TObjectInfo*)&p->object3Info) == 0) + { + p->object3Info.varAddr = (void*)(&p->ind_subind3); + p->object3Info.varSize = 32; + } + } + if (p->control & 8) + { + if (co_getObjectInfo(p->pco_vars, p->ind_subind4, (TObjectInfo*)&p->object4Info) == 0) + { + p->object4Info.varAddr = (void*)(&p->ind_subind4); + p->object4Info.varSize = 32; + } + } + p->highPartOfValue = 0; +#endif + p->WriteDelimiter = (p->control >> 16) & 0xFF; //прореживание. ОграничиваетсЯ 8ю битами + mode = (p->control >> 4) & 3; //режим - 2 бита + p->control = 0; //все обработали, обнулЯем, чтобы при след. вызове не начать обрабатывать снова + dlog_set_mode(mode, p); //длЯ установки режима вызываетсЯ спец. функциЯ. НапрЯмую нельзЯ + +} + +//! функциЯ длЯ установки mode_reset. + +//! предполагаетсЯ длЯ управлениЯ логгером из других модулей +//! проверЯет mode_reset на валидность и обнулЯет счетчики +//! \memberof TDataLog + +void dlog_set_mode(Uint16 mode_reset, TDataLog *p) { + if (mode_reset > 3) + return; + //в 1 переводим только если текущий режим 2, чтоб синхронизироватьсЯ + //по первому событию (очень полезно когда событий много) + if (p->OneShotOperation == 1) { + if ((mode_reset == 1)) { + if (p->mode_reset == 2) + p->mode_reset = mode_reset; + else + return; + } + } else + p->mode_reset = mode_reset; + + if (mode_reset == 3) //Хотим перейти в режим однократной записи 1024 точек. + p->Wcounter = 0; //в этом режиме нужно писать с первой точки первого массива. Сбрасываем счетчик. + + + //при смене режима в любом случае сбрасываем флаг "данные готовы" + p->control &= ~(1 << 6); + p->WriteDelimiterCounter = 0; +#if DLOG_DATA_SIZE == 32 + p->highPartOfValue = 0; +#endif +} + +//! Записывает очередные точки в массивы осциллограммы. + +//!Должна вызыватьсЯ с заданной дискретизацией и занимаетсЯ записью массивов, +//! т.е. непосредственно осциллографированием. Умеет записывать данные +//! в массивы по-разному в зависимости от выбранного режима работы осциллографа +//! \memberof TDataLog + +void data_log_update(TDataLog *p) { +//везде испоьзуетсЯ p-> , а не p* - так быстрее + +//прореживание данных. Если не достигли уставки WriteDelimiter, выходим +//WriteDelimiter=1 - не делим +//WriteDelimiter=2 - берем каждую вторую + if ((p->WriteDelimiterCounter++ + 1) < p->WriteDelimiter) + return; + else + p->WriteDelimiterCounter = 0; + + if (p->mode_reset != p->mode_reset_prev) p->E=1; + else p->E=0; + p->mode_reset_prev = p->mode_reset; + + switch (p->mode_reset) { + case 0: { + p->Wcounter = 0; + return; + } + + case 1: //однократнаЯ запись - дошли до конца и стоп (режим 0) + { + //При входе в режим получаем точку срабатывания триггера (это текущий Wcounter, с которым мы сюда зашли) и рассчитываем первую точку, относящуюся к данной осце (исходя из текущей точки и заданной длины предыстории) + if (p->E==1) + { + p->prehistory_length = p->valid_points_num; //длина предыстории равна количеству валидных точек + if (p->prehistory_length > p->trig_shift_int) //если предыстория длиннее заданного, ограничим + p->prehistory_length = p->trig_shift_int; +#if DLOG_DATA_SIZE == 16 + p->Wcounter &= 0xFE; + p->prehistory_length &= 0xFE; + p->first_point_written = (p->Wcounter - p->prehistory_length) & 0xFE; +#endif +#if DLOG_DATA_SIZE == 32 + p->first_point_written = (p->Wcounter - p->prehistory_length) & 0xFF; + p->highPartOfValue = 0; +#endif + } + p->Wcounter &= 0xFF; //защита - если вдруг в counter не валидное значение +#if DLOG_DATA_SIZE == 16 + p->dl_buffer1_adr[p->Wcounter] = *p->dlog_iptr1; + p->dl_buffer2_adr[p->Wcounter] = *p->dlog_iptr2; + p->dl_buffer3_adr[p->Wcounter] = *p->dlog_iptr3; + p->dl_buffer4_adr[p->Wcounter] = *p->dlog_iptr4; +#endif +#if DLOG_DATA_SIZE == 32 + p->dl_buffer1_adr[p->Wcounter] = p->object1Info.varSize == 16 ? + *((int16*)p->object1Info.varAddr) : *((int32*)p->object1Info.varAddr); + p->dl_buffer2_adr[p->Wcounter] = p->object2Info.varSize == 16 ? + *((int16*)p->object2Info.varAddr) : *((int32*)p->object2Info.varAddr); + p->dl_buffer3_adr[p->Wcounter] = p->object3Info.varSize == 16 ? + *((int16*)p->object3Info.varAddr) : *((int32*)p->object3Info.varAddr); + p->dl_buffer4_adr[p->Wcounter] = p->object4Info.varSize == 16 ? + *((int16*)p->object4Info.varAddr) : *((int32*)p->object4Info.varAddr); +#endif + p->Wcounter++; + p->Wcounter &= 0xFF; //если прошли 256 точек, обнулитсЯ + if (p->Wcounter == p->first_point_written) //если дошли до последней записываемой точки + { + p->mode_reset = 0; //режим СТОП + + #if DLOG_DATA_SIZE == 16 + p->control |= 192; // "данные готовы" + "поддерживается блочная передача" + #else + p->control |= 192 | (1 << 8); // "данные готовы" + "поддерживается блочная передача" + "32-битные данные" + #endif + + } + return; + } + + case 2: //записываем лог по кругу + { + if (p->E == 1) + { +#if DLOG_DATA_SIZE == 32 + p->highPartOfValue = 0; +#endif + } + p->valid_points_num++; //считаем количество записанных валидных точек предыстории + if (p->valid_points_num > 256) //ограничиваем + p->valid_points_num = 256; + p->Wcounter &= 0xFF; //защита - если вдруг в counter не валидное значение +#if DLOG_DATA_SIZE == 16 + p->dl_buffer1_adr[p->Wcounter] = *p->dlog_iptr1; + p->dl_buffer2_adr[p->Wcounter] = *p->dlog_iptr2; + p->dl_buffer3_adr[p->Wcounter] = *p->dlog_iptr3; + p->dl_buffer4_adr[p->Wcounter] = *p->dlog_iptr4; +#endif +#if DLOG_DATA_SIZE == 32 + p->dl_buffer1_adr[p->Wcounter] = p->object1Info.varSize == 16 ? + *((int16*)p->object1Info.varAddr) : *((int32*)p->object1Info.varAddr); + p->dl_buffer2_adr[p->Wcounter] = p->object2Info.varSize == 16 ? + *((int16*)p->object2Info.varAddr) : *((int32*)p->object2Info.varAddr); + p->dl_buffer3_adr[p->Wcounter] = p->object3Info.varSize == 16 ? + *((int16*)p->object3Info.varAddr) : *((int32*)p->object3Info.varAddr); + p->dl_buffer4_adr[p->Wcounter] = p->object4Info.varSize == 16 ? + *((int16*)p->object4Info.varAddr) : *((int32*)p->object4Info.varAddr); +#endif + p->Wcounter++; + p->Wcounter &= 0xFF; //если прошли 256 точек, обнулитсЯ + return; + } + + case 3: //режим однократной записи 1024 точек + { + if (p->E==1) + { + p->first_point_written = 0; //пишем с первой точки, предыстория не нужна. +#if DLOG_DATA_SIZE == 32 + p->highPartOfValue = 0; +#endif + } + //с учетом того, что буферы в памЯти расположены последовательно, + //записываем в первый, "заезжаЯ" на остальные три +#if DLOG_DATA_SIZE == 16 + p->dl_buffer1_adr[p->Wcounter] = *p->dlog_iptr1; +#endif +#if DLOG_DATA_SIZE == 32 + p->dl_buffer1_adr[p->Wcounter] = p->object1Info.varSize == 16 ? + *((int16*)p->object1Info.varAddr) : *((int32*)p->object1Info.varAddr); +#endif + p->Wcounter++; + if (p->Wcounter >= 1024) //если дошли до конца + { + p->mode_reset = 0; //режим СТОП + + #if DLOG_DATA_SIZE == 16 + p->control |= 192; // "данные готовы" + "поддерживается блочная передача" + #else + p->control |= 192 | (1 << 8); // "данные готовы" + "поддерживается блочная передача" + "32-битные данные" + #endif + + } + return; + } + } +} + +/*@}*/ + diff --git a/Vsrc/V_event_log.c b/Vsrc/V_event_log.c new file mode 100644 index 0000000..37f3c0d --- /dev/null +++ b/Vsrc/V_event_log.c @@ -0,0 +1,252 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_event_log.c + \brief Сохранение событий и времени возникновениЯ в ЭнОЗУ + ИспользуетсЯ драйвер работы с энергонезависимой памЯтью + Поэтому вызов init(); должен быть после инициализации ЭнОЗУ + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 2009_01_20 + +*/ + +/** \addtogroup W_event_log */ +/*@{*/ +#ifdef __cplusplus +extern "C" { +#endif + +#include + + + //!<Протоколирование аварий + +//Процедуры записи событий в энергонезависимую флешку очень долгие (связано с таймингами I2C-интерфейса +//и большим объемом данных, передаваемым по I2C в процессе записи). +//Поэтому алгоритм работы такой: +//Если нужно прочитать аварию [Logger_Event_Read] (срочно считывать аварию из банка не требуется) - +//она читается в фоновом цикле прямиком из ЭнОЗУ. +//Если нужно записать аварию в банк [Logger_Event_Write] - в прерывании (например, 1мс) данные аварии пишутся в FIFO; +//затем в фоновом цикле [Logger_Background_Calc] аварии читаются из FIFO [Event_FIFO_Read] +//(по одно за 1 фоновый цикл) и пишутся в ЭнОЗУ. + + +//прочитать событие из FIFO (для дальнейшей записи в ЭнОЗУ). +Uint16 Event_FIFO_Read(TEventFIFO* p,TEvent* ev) +{ + if (p->busy_flag > 0) return EVENT_FIFO_BUSY; + //выставлЯем флажок работы с FIFO + p->busy_flag = 1; + if (p->number_of_msgs == 0) + { + //освобождаем флаг работы с FIFO + p->busy_flag = 0; + return EVENT_FIFO_EMPTY; + } + //читаем данные из FIFO + ev->ev_code = p->msg_array[(p->read_ptr)].ev_code; + ev->ev_time = p->msg_array[(p->read_ptr)].ev_time; + ev->ev_num = p->msg_array[(p->read_ptr)].ev_num; + //подготовка FIFO к следующему вызову + p->read_ptr++; + if (p->read_ptr >= p->size) p->read_ptr = 0; + p->number_of_msgs--; + //освобождаем флаг работы с FIFO + p->busy_flag = 0; + return EVENT_FIFO_SUCCESSFUL; +} + + + +//Записать событие в FIFO (вызывается в Logger_Event_Write, в прерывании) +Uint16 Event_FIFO_Write(TEventFIFO* p,TEvent* ev) +{ + if (p->busy_flag > 0) return EVENT_FIFO_BUSY; + //выставлЯем флажок работы с FIFO + p->busy_flag = 1; + if (p->number_of_msgs == p->size) + { + //освобождаем флаг работы с FIFO + p->busy_flag = 0; + return EVENT_FIFO_FULL; + } + //записываем данные в FIFO + p->msg_array[(p->write_ptr)].ev_code = ev->ev_code; + p->msg_array[(p->write_ptr)].ev_time = ev->ev_time; + p->msg_array[(p->write_ptr)].ev_num = ev->ev_num; + //подготовка FIFO к следующему вызову + p->write_ptr++; + if (p->write_ptr >= p->size)p->write_ptr = 0; + p->number_of_msgs++; + //освобождаем флаг работы с FIFO + p->busy_flag = 0; + return EVENT_FIFO_SUCCESSFUL; +} + +//инициализация (если банк забит мусором - все данные FFFF, очищаем его) +void Logger_Init(TLogger* p,Uint16 BS,Uint16 SA,Uint32* tptr) +{ + TEvent tmp; + Uint16 i; + Uint16 last_log_num = 0; + Uint16 last_log_index = 0; + //инициализируем внутренние переменные + p->SPI_buf_size = BS; + p->SPI_start_addr = SA; + p->time_ptr = tptr; + + //далее нужно просканировать буфер в ЭнОЗУ - найти последнюю + UserMem.MemStartAddr = p->SPI_start_addr; + UserMem.data_length = 0; + for (i=0;iSPI_buf_size;i++) + { + //читаем номер + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&tmp.ev_num); + UserMem.data_length = LOG_NUM_LENGTH; + UserMem.read(&UserMem); + //читаем времЯ + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&tmp.ev_time); + UserMem.data_length = LOG_TIME_LENGTH; + UserMem.read(&UserMem); + //читаем код + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&tmp.ev_code); + UserMem.data_length = LOG_CODE_LENGTH; + UserMem.read(&UserMem); + + //делаем необходимые проверки + //если все полЯ 0xFFFF, то чистим всю памЯть + if ((tmp.ev_num == 0xFFFF) && (tmp.ev_time == 0xFFFFFFFF) && (tmp.ev_code == 0xFFFF)) + { + //чистим + p->clear(p); + //инициализируем переменные + p->INTERNAL_last_log_num = 0; + p->INTERNAL_last_log_index = 0; + return; + } + //ищем последнюю запись + if (last_log_num < tmp.ev_num) + { + last_log_num = tmp.ev_num; + last_log_index = i; + } + } + p->INTERNAL_last_log_num = last_log_num; + p->INTERNAL_last_log_index = last_log_index; +} + +//функциЯ очистки буфера в ЭнОЗУ +void Logger_Clear(TLogger* p) +{ + Uint16 zero = 0; + UserMem.MemStartAddr = p->SPI_start_addr; + UserMem.MCUStartAddr = (Uint16*)(&zero); + UserMem.data_length = 1; + for (int i=0;i<(p->SPI_buf_size * (LOG_LENGTH));i++) + { + UserMem.write(&UserMem); + UserMem.MemStartAddr++; + } + p->INTERNAL_last_log_index = 0; + p->INTERNAL_last_log_num = 0; +} + + +//быстраЯ функциЯ записи событиЯ в FIFO +Uint16 Logger_Event_Write(TLogger* p,Uint16 code) +{ + TEvent event; + //формируем данные + __disable_irq(); + event.ev_time = *(p->time_ptr); + event.ev_code = code; + event.ev_num = ++p->INTERNAL_last_log_num; + p->INTERNAL_last_log_code = code; + __enable_irq(); + //пишем в FIFO + return p->FIFO.write((TEventFIFO*)&(p->FIFO),&event); +} + +//прочитать аварию из банка, сложить данные в TEvent* event +void Logger_Event_Read(TLogger* p,Uint16 shift_index,TEvent* event) +{ + Uint16 correction = 0; + //проверЯем правильность запроса + if (shift_index > (p->SPI_buf_size - 1)) return; + + //ввод коррекции длЯ организации кольца + if (((int16)p->INTERNAL_last_log_index - (int16)shift_index) < 0) correction = p->SPI_buf_size; + //чтение номера + UserMem.MemStartAddr = p->SPI_start_addr + ((p->INTERNAL_last_log_index - shift_index + correction)*(LOG_LENGTH)); + UserMem.MCUStartAddr = (Uint16*)(&(event->ev_num)); + UserMem.data_length = LOG_NUM_LENGTH; + UserMem.read(&UserMem); + //чтение времени + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&(event->ev_time)); + UserMem.data_length = LOG_TIME_LENGTH; + UserMem.read(&UserMem); + //чтение кода + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&(event->ev_code)); + UserMem.data_length = LOG_CODE_LENGTH; + UserMem.read(&UserMem); +} + +//функциЯ обработки FIFO и записи аварий в ЭнОЗУ. Если в FIFO что-то клали - запишем во флешку. +//Если FIFO занята или пустая - отдыхаем. +void Logger_Background_Calc(TLogger* p) +{ + Uint16 ret; + TEvent event; + //чтобы не сильно затормаживать фоновый цикл будем записывать по 1 записи за раз + ret = p->FIFO.read((TEventFIFO*)&(p->FIFO),&event); + if (ret == EVENT_FIFO_SUCCESSFUL) + { + //пишем в ЭнОЗУ + if (p->INTERNAL_last_log_index >= (p->SPI_buf_size - 1)) p->INTERNAL_last_log_index = 0; + else p->INTERNAL_last_log_index++; + + //запись номера + UserMem.MemStartAddr = p->SPI_start_addr + (p->INTERNAL_last_log_index)*(LOG_LENGTH); + UserMem.MCUStartAddr = (Uint16*)(&(event.ev_num)); + UserMem.data_length = LOG_NUM_LENGTH; + UserMem.write(&UserMem); + //запись времени + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&(event.ev_time)); + UserMem.data_length = LOG_TIME_LENGTH; + UserMem.write(&UserMem); + //запись кода + UserMem.MemStartAddr += UserMem.data_length; + UserMem.MCUStartAddr = (Uint16*)(&(event.ev_code)); + UserMem.data_length = LOG_CODE_LENGTH; + UserMem.write(&UserMem); + } +} + +//функция проверки и записи висящих в данный момент флагов аварий +//Последовательно смотрится каждый бит слов аварий и, если он взведен, но еще не записан, производится запись. +void Logger_ms_Calc(TLogger* p){ + +} + +#ifdef __cplusplus +} // Extern "C" +#endif +/*@}*/ diff --git a/Vsrc/V_excitation.c b/Vsrc/V_excitation.c new file mode 100644 index 0000000..8dbae07 --- /dev/null +++ b/Vsrc/V_excitation.c @@ -0,0 +1,50 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_excitation.c + \brief Модуль возбудителя + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 28/03/2017 + + \addtogroup V_excitation + @{*/ + +#include "V_IQmath.h" // Include header for IQmath library +#include "V_excitation.h" +#include "main.h" +//! Функция расчета релейного регулятора + +//! \memberof TRelayReg +void excitation_calc(Texcitation *v) +{ + //Обмотка возбуждения СД + //в модуле ШИМ только 3 канала. Поэтому для модели СД с обмоткой возбуждения посчитаем скважность тут. + volatile int32 GammaF; + if (v->ref < _IQ(0)) + v->ref = _IQ(0); + + if (v->ref > _IQ(1)) + v->ref = _IQ(1); + + GammaF = v->ref >> 8; // (IQ16) переводим то, что выше, в iq16. + GammaF = _IQ16mpy(GammaF, _IQ16(pwm.k_pwm)); // (IQ16) переводим скважность в величину для загрузки в регистр сравнения. + GammaF = pwm.k_pwm - (GammaF >> 16); // (IQ0) Загружем целую часть в регистр сравнения. + +#if defined(HW_VECTORCARD_SIMULATOR) || defined(HW_NIIET_BOARD_SIMULATOR) + model.cmpr3 = (Uint16) GammaF; +#endif +} + +/*@}*/ diff --git a/Vsrc/V_hzprof.c b/Vsrc/V_hzprof.c new file mode 100644 index 0000000..43fcf31 --- /dev/null +++ b/Vsrc/V_hzprof.c @@ -0,0 +1,53 @@ +/*! + Copyright 2017 Texas Instruments, АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_hzprof.c + \brief Кривая U(f) (см. TVhzProf) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup vhzprof + */ + +#include "V_IQmath.h" /* Include header for IQmath library */ +#include "V_hzprof.h" +#include + +//! Функция расчета кривой U(f) + +//!На вход принимает частоту freq, и исходя из настроенных значений +//!минимального напряжения на минимальной частоте и максимального +//!напряжения на максимальной частоте, выдает vout - напряжение +//!для частоты freq. Другими словами, модуль представляет собой +//!линейный интерполятор по двум реперным точкам с ограничением максимума и +//!минимума. + +//! \memberof TVhzProf +void vhz_prof_calc(TVhzProf *v) { + _iq vf_slope, freq_abs; + + freq_abs = labs(v->freq); + + if (freq_abs <= v->FL) + v->vout = v->Vmin; /* Profile #1 */ + else if ((freq_abs > v->FL) & (freq_abs <= v->FH)) { + vf_slope = _IQdiv((v->Vmax - v->Vmin), (v->FH - v->FL)); /* Computing v/f slope */ + v->vout = v->Vmin + _IQmpy(vf_slope, (freq_abs - v->FL)); /* Profile #2 */ + } else if ((freq_abs > v->FH) & (freq_abs < v->Fmax)) + v->vout = v->Vmax; /* Profile #3 */ +} + +/*@}*/ + diff --git a/Vsrc/V_led.c b/Vsrc/V_led.c new file mode 100644 index 0000000..672b063 --- /dev/null +++ b/Vsrc/V_led.c @@ -0,0 +1,79 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file Vled.c + \brief Управление светодиодами + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup led + */ + +#include "DSP.h" +#include "main.h" + +#define RUN_LED_TOGGLE GPIOK->DATAOUTTGL = 1 << 15 +#define RUN_LED_OFF GPIOK->DATAOUTSET = 1 << 15 +#define RUN_LED_ON GPIOK->DATAOUTCLR = 1 << 15 + +#define FAULT_LED_TOGGLE GPIOK->DATAOUTTGL = 1 << 14 +#define FAULT_LED_OFF GPIOK->DATAOUTSET = 1 << 14 +#define FAULT_LED_ON GPIOK->DATAOUTCLR = 1 << 14 + +void LED_init(Tled *p) { + // В src/GpioPeripheralInit() +} + + +// Один диод мигает медленно в стопе и быстро в ране +// Другой мигает если авария и не мигает если не аварий +void LED_msCalc(Tled *p) { + // Таймера считают себе и считают + p->timerRunLed++; + p->timerFaultLed++; + + // В зависимости от статуса привода выставляем периоды миганий + if (drv_status.bit.running == 0) p->prdRunLed = 1000; + else p->prdRunLed = 200; + + if (drv_status.bit.fault == 0) p->prdFaultLed = 0; + else p->prdFaultLed = 200; + + // Если период ноль - не мигать вообще, иначе - переключать по периоду + if (p->prdFaultLed == 0) FAULT_LED_OFF; + else if (p->timerFaultLed >= p->prdFaultLed) { + p->timerFaultLed = 0; + FAULT_LED_TOGGLE; + } + + if (p->prdRunLed == 0) RUN_LED_OFF; + else if (p->timerRunLed >= p->prdRunLed) { + p->timerRunLed = 0; + RUN_LED_TOGGLE; + } + +} + + + + + + + + + + + + diff --git a/Vsrc/V_pid_reg3.c b/Vsrc/V_pid_reg3.c new file mode 100644 index 0000000..1cd9d4f --- /dev/null +++ b/Vsrc/V_pid_reg3.c @@ -0,0 +1,111 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_pid_reg3.c + \brief ПИД-регулятор (см. TPidReg3) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup V_pid_reg3 + @{*/ + +#include "V_IQmath.h" // Include header for IQmath library +#include "V_pid_reg3.h" +#include "stdlib.h" +#include "main.h" +//! Функция расчета ПИД регулятора +//! Вообще это чуть доработанная версия тексасовского регулятора +//! Документацию этой магии лучше всего посмотреть, загуглив pid_reg3.pdf + +//! На входе pid_ref_reg3 - задание, pid_fdb_reg3 - обратная связь +//! На выходе pid_out_reg3. + +//! \memberof TPidReg3 +void pid_reg3_calc(TPidReg3 *v) { + v->e_reg3 = v->pid_ref_reg3 - v->pid_fdb_reg3;//ошибка - задание минус обратная связь + v->e_reg3Dz=v->e_reg3;//ошибка после коррекции блока мертвой зоны + + if (v->DeadZone!=0){//если есть уставка зоны нечувствительности + if (v->e_reg3Dz>0){//ошибка в плюс + v->e_reg3Dz=v->e_reg3Dz-v->DeadZone;//вычитаем мертвую зону + if (v->e_reg3Dz<0)//но так, чтобы ошибка не стала отрицательной + v->e_reg3Dz=0; + } + if (v->e_reg3Dz<0){ + v->e_reg3Dz=v->e_reg3Dz+v->DeadZone; + if (v->e_reg3Dz>0) + v->e_reg3Dz=0; + } + } + + v->up_reg3 = _IQmpy(v->Kp_reg3, v->e_reg3Dz); + + v->uprsat_reg3 = v->up_reg3 + v->ui_reg3 + v->ud_reg3; + + if (v->uprsat_reg3 > v->pid_out_max) + v->pid_out_reg3 = v->pid_out_max; + else if (v->uprsat_reg3 < v->pid_out_min) + v->pid_out_reg3 = v->pid_out_min; + else + v->pid_out_reg3 = v->uprsat_reg3; + + v->saterr_reg3 = v->pid_out_reg3 - v->uprsat_reg3 + v->saterr_reg3Add; + + //использовать ли фильтр для дифф. части. Если кфильтра ноль, то нет. + if (v->Kf_d == 0){ + v->e_reg3_filterOut = v->e_reg3;//выход фильтра + } + else{//иначе считаем фильтр + v->e_reg3_filterOut = v->e_reg3_filterOut + + _IQmpy(v->Kf_d, (v->e_reg3 - v->e_reg3_filterOut)); + } + + if ((v->DiffCounter++ + 1) >= v->DiffDelim) {//каждые сколько вызовов считать дифф. часть + if (v->KdFilterInitFlag==1){//это первый такт расчета регулятора + v->e_reg3_filterOut = v->e_reg3;//выход фильтра ошибки инициализируем ошибкой + v->up1_reg3 = v->e_reg3_filterOut;//производная ноль + v->KdFilterInitFlag=0;//инициализация завершена + } + v->ud_reg3 = _IQmpy(v->Kd_reg3, (v->e_reg3_filterOut - v->up1_reg3)<<6);//дифференциальная часть + v->up1_reg3 = v->e_reg3_filterOut; + v->DiffCounter = 0; + } + + if (v->Ki_reg3 != 0)//есть интегральная составляющая + v->ui_reg3 = v->ui_reg3 + + _IQmpy(v->Ki_reg3, + v->up_reg3) + _IQmpy(v->Kc_reg3,v->saterr_reg3); + else + v->ui_reg3 = 0; + + if (v->Kc_reg3 == 0) { + if (v->ui_reg3 > v->pid_out_max) + v->ui_reg3 = v->pid_out_max; + else if (v->ui_reg3 < v->pid_out_min) + v->ui_reg3 = v->pid_out_min; + } + +} + + +//! \memberof TPidReg3 +void pid_reg3_reset(TPidReg3 *v) { + v->pid_fdb_reg3=0; + v->pid_ref_reg3=0; + v->ui_reg3=0; + v->KdFilterInitFlag=1; +} + +/*@}*/ diff --git a/Vsrc/V_pid_reg3_pos.c b/Vsrc/V_pid_reg3_pos.c new file mode 100644 index 0000000..64060e0 --- /dev/null +++ b/Vsrc/V_pid_reg3_pos.c @@ -0,0 +1,109 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_pid_reg3.c + \brief ПИД-регулятор (см. TPidReg3) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup V_pid_reg3 + @{*/ + +#include "V_IQmath.h" // Include header for IQmath library +#include "V_pid_reg3_pos.h" +#include "stdlib.h" +#include "main.h" +//! Функция расчета ПИД регулятора +//! Вообще это чуть доработанная версия тексасовского регулятора +//! Документацию этой магии лучше всего посмотреть, загуглив pid_reg3.pdf + +//! На входе pid_ref_reg3 - задание, pid_fdb_reg3 - обратная связь +//! На выходе pid_out_reg3. + +//! \memberof TPidReg3 +void pid_reg3_calc_pos(TPidReg3_pos *v) { + v->e_reg3 = v->pid_ref_reg3 - v->pid_fdb_reg3;//ошибка - задание минус обратная связь + v->e_reg3Dz=v->e_reg3;//ошибка после коррекции блока мертвой зоны + + if (v->DeadZone!=0){//если есть уставка зоны нечувствительности + if (v->e_reg3Dz>0){//ошибка в плюс + v->e_reg3Dz=v->e_reg3Dz-v->DeadZone;//вычитаем мертвую зону + if (v->e_reg3Dz<0)//но так, чтобы ошибка не стала отрицательной + v->e_reg3Dz=0; + } + if (v->e_reg3Dz<0){ + v->e_reg3Dz=v->e_reg3Dz+v->DeadZone; + if (v->e_reg3Dz>0) + v->e_reg3Dz=0; + } + } + + v->up_reg3 = _IQmpy(v->Kp_reg3, v->e_reg3Dz); + + v->uprsat_reg3 = v->up_reg3 + v->ui_reg3 + v->ud_reg3; + + if (v->uprsat_reg3 > v->pid_out_max) + v->pid_out_reg3 = v->pid_out_max; + else if (v->uprsat_reg3 < v->pid_out_min) + v->pid_out_reg3 = v->pid_out_min; + else + v->pid_out_reg3 = v->uprsat_reg3; + + v->saterr_reg3 = v->pid_out_reg3 - v->uprsat_reg3 + v->saterr_reg3Add; + + //использовать ли фильтр для дифф. части. Если кфильтра ноль, то нет. + if (v->Kf_d == 0){ + v->e_reg3_filterOut = v->e_reg3;//выход фильтра + } + else{//иначе считаем фильтр + v->e_reg3_filterOut = posspeedEqep.speed_elec; + } + + if ((v->DiffCounter++ + 1) >= v->DiffDelim) {//каждые сколько вызовов считать дифф. часть + if (v->KdFilterInitFlag==1){//это первый такт расчета регулятора + v->e_reg3_filterOut = posspeedEqep.speed_elec;//выход фильтра ошибки инициализируем ошибкой + v->KdFilterInitFlag=0;//инициализация завершена + } + //v->ud_reg3 = _IQmpy(v->Kd_reg3, (v->e_reg3_filterOut - v->up1_reg3)<<6);//дифференциальная часть + v->ud_reg3 = _IQmpy(v->Kd_reg3,-posspeedEqep.speed_filter.output); + v->DiffCounter = 0; + } + + if (v->Ki_reg3 != 0)//есть интегральная составляющая + v->ui_reg3 = v->ui_reg3 + + _IQmpy(v->Ki_reg3, + v->up_reg3) + _IQmpy(v->Kc_reg3,v->saterr_reg3); + else + v->ui_reg3 = 0; + + if (v->Kc_reg3 == 0) { + if (v->ui_reg3 > v->pid_out_max) + v->ui_reg3 = v->pid_out_max; + else if (v->ui_reg3 < v->pid_out_min) + v->ui_reg3 = v->pid_out_min; + } + +} + + +//! \memberof TPidReg3 +void pid_reg3_reset_pos(TPidReg3_pos *v) { + v->pid_fdb_reg3=0; + v->pid_ref_reg3=0; + v->ui_reg3=0; + v->KdFilterInitFlag=1; +} + +/*@}*/ diff --git a/Vsrc/V_relay_reg.c b/Vsrc/V_relay_reg.c new file mode 100644 index 0000000..07ec3fb --- /dev/null +++ b/Vsrc/V_relay_reg.c @@ -0,0 +1,37 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file V_relay_reg.c + \brief Релейный регулятор + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 23/01/2016 + + \addtogroup V_realy_reg + @{*/ + +#include "V_IQmath.h" // Include header for IQmath library +#include "V_relay_reg.h" +//! Функция расчета релейного регулятора + +//! \memberof TRelayReg +void relay_reg_calc(TRelayReg *v) +{ + if (v->ref < v->fdb) + v->out = _IQ(-1.0); + else + v->out = _IQ(1.0); +} + +/*@}*/ diff --git a/Vsrc/V_rmp_ctrl.c b/Vsrc/V_rmp_ctrl.c new file mode 100644 index 0000000..07cc753 --- /dev/null +++ b/Vsrc/V_rmp_ctrl.c @@ -0,0 +1,71 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_rmp_ctrl.c + \brief Задатчик интенсивности (см. TRMPCtrl) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup V_rmp_ctrl */ +/*@{*/ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "v_rmp_ctrl.h" +#include "V_IQmath.h" +#include "stdlib.h" +#ifdef __cplusplus +} +#endif + +//! Функция расчета задатчика интенсивности + +//!Изменяет output с заданным темпом T, +//!пока output не достигнет input. + +//! \memberof TRMPCtrl +void V_RMP_CTRL_calc(TRMPCtrl *p) { + + if ((labs(p->output - p->input) <= p->step) || (p->T==0)) //вошли в задание с точность до шага или ЗИ вообще отключен + { + p->output = p->input; //выход равен входу + } + else if (p->output < p->input) //иначе выход меньше входа? + { + p->output += p->step; //увелчичиваем с заданным темпом выход + } + else //иначе + { + p->output -= p->step; //уменьшаем с заданным темпом выход + } + +} + +//! Вспомогательная функция задатчика интенсивности + +//!Пересчитывает темп разгона T в шаг step c учетом частоты +//!вызова основной функции Ts (дискретизация, обычно 10кГц). + +//! \memberof TRMPCtrl +void V_RMP_CTRL_slow_calc(TRMPCtrl *p) { + p->step = _IQdiv(p->Ts, p->T);//шаг интегратора ЗИ +} + +/*@}*/ + diff --git a/Vsrc/V_rotor_observer.c b/Vsrc/V_rotor_observer.c new file mode 100644 index 0000000..64d211d --- /dev/null +++ b/Vsrc/V_rotor_observer.c @@ -0,0 +1,47 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file v_rotor_observer.c + \brief Наблюдатель ротора АД (см. TRotorObserver) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 28/06/2016 + + */ + +/** \addtogroup TRotorObserver */ +/*@{*/ + + +#include "main.h" + +#ifdef __cplusplus +#pragma CODE_SECTION("secureRamFuncs") +#else +#pragma CODE_SECTION(RotorObserver_calc,"secureRamFuncs"); +#endif + +void RotorObserver_calc(TRotorObserver *p) { + //инерционное звено с параметрами ротора + p->psi_d = p->psi_d + _IQmpy(p->Ks,p->id - p->psi_d); + p->psi_q = p->psi_q + _IQmpy(p->Ks,p->iq - p->psi_q); + p->theta_psi_elec = tmu.atan2(p->psi_q ,p->psi_d); +} + +void RotorObserver_slow_calc(TRotorObserver *p) { + p->Ks=_IQdiv(FAST_CALC_TS,p->Tr); +} + +/*@}*/ + diff --git a/Vsrc/V_watchdog.c b/Vsrc/V_watchdog.c new file mode 100644 index 0000000..bb95216 --- /dev/null +++ b/Vsrc/V_watchdog.c @@ -0,0 +1,51 @@ +/* + * V_watchdog.c + * + * Created on: 12 июл. 2018 г. + * Author: Dmitry + */ + +#include "main.h" + +Twdog Watchdog = WDOG_DEFAULTS; +// Разрешение вочдога +void WDog_Enable (){ + RCU->WDTCFG_bit.CLKSEL = 2; // PLL + RCU->WDTCFG_bit.DIVN = 1; // PLL / 4 + RCU->WDTCFG_bit.DIVEN = 1; + RCU->WDTCFG_bit.RSTDIS = 1; + RCU->WDTCFG_bit.CLKEN = 1; + + WDT->LOCK = 0x1ACCE551; + WDT->LOAD_bit.VAL = 100000; + WDT->CTRL_bit.INTEN = 1; + WDT->CTRL_bit.RESEN = 1; + WDT->LOCK = 0x1ACCE551; + +} + +// Отключение вочдога +void WDog_Disable (){ + WDT->LOCK = 0x1ACCE551; + WDT->CTRL_bit.INTEN = 0; + WDT->CTRL_bit.RESEN = 0; + WDT->LOCK = 0x1ACCE551; +} + +// Сброс таймера вочдога +void WDog_Feed (){ + WDT->LOCK = 0x1ACCE551; + WDT->LOAD_bit.VAL = 2500 * 3; // 3 * 10 кГц прерывания + WDT->LOCK = 0x1ACCE551; +} + +// Перезагрузка проца вочдогом +void WDog_ResetSystem (){ + DINT; + WDog_Enable(); + WDT->LOCK = 0x1ACCE551; + WDT->LOAD_bit.VAL = 2; // 2 такта + WDT->LOCK = 0x1ACCE551; + + while(1); +} diff --git a/Vsrc/X_CANFlashProgDataM4F_1921VK028.c b/Vsrc/X_CANFlashProgDataM4F_1921VK028.c new file mode 100644 index 0000000..833485d --- /dev/null +++ b/Vsrc/X_CANFlashProgDataM4F_1921VK028.c @@ -0,0 +1,11871 @@ +//Файл: X_CANFlashProgDataM4F.c +//Дата созданиЯ: 2019-07-19 15:19:54 +#include "DSP.h" +#include "X_CANFlashProgData.h" +//количество адресов в массиве FPAddrs +Uint16 const FPNumOfAddrs = 3; +//адреса начала частей прошивальщика +Uint32 const FPAddrs[] = { +0x20000000, +0x20000400, +0x20005530 +}; +//длина частей прошивальщика +Uint16 const FPPartsLength[] = { +0x0032, +0x2896, +0x0582 +}; +//данные прошивальщика +Uint16 const FPData[] = { +0xF240, +0x0300, +0xF2C2, +0x0308, +0xF383, +0x8808, +0xF246, +0x0434, +0xF245, +0x5130, +0xF2C2, +0x0400, +0xF2C2, +0x0100, +0x1A64, +0xBF1E, +0xF245, +0x5030, +0xF2C2, +0x0000, +0x2300, +0xD004, +0x5CC2, +0x54CA, +0x3301, +0x429C, +0xD1FA, +0xF246, +0x6154, +0xF246, +0x0334, +0xF2C2, +0x0300, +0xF2C2, +0x0100, +0x1AC9, +0xBF1C, +0x18C9, +0x2200, +0xD003, +0xF803, +0x2B01, +0x428B, +0xD1FB, +0xF3BF, +0x8F4F, +0xF3BF, +0x8F6F, +0xF004, +0xB966, +0x0000, +0x2008, +0x0001, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x1631, +0x2000, +0x1631, +0x2000, +0x0000, +0x0000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x4491, +0x2000, +0x443D, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x30D9, +0x2000, +0x31A5, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x1631, +0x2000, +0x4401, +0xF5B1, +0x1F00, +0xB410, +0xBF88, +0x2007, +0xD902, +0xF85D, +0x4B04, +0x4770, +0x0C40, +0x0C4C, +0xB283, +0x42A3, +0xD80D, +0x43D2, +0xFA42, +0xF000, +0x07C0, +0xD502, +0xE00B, +0x07C9, +0xD409, +0x3301, +0xB29B, +0x429C, +0xFA42, +0xF103, +0xD2F7, +0x2000, +0xF85D, +0x4B04, +0x4770, +0x2008, +0xF85D, +0x4B04, +0x4770, +0xBF00, +0x2001, +0x4770, +0x2000, +0x4770, +0x3000, +0xBF18, +0x2001, +0x4770, +0x2000, +0x4770, +0xB90A, +0x461A, +0xE7CC, +0x2000, +0x4770, +0xBF00, +0xF44F, +0x5380, +0xF2C4, +0x0306, +0xF240, +0x1201, +0x2002, +0xF643, +0x71F0, +0xF2CC, +0x02DE, +0x6498, +0x6019, +0x645A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0xF44F, +0x5080, +0xF2C0, +0x0398, +0xF2C4, +0x0006, +0xE001, +0x3B01, +0xD00F, +0x6C81, +0xF44F, +0x5280, +0x07C9, +0xF2C4, +0x0206, +0xD4F6, +0x2302, +0x6493, +0x6893, +0xF013, +0x0F40, +0xBF14, +0x2000, +0x200A, +0x4770, +0x2004, +0x4770, +0xE92D, +0x03F0, +0xF44F, +0x5180, +0xF5AD, +0x5D80, +0xF2C4, +0x0106, +0x2702, +0x46EC, +0xF240, +0x1401, +0x4691, +0x648F, +0x4668, +0xF5CC, +0x5540, +0xF2CC, +0x04DE, +0xF50D, +0x5680, +0x182B, +0x600B, +0x644C, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0xF2C0, +0x0398, +0xE001, +0x3B01, +0xD074, +0x6C8A, +0xF44F, +0x5880, +0x07D2, +0xF2C4, +0x0806, +0xD4F6, +0xF8C8, +0x7048, +0xF8D8, +0x3004, +0x6003, +0xF8D8, +0x3008, +0x6043, +0xF8D8, +0x300C, +0x6083, +0xF8D8, +0x3010, +0x3010, +0xF840, +0x3C04, +0x42B0, +0xD1D7, +0xF8DC, +0x3FF4, +0xF1B9, +0x0F00, +0xD15C, +0xF023, +0x0340, +0xF8CC, +0x3FF4, +0xF44F, +0x5380, +0xF2C4, +0x0306, +0xF44F, +0x7282, +0xF44F, +0x5140, +0xF2CC, +0x02DE, +0x6019, +0x645A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0xF44F, +0x5180, +0xF2C0, +0x0398, +0xF2C4, +0x0106, +0xE001, +0x3B01, +0xD047, +0x6C8A, +0xF44F, +0x5080, +0x07D4, +0xF2C4, +0x0006, +0xD4F6, +0x2702, +0xF44F, +0x7481, +0x6487, +0xF2CC, +0x04DE, +0xEB0C, +0x0305, +0x6003, +0xF8DC, +0x3000, +0x6043, +0xF8DC, +0x3004, +0x6083, +0xF8DC, +0x3008, +0x60C3, +0xF8DC, +0x300C, +0x6103, +0x6444, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0xF2C0, +0x0398, +0xE001, +0x3B01, +0xD018, +0x6C81, +0xF44F, +0x5280, +0x07C9, +0xF2C4, +0x0206, +0xD4F6, +0xF10C, +0x0C10, +0x4566, +0x6497, +0xD1D7, +0x2000, +0xE000, +0x2004, +0xF50D, +0x5D80, +0xE8BD, +0x03F0, +0x4770, +0xF043, +0x0340, +0xF8CC, +0x3FF4, +0xE7A1, +0x2002, +0xF50D, +0x5D80, +0xE8BD, +0x03F0, +0x4770, +0x2006, +0xE7ED, +0x2200, +0xF7FF, +0xBF51, +0xBF00, +0x2201, +0xF7FF, +0xBF4D, +0xBF00, +0x2300, +0xF2C4, +0x0306, +0x2202, +0xB430, +0x649A, +0xF04F, +0x35FF, +0x2300, +0x009A, +0xF102, +0x4280, +0xF502, +0x22C0, +0x3301, +0x2400, +0x2B10, +0x6055, +0xF2C4, +0x0406, +0xD1F3, +0x6020, +0x2300, +0x009A, +0xF102, +0x4280, +0xF851, +0x4023, +0xF502, +0x22C0, +0x3301, +0x2000, +0x2B10, +0x6054, +0xF2C4, +0x0006, +0xD1F1, +0x2302, +0xF2CC, +0x03DE, +0x6443, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0x2000, +0xF2C0, +0x0398, +0xF2C4, +0x0006, +0xE001, +0x3B01, +0xD00A, +0x6C81, +0x2200, +0x07C9, +0xF2C4, +0x0206, +0xD4F7, +0x2302, +0x6493, +0x2000, +0xBC30, +0x4770, +0x2003, +0xBC30, +0x4770, +0xE92D, +0x4FF0, +0xB093, +0xF3C0, +0x0544, +0x460C, +0x4616, +0x9301, +0xF020, +0x093F, +0xF8BD, +0xB070, +0x2D00, +0xD039, +0xF10D, +0x0206, +0x2300, +0xF839, +0x1013, +0x3301, +0x42AB, +0xF822, +0x1F02, +0xD1F8, +0xF10D, +0x0A08, +0x1E6A, +0x4633, +0xEB0A, +0x0242, +0xB19C, +0x3C01, +0xF833, +0x0B02, +0xF105, +0x0501, +0xBF0C, +0x2100, +0x2101, +0x2D1F, +0xBF8C, +0x2100, +0xF001, +0x0101, +0xF822, +0x0F02, +0x461E, +0x2900, +0xD1ED, +0x2D20, +0xD00A, +0x1E6B, +0xEB0A, +0x0343, +0xF10D, +0x0146, +0xF64F, +0x72FF, +0xF823, +0x2F02, +0x428B, +0xD1FB, +0x4648, +0x4651, +0x9A01, +0x465B, +0xF7FF, +0xFF76, +0xF109, +0x0940, +0x2800, +0xD132, +0xB384, +0xF10D, +0x0A08, +0xF10D, +0x0846, +0xF64F, +0x77FF, +0x4633, +0xF10D, +0x0206, +0x2500, +0xB34C, +0x3C01, +0xF833, +0x0B02, +0xF105, +0x0501, +0xBF0C, +0x2100, +0x2101, +0x2D1F, +0xBF8C, +0x2100, +0xF001, +0x0101, +0xF822, +0x0F02, +0x461E, +0x2900, +0xD1ED, +0x2D20, +0xD006, +0x3D01, +0xEB0A, +0x0545, +0xF825, +0x7F02, +0x4545, +0xD1FB, +0x4648, +0x4651, +0x9A01, +0x465B, +0xF7FF, +0xFF45, +0xB920, +0xF109, +0x0940, +0x2C00, +0xD1D4, +0x2000, +0xB013, +0xE8BD, +0x8FF0, +0x4625, +0xE7E7, +0x2300, +0xF2C4, +0x0306, +0x220C, +0x2102, +0xF2CC, +0x02DE, +0x6499, +0x645A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0x2000, +0xF2C0, +0x0398, +0xF2C4, +0x0006, +0xE001, +0x3B01, +0xD011, +0x6C81, +0x2200, +0x07C9, +0xF2C4, +0x0206, +0xD4F7, +0x2302, +0x6493, +0x6CD3, +0xF443, +0x7380, +0x64D3, +0x6CD3, +0xF443, +0x7300, +0x64D3, +0x2000, +0x4770, +0x2006, +0x4770, +0x2300, +0xF2C4, +0x0306, +0x2204, +0x0380, +0x2102, +0xF2CC, +0x02DE, +0x6499, +0x6018, +0x645A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF249, +0x6381, +0x2000, +0xF2C0, +0x0398, +0xF2C4, +0x0006, +0xE001, +0x3B01, +0xD009, +0x6C81, +0x2200, +0x07C9, +0xF2C4, +0x0206, +0xD4F7, +0x2302, +0x6493, +0x2000, +0x4770, +0x2006, +0x4770, +0xB5F8, +0x2300, +0x4607, +0x461E, +0xFA47, +0xF206, +0x07D2, +0xF103, +0x0508, +0xD509, +0x42AB, +0xB29C, +0xDA06, +0x4620, +0x3401, +0xB2A4, +0xF7FF, +0xFFC8, +0x42AC, +0xDBF8, +0x3601, +0x2E10, +0x462B, +0xD1EB, +0x2000, +0xBDF8, +0xB4F0, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0x695B, +0xF003, +0x0303, +0x2B03, +0xD86B, +0xE8DF, +0xF003, +0x5660, +0x0202, +0x2B03, +0xBF05, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0x2401, +0x68DC, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0xBF08, +0xF3C4, +0x2405, +0x689E, +0x6899, +0x6898, +0x689D, +0x689F, +0xEA4F, +0x7797, +0xBF08, +0x3401, +0xF3C6, +0x3602, +0x2F01, +0xF3C1, +0x4102, +0xBF14, +0xF44F, +0x52D8, +0xF44F, +0x5210, +0xF3C5, +0x5505, +0xFB11, +0xF106, +0xF3C0, +0x000B, +0xBF1A, +0x689B, +0xF2C0, +0x02B7, +0xF2C0, +0x02F4, +0xFB05, +0xF101, +0xF246, +0x037C, +0xFB04, +0xF101, +0xFB00, +0xF002, +0xF2C2, +0x0300, +0xFBB0, +0xF0F1, +0x6018, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0xF246, +0x0184, +0xF8D3, +0x40C0, +0xF246, +0x0280, +0xF004, +0x0403, +0xF2C2, +0x0100, +0xF2C2, +0x0200, +0xFA20, +0xF404, +0x600C, +0x6010, +0x6958, +0xBCF0, +0xF3C0, +0x2000, +0x4770, +0xF246, +0x037C, +0xF2C2, +0x0300, +0xF44F, +0x50D8, +0xF2C0, +0x00B7, +0x6018, +0xE7DC, +0xF246, +0x037C, +0xF2C2, +0x0300, +0xF44F, +0x5010, +0xF2C0, +0x00F4, +0x6018, +0xE7D2, +0xF246, +0x037C, +0xF2C2, +0x0300, +0x6818, +0xE7CC, +0xF44F, +0x5280, +0xF2C4, +0x0208, +0xF44F, +0x5340, +0xF8D2, +0x1100, +0xF041, +0x0108, +0xF8C2, +0x1100, +0xF8D2, +0x1104, +0xF2C4, +0x0301, +0xF041, +0x0108, +0xF8C2, +0x1104, +0x6BD9, +0x2002, +0xF360, +0x0103, +0x63D9, +0x8E99, +0xF041, +0x0101, +0x8699, +0x8A99, +0xF041, +0x0101, +0x8299, +0x6953, +0xF3C3, +0x6340, +0xB963, +0x4611, +0xE002, +0xF5B3, +0x1F80, +0xD079, +0x694A, +0x0190, +0xF103, +0x0301, +0xD5F7, +0xF5B3, +0x1F80, +0xD071, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0x2164, +0x689A, +0xF36F, +0x725D, +0x609A, +0x689A, +0xF361, +0x020B, +0x609A, +0x689A, +0xF36F, +0x629A, +0x609A, +0x6899, +0xF648, +0x72FF, +0xF6C3, +0x4208, +0x400A, +0xF442, +0x1244, +0xF442, +0x5200, +0x609A, +0x689A, +0xF36F, +0x721C, +0x609A, +0x6899, +0xF44F, +0x5280, +0x0109, +0xF2C4, +0x0208, +0xD5F8, +0x2000, +0xF44F, +0x5380, +0xF2C4, +0x0306, +0xF2C4, +0x0006, +0xF44F, +0x21E0, +0x64C1, +0x64D9, +0xF892, +0x30C0, +0x2101, +0xF361, +0x0301, +0x2102, +0xF882, +0x30C0, +0x6111, +0x6951, +0x6913, +0xF001, +0x0103, +0xF003, +0x0303, +0x4299, +0xD011, +0x2300, +0xE002, +0xF5B3, +0x1F80, +0xD02A, +0x6950, +0x6911, +0xF000, +0x0003, +0xF001, +0x0103, +0x4288, +0xF103, +0x0301, +0xD1F2, +0xF5B3, +0x1F80, +0xD01D, +0x2300, +0xF2C4, +0x0306, +0x4619, +0x6CDA, +0xF442, +0x7280, +0x64DA, +0x6D0A, +0x2300, +0x07D0, +0xF2C4, +0x0306, +0xD4F9, +0x6CDA, +0xF442, +0x7200, +0x64DA, +0x6D59, +0x2200, +0x07C9, +0xF2C4, +0x0206, +0xD4F9, +0x6CD3, +0xF043, +0x0306, +0x64D3, +0x4770, +0xE7FE, +0xE7FE, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0xF44F, +0x5100, +0xF8D3, +0x20E0, +0xF042, +0x6280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x6200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x5280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x5200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x4280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x4200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x1200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x0280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x0200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x7280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x6200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x5280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF042, +0x7200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x3200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x2280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x2200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x1280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x7200, +0xF8C3, +0x20E0, +0xF8D3, +0x20E0, +0xF442, +0x6280, +0xF8C3, +0x20E0, +0xF8D3, +0x20E4, +0xF442, +0x4280, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x4200, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x3280, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0201, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0202, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0204, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0208, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0210, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0220, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0240, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF042, +0x0280, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x7280, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x7200, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x6280, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x6200, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0xF442, +0x5280, +0xF8C3, +0x20E4, +0xF8D3, +0x20E4, +0x430A, +0xF8C3, +0x20E4, +0xF8D3, +0x2100, +0xF442, +0x5280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0x430A, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x2280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0201, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0202, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0204, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0208, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0210, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0220, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0240, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF042, +0x0280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x7280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x7200, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x6280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x6200, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x4280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x4200, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x2200, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x3280, +0xF8C3, +0x2100, +0xF8D3, +0x2100, +0xF442, +0x3200, +0xF8C3, +0x2100, +0xF8D3, +0x2104, +0xF442, +0x5280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0x430A, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x2280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0201, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0202, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0204, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0208, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0210, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0220, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0240, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF042, +0x0280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x7280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x7200, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x6280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x6200, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x4280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x4200, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x2200, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x3280, +0xF8C3, +0x2104, +0xF8D3, +0x2104, +0xF442, +0x3200, +0xF8C3, +0x2104, +0xF8D3, +0x20F0, +0xF042, +0x6280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x6200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x5280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x5200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x4280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x4200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x1200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x0280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x0200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x7280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x6200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x5280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF042, +0x7200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x3200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x2280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x2200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x1280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x7200, +0xF8C3, +0x20F0, +0xF8D3, +0x20F0, +0xF442, +0x6280, +0xF8C3, +0x20F0, +0xF8D3, +0x20F4, +0xF442, +0x4280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x4200, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x3280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x3280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0201, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0202, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0204, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0208, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0210, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0220, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0240, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF042, +0x0280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x7280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x7200, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x6280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x6200, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF442, +0x5280, +0xF8C3, +0x20F4, +0xF8D3, +0x20F4, +0xF2C4, +0x0108, +0xF442, +0x5200, +0x200F, +0xF8C3, +0x20F4, +0x460A, +0x6108, +0x6913, +0x05DB, +0xD5FC, +0x6913, +0x0598, +0xD5F9, +0x6913, +0x0559, +0xD5F6, +0x6913, +0x051B, +0xD5F3, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0x2201, +0xF8D3, +0x10A0, +0xF362, +0x2109, +0xF8C3, +0x10A0, +0xF8D3, +0x10A0, +0x2002, +0xF360, +0x611D, +0xF8C3, +0x10A0, +0xF8D3, +0x10A0, +0xF441, +0x3180, +0xF8C3, +0x10A0, +0xF8D3, +0x10A0, +0x4311, +0xF8C3, +0x10A0, +0xF8D3, +0x10A0, +0xF041, +0x0110, +0xF8C3, +0x10A0, +0xF8D3, +0x1080, +0xF362, +0x2109, +0xF8C3, +0x1080, +0xF8D3, +0x0080, +0x2103, +0xF361, +0x601D, +0xF8C3, +0x0080, +0xF8D3, +0x0080, +0xF440, +0x3080, +0xF8C3, +0x0080, +0xF8D3, +0x0080, +0x4310, +0xF8C3, +0x0080, +0xF8D3, +0x0080, +0xF040, +0x0010, +0xF8C3, +0x0080, +0xF8D3, +0x0084, +0xF362, +0x2009, +0xF8C3, +0x0084, +0xF8D3, +0x0084, +0xF361, +0x601D, +0xF8C3, +0x0084, +0xF8D3, +0x0084, +0xF440, +0x3080, +0xF8C3, +0x0084, +0xF8D3, +0x0084, +0x4310, +0xF8C3, +0x0084, +0xF8D3, +0x0084, +0xF040, +0x0010, +0xF8C3, +0x0084, +0xF8D3, +0x0088, +0xF362, +0x2009, +0xF8C3, +0x0088, +0xF8D3, +0x0088, +0xF361, +0x601D, +0xF8C3, +0x0088, +0xF8D3, +0x0088, +0xF440, +0x3080, +0xF8C3, +0x0088, +0xF8D3, +0x0088, +0x4310, +0xF8C3, +0x0088, +0xF8D3, +0x0088, +0xF040, +0x0010, +0xF8C3, +0x0088, +0xF8D3, +0x008C, +0xF362, +0x2009, +0xF8C3, +0x008C, +0xF8D3, +0x008C, +0xF361, +0x601D, +0xF8C3, +0x008C, +0xF8D3, +0x008C, +0xF440, +0x3080, +0xF8C3, +0x008C, +0xF8D3, +0x008C, +0x4310, +0xF8C3, +0x008C, +0xF8D3, +0x008C, +0xF040, +0x0010, +0xF8C3, +0x008C, +0x6E18, +0xF362, +0x2009, +0x6618, +0x6E18, +0xF361, +0x601D, +0x6618, +0x6E18, +0xF440, +0x3080, +0x6618, +0x6E18, +0x4310, +0x6618, +0x6E18, +0xF040, +0x0010, +0x6618, +0x6E58, +0xF362, +0x2009, +0x6658, +0x6E58, +0xF361, +0x601D, +0x6658, +0x6E58, +0xF440, +0x3080, +0x6658, +0x6E58, +0x4310, +0x6658, +0x6E58, +0xF040, +0x0010, +0x6658, +0x6E98, +0xF362, +0x2009, +0x6698, +0x6E98, +0xF361, +0x601D, +0x6698, +0x6E98, +0xF440, +0x3080, +0x6698, +0x6E98, +0x4310, +0x6698, +0x6E98, +0xF040, +0x0010, +0x6698, +0x6ED8, +0xF362, +0x2009, +0x66D8, +0x6EDA, +0xF361, +0x621D, +0x66DA, +0x6EDA, +0xF442, +0x3280, +0x66DA, +0x6EDA, +0xF042, +0x0201, +0x66DA, +0x6EDA, +0xF042, +0x0210, +0x66DA, +0x4770, +0xF246, +0x0278, +0xF2C2, +0x0200, +0xF44F, +0x436D, +0xF2CE, +0x0300, +0x2100, +0xB410, +0x6011, +0x6A99, +0xF441, +0x4100, +0x6299, +0xF3EF, +0x8113, +0xB671, +0xF44F, +0x436D, +0xF2CE, +0x0300, +0xF44F, +0x1000, +0x695C, +0xF444, +0x7480, +0x615C, +0x6800, +0x6A98, +0x0400, +0xBF5C, +0x2301, +0x6013, +0xD51F, +0x6A9C, +0xF44F, +0x2000, +0xF444, +0x4400, +0x629C, +0x6800, +0x6A98, +0x0404, +0xBF5C, +0x2302, +0x6013, +0xD512, +0x6A9C, +0xF44F, +0x3080, +0xF444, +0x4400, +0x629C, +0x6800, +0x6A98, +0x0400, +0xBF49, +0x6A9C, +0x2304, +0x2008, +0xF444, +0x4400, +0xBF4A, +0x629C, +0x6013, +0x6010, +0xF44F, +0x436D, +0xF2CE, +0x0300, +0x695A, +0xF422, +0x7280, +0x615A, +0xF381, +0x8813, +0xB661, +0xF85D, +0x4B04, +0x4770, +0xBF00, +0xB508, +0xF7FF, +0xFB65, +0xF44F, +0x436D, +0xF2CE, +0x0300, +0xF44F, +0x0270, +0xF8C3, +0x2088, +0xF3BF, +0x8F4F, +0xF3BF, +0x8F6F, +0xF7FF, +0xFBFD, +0xE8BD, +0x4008, +0xF7FF, +0xBF99, +0xBF00, +0xE7FE, +0xBF00, +0xF44F, +0x5300, +0xF2C4, +0x0301, +0x2101, +0x6C1A, +0xF361, +0x4213, +0x641A, +0x6C1A, +0xF44F, +0x5040, +0xF361, +0x5217, +0x641A, +0x6358, +0x4770, +0xBF00, +0xF44F, +0x5300, +0xF2C4, +0x0301, +0x2101, +0x6C1A, +0xF361, +0x621B, +0x641A, +0x6C1A, +0xF44F, +0x4040, +0xF361, +0x721F, +0x641A, +0x6358, +0x4770, +0xBF00, +0x4770, +0xBF00, +0x4770, +0xBF00, +0x4770, +0xBF00, +0x4770, +0xBF00, +0xE92D, +0x01F0, +0xF8D0, +0x4114, +0xF8D0, +0x5114, +0xF8D0, +0x6080, +0x882F, +0x428F, +0xD829, +0xF8B6, +0xC000, +0x458C, +0xBF28, +0xF004, +0x0801, +0xD217, +0x6016, +0xE021, +0x8837, +0x428F, +0xD0FA, +0x45C4, +0xBF18, +0x3C02, +0x46A4, +0x8827, +0x428F, +0xD021, +0x42B9, +0xBF36, +0x46AC, +0x4634, +0x4626, +0xEBCC, +0x0404, +0xBF28, +0x4665, +0x2C05, +0xDD0B, +0x882F, +0x1B74, +0x1064, +0xEB04, +0x74D4, +0xF024, +0x0401, +0x42B9, +0xF3C4, +0x0C40, +0x442C, +0xD1DE, +0x6015, +0xF8D0, +0x1118, +0x6812, +0x8852, +0xEB01, +0x0242, +0x601A, +0xE8BD, +0x01F0, +0x4770, +0x6014, +0xE7F3, +0x680A, +0x680B, +0x8812, +0x881B, +0x0B9B, +0xD017, +0x0092, +0xB292, +0xF402, +0x4340, +0xF5B3, +0x4F00, +0xD012, +0xF5B3, +0x4F40, +0xD017, +0x0052, +0xB292, +0x0411, +0xD40D, +0x0092, +0xB292, +0x0413, +0xD411, +0xF412, +0x5F80, +0xBF14, +0x2004, +0x2006, +0x4770, +0x2003, +0x4770, +0x2004, +0x4770, +0xF412, +0x5F00, +0xBF14, +0x2009, +0x2006, +0x4770, +0x2009, +0x4770, +0xF412, +0x5F80, +0xBF0C, +0x2009, +0x2005, +0x4770, +0xF8D0, +0x3118, +0x680A, +0x8852, +0xF833, +0x3012, +0x0A1B, +0xBF01, +0xF8D0, +0x3118, +0x680A, +0x8852, +0xF833, +0x0012, +0xBF18, +0x2000, +0x4770, +0xBF00, +0xB570, +0x4616, +0x4604, +0x460D, +0xF7FF, +0xFFE8, +0xB148, +0xF8D4, +0x3118, +0x682A, +0x8852, +0x3202, +0xF833, +0x0012, +0x3002, +0xB280, +0xBD70, +0x4620, +0x4631, +0xE8BD, +0x4070, +0xF7FF, +0xBFA7, +0xBF00, +0xB5F8, +0xF8D0, +0x3118, +0x680F, +0xF8B7, +0xC002, +0x6817, +0xEB03, +0x034C, +0x429F, +0x4605, +0x460C, +0x4616, +0xD011, +0xF7FF, +0xFFD8, +0x6832, +0xF8D5, +0x1118, +0x6823, +0x885B, +0x3303, +0xEB01, +0x0343, +0x1AD3, +0xF3C3, +0x034F, +0xFBB3, +0xF0F0, +0x3001, +0xB280, +0xBDF8, +0x2000, +0xBDF8, +0xB570, +0x461C, +0xF8D0, +0x3118, +0x6815, +0x886E, +0xEB03, +0x0346, +0x460D, +0x6023, +0xB901, +0xBD70, +0x4611, +0xF7FF, +0xFFA5, +0x4285, +0xD8F9, +0x6822, +0x6823, +0x889B, +0x3D01, +0x3302, +0xFB05, +0xF303, +0x3303, +0xEB02, +0x0343, +0x6023, +0xBD70, +0xBF00, +0xF8B0, +0x3174, +0xFA11, +0xF183, +0xB2C8, +0x0140, +0xF100, +0x4180, +0xB470, +0xF501, +0x3104, +0x4606, +0x2508, +0xF241, +0x0318, +0xF2C4, +0x0302, +0x4403, +0x605D, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x6948, +0x6050, +0x6908, +0x6010, +0x6988, +0xF3C0, +0x001C, +0x6090, +0x69CC, +0x0724, +0x4630, +0xD4E8, +0x69CB, +0x075B, +0xD4E5, +0xBC70, +0x4770, +0xBF00, +0xF8B0, +0x0174, +0xFA11, +0xF180, +0xB410, +0xB2C9, +0xF241, +0x0418, +0x0148, +0xF2C4, +0x0402, +0x4404, +0x2020, +0x6060, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x0148, +0xF100, +0x4080, +0xF500, +0x3004, +0x0492, +0x6984, +0xF022, +0x4260, +0xF362, +0x041C, +0x6184, +0x681A, +0x6102, +0x685C, +0x2340, +0xF2C0, +0x1308, +0x6144, +0x61C3, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF241, +0x0318, +0x0149, +0xF2C4, +0x0302, +0x440B, +0xF44F, +0x1200, +0x605A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF85D, +0x4B04, +0x4770, +0xBF00, +0xB510, +0xB082, +0xF8B0, +0x404C, +0x9900, +0xAB02, +0xB2E4, +0xF364, +0x0107, +0xF843, +0x1D08, +0xF8B0, +0x2042, +0xB292, +0xF502, +0x62E0, +0x466B, +0x210E, +0xF7FF, +0xFFAE, +0xB002, +0xBD10, +0xF8D0, +0x20B0, +0x3A01, +0xF8C0, +0x20B0, +0xF8D0, +0x20B0, +0xB102, +0x4770, +0x6942, +0xF8C0, +0x20B0, +0xF7FF, +0xBFDC, +0xB530, +0xB083, +0x2504, +0x9C00, +0xF36F, +0x0407, +0x9400, +0x9C00, +0xF365, +0x1447, +0x9400, +0x9C00, +0xF36F, +0x1404, +0x9400, +0x9C00, +0xF36F, +0x0483, +0x9400, +0x9C00, +0xF36F, +0x0441, +0x9400, +0x9C00, +0xF36F, +0x0400, +0x9400, +0x9C00, +0xF362, +0x2417, +0x9400, +0x9A00, +0xB2DB, +0xF363, +0x621F, +0x9200, +0x9101, +0xF8B0, +0x2042, +0xB292, +0xF502, +0x62B0, +0x210C, +0x466B, +0xF7FF, +0xFF70, +0xB003, +0xBD30, +0xE92D, +0x43F0, +0x680D, +0x680B, +0xF100, +0x0778, +0xF100, +0x067C, +0xF3C5, +0x250F, +0x4604, +0xB083, +0xEA4F, +0x6813, +0x4629, +0x463A, +0x4633, +0xF7FF, +0xFE55, +0x4633, +0x4620, +0x4641, +0x463A, +0xF7FF, +0xFF0D, +0x6FA3, +0xF8B3, +0x9000, +0x45A9, +0xD00A, +0x2100, +0x4620, +0x462A, +0x4643, +0xF2C0, +0x6102, +0xF7FF, +0xFFAA, +0xB003, +0xE8BD, +0x83F0, +0x4639, +0x4632, +0x4620, +0xF7FF, +0xFED6, +0x4540, +0xD172, +0x6FE3, +0x881B, +0x0A1B, +0xD14E, +0x6FE1, +0x9A01, +0x7809, +0xF361, +0x0207, +0x9201, +0x9A01, +0xF363, +0x220F, +0x9201, +0x9A01, +0xF363, +0x4217, +0x9201, +0x9A01, +0xF363, +0x621F, +0x9201, +0x2103, +0x9B00, +0xF36F, +0x0307, +0x9300, +0x9B00, +0x2202, +0xF362, +0x1347, +0x9300, +0x9B00, +0xF36F, +0x1304, +0x9300, +0x9B00, +0xF361, +0x0383, +0x9300, +0x9B00, +0x4313, +0x9300, +0x9B00, +0xF043, +0x0301, +0x9300, +0x9B00, +0xF369, +0x2317, +0x9300, +0x9A00, +0xAB02, +0xF368, +0x621F, +0xF843, +0x2D08, +0xF8B4, +0x2042, +0xB292, +0x466B, +0xF502, +0x62B0, +0x210C, +0x4620, +0xF7FF, +0xFEFB, +0xF8D4, +0x3124, +0x6FA1, +0xF8D4, +0x2114, +0x1A8A, +0x1092, +0xF853, +0x3022, +0x2B00, +0xD0A7, +0x2000, +0x4798, +0xB003, +0xE8BD, +0x83F0, +0xF8D4, +0x311C, +0x6FE2, +0x6FE1, +0x8892, +0x8809, +0xF853, +0x3022, +0x6FE2, +0x8812, +0xF3C1, +0x3140, +0xF3C2, +0x3200, +0xB9D9, +0x2A00, +0xD13F, +0x6FE1, +0x8809, +0xF3C1, +0x2141, +0x2901, +0xD041, +0xD347, +0x2902, +0xBF18, +0x2100, +0xD1A7, +0x681B, +0x2100, +0x9301, +0xE7A3, +0x2111, +0x4620, +0x464A, +0x4643, +0xF2C0, +0x6109, +0xF7FF, +0xFF25, +0xB003, +0xE8BD, +0x83F0, +0x2A00, +0xD1EE, +0x6FE1, +0x6FE0, +0x8809, +0x8800, +0x881D, +0x9B01, +0xF001, +0x010F, +0xF1C1, +0x0610, +0xF3C0, +0x1003, +0x1A30, +0x4085, +0xFA45, +0xF000, +0xFA40, +0xF101, +0xB2C9, +0xF361, +0x0307, +0x9301, +0x9B01, +0xF362, +0x230F, +0x9301, +0x9B01, +0xF362, +0x4317, +0x9301, +0x9B01, +0xF362, +0x631F, +0x9301, +0x2103, +0xE772, +0x6FE2, +0x8812, +0xF3C2, +0x2280, +0xB112, +0x681B, +0x9301, +0xE76A, +0x881B, +0x2102, +0xF8AD, +0x3004, +0xF8AD, +0x2006, +0xE763, +0x7819, +0x9B01, +0xE7DC, +0xE92D, +0x47F0, +0x680D, +0x680B, +0xF100, +0x0778, +0xF100, +0x067C, +0xF3C5, +0x250F, +0x4604, +0xB084, +0xEA4F, +0x6813, +0x463A, +0x4633, +0x4689, +0x4629, +0xF7FF, +0xFD6E, +0x4633, +0x4620, +0x4641, +0x463A, +0xF7FF, +0xFE26, +0x6FA3, +0xF8B3, +0xA000, +0x45AA, +0xD00A, +0x2100, +0x4620, +0x462A, +0x4643, +0xF2C0, +0x6102, +0xF7FF, +0xFEC3, +0xB004, +0xE8BD, +0x87F0, +0x4639, +0x4632, +0x4620, +0xF7FF, +0xFDEF, +0x4540, +0x4603, +0xD17A, +0x6FE2, +0x8812, +0x0B92, +0x2A02, +0xD068, +0x2A03, +0xF000, +0x80D8, +0x2A00, +0xF000, +0x80CD, +0xF5AA, +0x5300, +0x2B01, +0xBF9C, +0x2301, +0xF8A4, +0x310C, +0xF8D4, +0x311C, +0x6FE1, +0x6FE2, +0x8889, +0x8812, +0xF853, +0x3021, +0xF412, +0x5F00, +0x6FE2, +0x8812, +0xD166, +0xF412, +0x5F80, +0x6FE2, +0x8812, +0xF040, +0x80CE, +0xF3C2, +0x2241, +0x2A01, +0xF000, +0x80CC, +0xF0C0, +0x80CE, +0x2A02, +0xD102, +0xF8D9, +0x2004, +0x601A, +0x9B02, +0xF36F, +0x0307, +0x9302, +0x9B02, +0x2203, +0xF362, +0x1347, +0x9302, +0x9B02, +0xF36F, +0x1304, +0x9302, +0x9B02, +0xF36F, +0x0383, +0x9302, +0x9B02, +0xF36F, +0x0341, +0x9302, +0x9B02, +0xF36F, +0x0300, +0x9302, +0x9B02, +0xF36A, +0x2317, +0x9302, +0x9B02, +0x2200, +0xF368, +0x631F, +0x9302, +0x9203, +0xF8B4, +0x2042, +0xB292, +0xF502, +0x62B0, +0x210C, +0xAB02, +0x4620, +0xF7FF, +0xFDF8, +0xF8D4, +0x3124, +0x6FA1, +0xF8D4, +0x2114, +0x1A8A, +0x1092, +0xF853, +0x3022, +0x2B00, +0xD08B, +0x2001, +0x4798, +0xB004, +0xE8BD, +0x87F0, +0xF8B4, +0x2046, +0xB292, +0x2A01, +0xD197, +0x2122, +0x4620, +0x4652, +0xF6C0, +0x0100, +0xF7FF, +0xFE3E, +0xE779, +0x2111, +0x4620, +0x4652, +0x4643, +0xF2C0, +0x6109, +0xF7FF, +0xFE35, +0xB004, +0xE8BD, +0x87F0, +0x04D2, +0xD4A5, +0x8818, +0x6FE2, +0x6FE1, +0xF8D9, +0x5004, +0xF8AD, +0x0004, +0xF64F, +0x70FF, +0xF8AD, +0x0006, +0xF8BD, +0x0006, +0x8812, +0x8809, +0xF002, +0x020F, +0xB280, +0x4110, +0xB280, +0xF8AD, +0x0006, +0xF8BD, +0x0006, +0x4090, +0xB280, +0xF8AD, +0x0006, +0xF8BD, +0x6006, +0xF3C1, +0x1103, +0xF1C2, +0x0010, +0x1A40, +0xB2B6, +0x4086, +0xB2B6, +0xF8AD, +0x6006, +0xF8BD, +0x6006, +0xB2B6, +0xFA46, +0xF000, +0xB280, +0xF8AD, +0x0006, +0xF8BD, +0x0006, +0x43C0, +0xB280, +0xF8AD, +0x0006, +0xF8BD, +0x7004, +0xF8BD, +0x6006, +0xB2B6, +0xF1C1, +0x0108, +0x20FF, +0x403E, +0xF8AD, +0x6004, +0x4108, +0xB2ED, +0xF8BD, +0x1004, +0x4028, +0xFA00, +0xF202, +0x430A, +0xB292, +0xF8AD, +0x2004, +0xF8BD, +0x2004, +0x801A, +0xE758, +0x2102, +0x4620, +0x4652, +0xF2C0, +0x6101, +0xF7FF, +0xFDD9, +0xE714, +0xF8B4, +0x2046, +0xB292, +0x2A01, +0xD08D, +0xF8B4, +0x20F0, +0xB292, +0x2A01, +0xF47F, +0xAF20, +0x2120, +0x4620, +0x4652, +0xF6C0, +0x0100, +0xF7FF, +0xFDC6, +0xE701, +0x0551, +0xF53F, +0xAF38, +0xF8B9, +0x2004, +0x801A, +0xE736, +0xF8D9, +0x2004, +0xB2D2, +0x801A, +0xE731, +0xBF00, +0xB510, +0xB084, +0xAA01, +0x211D, +0x4604, +0xF7FF, +0xFD25, +0x9B01, +0xF3C3, +0x1342, +0x2B01, +0xD014, +0x2B02, +0xD00C, +0x9A01, +0x9B01, +0x2101, +0x4620, +0xF3C2, +0x220F, +0x0E1B, +0xF2C0, +0x5104, +0xF7FF, +0xFD9F, +0xB004, +0xBD10, +0x4620, +0xA901, +0xF7FF, +0xFDC9, +0xB004, +0xBD10, +0x4620, +0xA901, +0xF7FF, +0xFEA9, +0xB004, +0xBD10, +0xBF00, +0x2300, +0xB410, +0xF44F, +0x717A, +0xF44F, +0x64FA, +0x2205, +0x6003, +0x8083, +0x6104, +0x6141, +0xF8A0, +0x3046, +0xF8A0, +0x204C, +0xF8A0, +0x3060, +0xF8D0, +0x2114, +0x6642, +0xF8D0, +0x2118, +0x6682, +0xF8D0, +0x2120, +0x8812, +0xF8A0, +0x206C, +0xF8D0, +0x2114, +0x6702, +0xF8D0, +0x2118, +0x6742, +0xF8D0, +0x2114, +0x6782, +0xF8D0, +0x2118, +0x67C2, +0xF8D0, +0x1114, +0xF8B0, +0x2054, +0xB292, +0xF102, +0x4280, +0x3A01, +0xEB01, +0x0282, +0x2404, +0x2101, +0xF8C0, +0x2080, +0xF8C0, +0x40B4, +0xF8C0, +0x10B8, +0x6942, +0xF8C0, +0x20B0, +0x6904, +0xF44F, +0x5280, +0xF8C0, +0x40AC, +0xF8A0, +0x30E0, +0xF8A0, +0x30E2, +0xF8A0, +0x30E4, +0xF85D, +0x4B04, +0xF8A0, +0x30E6, +0xF8A0, +0x30F0, +0xF8A0, +0x110A, +0xF8A0, +0x310C, +0xF8C0, +0x3084, +0xF8C0, +0x3088, +0xF8C0, +0x308C, +0xF8C0, +0x3090, +0xF8C0, +0x3094, +0xF8C0, +0x3098, +0xF8C0, +0x309C, +0xF8C0, +0x30A0, +0xF8C0, +0x30A4, +0xF8C0, +0x30A8, +0xF8A0, +0x20BC, +0xF8A0, +0x30BE, +0x4770, +0xBF00, +0xE92D, +0x01F0, +0xF8B0, +0x5174, +0xF8BD, +0x7014, +0xF8BD, +0x6018, +0xFA11, +0xF185, +0xB2CD, +0xF241, +0x0418, +0x0169, +0xF2C4, +0x0402, +0x440C, +0x2120, +0x4694, +0x6061, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF241, +0x0118, +0x016A, +0xF2C4, +0x0102, +0x4411, +0xF240, +0x125B, +0xF6C0, +0x6200, +0x604A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x0169, +0xF101, +0x4480, +0xF504, +0x3404, +0xF04F, +0x0802, +0x69A2, +0xF368, +0x729F, +0x61A2, +0x69A2, +0xF003, +0x0301, +0xF363, +0x725D, +0x61A2, +0x2B00, +0xD058, +0x69A3, +0xF36C, +0x031C, +0x61A3, +0xF101, +0x4280, +0xF502, +0x3204, +0xF44F, +0x5380, +0xF2C4, +0x0302, +0xF06F, +0x4C40, +0xF8C2, +0xC00C, +0x585C, +0xF36F, +0x0403, +0x505C, +0x585C, +0xF367, +0x641B, +0x505C, +0x585C, +0xF366, +0x4451, +0x505C, +0xF8B0, +0x4178, +0x6893, +0xF364, +0x1307, +0x6093, +0x6894, +0xB2ED, +0x2300, +0xF2C4, +0x0302, +0xF365, +0x240F, +0x6094, +0xF8D3, +0x21C4, +0xF365, +0x4217, +0xF8C3, +0x21C4, +0xF8B0, +0x0176, +0xF8D3, +0x21C4, +0xB2C0, +0xF360, +0x621F, +0xF8C3, +0x21C4, +0xF8D3, +0x21C4, +0x2002, +0xF360, +0x0207, +0xF8C3, +0x21C4, +0xE003, +0xF8D3, +0x21C4, +0x0592, +0xD503, +0xF8D3, +0x21C4, +0x05D0, +0xD4F7, +0xF241, +0x0318, +0xF2C4, +0x0302, +0x440B, +0xF44F, +0x1200, +0x605A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xE8BD, +0x01F0, +0x4770, +0x69A3, +0xEA4F, +0x4C8C, +0xF02C, +0x4C60, +0xF36C, +0x031C, +0x61A3, +0xE7A1, +0xE92D, +0x07F0, +0xF8B0, +0x8174, +0xF8BD, +0xC020, +0xF8BD, +0x7024, +0xF8BD, +0x9028, +0xFA11, +0xF188, +0xFA5F, +0xF881, +0xF241, +0x0418, +0xEA4F, +0x1148, +0xF2C4, +0x0402, +0x440C, +0x2120, +0x6061, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF241, +0x0118, +0xEA4F, +0x1448, +0xF2C4, +0x0102, +0x4421, +0xF640, +0x745B, +0xF2C0, +0x0480, +0x604C, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xEA4F, +0x1148, +0xF101, +0x4480, +0xF504, +0x3404, +0xF04F, +0x0A02, +0x69A5, +0xF36A, +0x759F, +0x61A5, +0x69A5, +0xF003, +0x0301, +0xF363, +0x755D, +0x61A5, +0x2B00, +0xD05E, +0x69A3, +0xF362, +0x031C, +0x61A3, +0xF101, +0x4280, +0xF502, +0x3204, +0x9E07, +0x68D5, +0xF366, +0x051C, +0x60D5, +0x68D5, +0xF44F, +0x5380, +0xF2C4, +0x0302, +0xF36C, +0x755D, +0x60D5, +0x585C, +0xF36F, +0x0403, +0x505C, +0x585C, +0xF367, +0x641B, +0x505C, +0x585C, +0xF369, +0x4410, +0x505C, +0xF8B0, +0x4178, +0x6893, +0xF364, +0x0303, +0x6093, +0x6894, +0xFA5F, +0xF888, +0x2300, +0xF2C4, +0x0302, +0xF368, +0x240F, +0x6094, +0xF8D3, +0x21C4, +0xF368, +0x4217, +0xF8C3, +0x21C4, +0xF8B0, +0x0176, +0xF8D3, +0x21C4, +0xB2C0, +0xF360, +0x621F, +0xF8C3, +0x21C4, +0xF8D3, +0x21C4, +0x2002, +0xF360, +0x0207, +0xF8C3, +0x21C4, +0xE003, +0xF8D3, +0x21C4, +0x0592, +0xD503, +0xF8D3, +0x21C4, +0x05D0, +0xD4F7, +0xF241, +0x0318, +0xF2C4, +0x0302, +0x440B, +0xF44F, +0x1200, +0x605A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xE8BD, +0x07F0, +0x4770, +0x69A3, +0x0492, +0xF022, +0x4260, +0xF362, +0x031C, +0x61A3, +0xE79C, +0xE92D, +0x43F0, +0x2500, +0xF8A0, +0x504C, +0xF8D0, +0x3180, +0xB087, +0x4604, +0x4798, +0x462B, +0xF2C4, +0x0302, +0x461A, +0x7819, +0xF365, +0x0100, +0x7019, +0x6813, +0x0799, +0xD4FC, +0x2100, +0xF2C4, +0x0102, +0xF8D1, +0x21C4, +0x2300, +0x05D2, +0xF2C4, +0x0302, +0xD4F8, +0xF8D1, +0x21C4, +0xF3C2, +0x2240, +0x2A00, +0xD1F2, +0xF8D4, +0x1170, +0x7808, +0xF040, +0x0001, +0x7008, +0x68D9, +0xF240, +0x30FF, +0xF360, +0x0109, +0x60D9, +0x68D9, +0x2001, +0xF360, +0x318F, +0x60D9, +0xF8D4, +0x3170, +0x7819, +0xF041, +0x0140, +0x7019, +0xF8D4, +0x3170, +0x7819, +0xF362, +0x11C7, +0x7019, +0xF8B4, +0x3044, +0x3B01, +0xB29B, +0x2B05, +0xF240, +0x8148, +0x2303, +0xF8A4, +0x3044, +0x2302, +0xF245, +0x5268, +0xF8D4, +0x1170, +0xF2C2, +0x0200, +0x2500, +0xF812, +0x0013, +0x8A0A, +0xF360, +0x32CF, +0x820A, +0xF245, +0x525C, +0xF8D4, +0x1170, +0xF2C2, +0x0200, +0x8A08, +0xF812, +0x2013, +0xF362, +0x0005, +0x8208, +0xF245, +0x5244, +0xF8D4, +0x1170, +0xF2C2, +0x0200, +0x8A08, +0xF812, +0x2013, +0xF362, +0x200B, +0x8208, +0xF245, +0x5250, +0xF8D4, +0x1170, +0xF2C2, +0x0200, +0x8A08, +0xF812, +0x2013, +0xF362, +0x300E, +0x8208, +0xF645, +0x0250, +0xF8D4, +0x1170, +0xF2C2, +0x0200, +0xF04F, +0x0902, +0xF812, +0x2013, +0x8A0B, +0xF362, +0x1387, +0x820B, +0x462A, +0x4629, +0x462B, +0x4620, +0xF8CD, +0x9000, +0x9501, +0xF7FF, +0xFE25, +0xF8B4, +0x2042, +0x9501, +0x2708, +0xB292, +0xF502, +0x62B0, +0x462B, +0x4620, +0x210C, +0x9700, +0xF7FF, +0xFE18, +0x462B, +0x4620, +0x210D, +0xF44F, +0x62C0, +0x9700, +0x9501, +0xF7FF, +0xFE0F, +0xF8B4, +0x2042, +0x2601, +0xB292, +0xF502, +0x62E0, +0x462B, +0x4620, +0x210E, +0x9600, +0x9601, +0xF7FF, +0xFE02, +0xF8B4, +0x2042, +0x9700, +0xB292, +0xF06F, +0x4860, +0xF502, +0x62F0, +0x462B, +0x4620, +0x210F, +0x9601, +0xF7FF, +0xFDF4, +0x462A, +0x462B, +0x4620, +0x2110, +0xF8CD, +0x9008, +0x9601, +0x9603, +0xF8CD, +0x8000, +0xF7FF, +0xFE86, +0x462B, +0x4620, +0x211C, +0xF44F, +0x62B0, +0xF8CD, +0x8000, +0x9601, +0x9702, +0x9603, +0xF7FF, +0xFE7A, +0xF8B4, +0x2042, +0x9501, +0x462B, +0xF6C1, +0x73FC, +0x0492, +0xF102, +0x52C0, +0x9300, +0x4620, +0x4633, +0x211D, +0x9702, +0x9603, +0xF7FF, +0xFE69, +0xF64F, +0x73FF, +0xF6C1, +0x6303, +0x9300, +0x4620, +0x462B, +0x211E, +0xF44F, +0x62E0, +0x9601, +0x9602, +0x9603, +0xF7FF, +0xFE5A, +0xF8B4, +0x2042, +0xF8CD, +0x8000, +0xB292, +0x462B, +0xF502, +0x62F0, +0x211F, +0x9601, +0x9702, +0x9603, +0x4620, +0xF7FF, +0xFE4B, +0xF44F, +0x436D, +0xF2CE, +0x0300, +0xF64F, +0x02FF, +0x68D9, +0x400A, +0xF042, +0x62BF, +0xF442, +0x3201, +0x60DA, +0x68DB, +0xF3C3, +0x2302, +0x9305, +0xF8B4, +0x317A, +0xB29B, +0xB21A, +0x42AA, +0xDB0E, +0x0952, +0xF44F, +0x4161, +0x3220, +0xF003, +0x031F, +0xF2CE, +0x0100, +0x409E, +0xF841, +0x6022, +0xF3BF, +0x8F4F, +0xF3BF, +0x8F6F, +0xF8B4, +0x317A, +0xB29B, +0xB21A, +0x2A00, +0xDB0C, +0x0952, +0xF44F, +0x4161, +0x3260, +0xF003, +0x031F, +0x2001, +0xF2CE, +0x0100, +0xFA00, +0xF303, +0xF841, +0x3022, +0x9A05, +0xF002, +0x0207, +0x1D11, +0xF1C2, +0x0307, +0x2B04, +0xBF28, +0x2304, +0x2906, +0xF04F, +0x0101, +0xFA01, +0xF303, +0xF103, +0x33FF, +0xBF8C, +0x3A03, +0x2200, +0xF003, +0x0305, +0x4093, +0x9304, +0xF8B4, +0x217A, +0x9904, +0xB292, +0xB213, +0x2B00, +0xDB32, +0xF103, +0x4360, +0xF503, +0x4361, +0x010A, +0xB2D2, +0xF883, +0x2300, +0xF8B4, +0x217A, +0xB292, +0xB213, +0x2B00, +0xDB0B, +0xF44F, +0x4161, +0xF002, +0x021F, +0x095B, +0x2001, +0xF2CE, +0x0100, +0xFA00, +0xF202, +0xF841, +0x2023, +0xF8D4, +0x3170, +0x781A, +0xF36F, +0x1286, +0x701A, +0xF8D4, +0x3170, +0x781A, +0x217F, +0xF36F, +0x0200, +0x2001, +0x701A, +0xF8A4, +0x104C, +0xB007, +0xE8BD, +0x83F0, +0xB29B, +0xB973, +0x2203, +0xF8A4, +0x2044, +0xE6B5, +0xF64E, +0x43FC, +0xF002, +0x020F, +0xF2CE, +0x0300, +0x4413, +0x0109, +0xB2CA, +0x761A, +0xE7C9, +0xB21B, +0xE6A8, +0xE92D, +0x4FF0, +0xF245, +0x12CE, +0xF2C2, +0x0200, +0xB087, +0xF245, +0x13D0, +0x8812, +0xF2C2, +0x0300, +0x9304, +0x9203, +0x9A04, +0xF245, +0x1BEE, +0x8812, +0xF2C2, +0x0B00, +0x9204, +0xF8BB, +0xB000, +0xF245, +0x2278, +0xF2C2, +0x0200, +0xF8A0, +0xB054, +0xF8C0, +0x2114, +0xF245, +0x0250, +0xF2C2, +0x0200, +0xF8C0, +0x2118, +0xF245, +0x13BA, +0xF245, +0x12F4, +0xF2C2, +0x0200, +0xF245, +0x1AC2, +0xF245, +0x2970, +0xF2C2, +0x0300, +0xF8C0, +0x211C, +0xF2C2, +0x0A00, +0xF2C2, +0x0900, +0xF245, +0x12D8, +0x881B, +0xF8BA, +0xA000, +0xF8B9, +0x9000, +0x9305, +0xF2C2, +0x0200, +0xF245, +0x2864, +0xF245, +0x1CB4, +0xF245, +0x14C6, +0xF8C0, +0x2120, +0xF2C2, +0x0800, +0xF2C2, +0x0C00, +0xF2C2, +0x0400, +0xF245, +0x022C, +0xF2C2, +0x0200, +0xF245, +0x1EBE, +0xF245, +0x17D4, +0xF245, +0x265C, +0xF245, +0x2566, +0xF245, +0x11CA, +0xF245, +0x13EC, +0xF8C0, +0x2124, +0xF8B8, +0x8000, +0xF8A0, +0xA128, +0x8824, +0xF8A0, +0x912A, +0xF8BC, +0xC000, +0x9402, +0xF2C2, +0x0E00, +0xF2C2, +0x0700, +0xF2C2, +0x0600, +0xF2C2, +0x0500, +0xF2C2, +0x0100, +0xF2C2, +0x0300, +0xF245, +0x296C, +0xF245, +0x1BF0, +0xF2C2, +0x0900, +0xF2C2, +0x0B00, +0xF8BE, +0xE000, +0x883F, +0x8836, +0x882D, +0x8809, +0x881B, +0xF8CD, +0x9004, +0xF8A0, +0x812C, +0xF8CD, +0xB000, +0xF8A0, +0xC12E, +0x9A02, +0xF8DD, +0xB00C, +0xF8A0, +0xE130, +0xF8A0, +0x7132, +0xF8A0, +0x6134, +0xF8A0, +0x5136, +0xF8A0, +0x2138, +0xF8A0, +0x113A, +0x9A04, +0xF8A0, +0xB13C, +0xF8DD, +0xB014, +0xF8A0, +0x213E, +0xF8A0, +0xB140, +0xF245, +0x2B9E, +0xF2C2, +0x0B00, +0xF8CD, +0xB008, +0xF8DD, +0xB004, +0xF8A0, +0x3142, +0xF8BB, +0xB000, +0xF245, +0x15C4, +0xF8CD, +0xB004, +0xF2C2, +0x0500, +0xF8DD, +0xB000, +0x882D, +0xF8BB, +0xB000, +0x9505, +0xF245, +0x276A, +0xF245, +0x2676, +0xF245, +0x2372, +0xF2C2, +0x0300, +0xF2C2, +0x0700, +0xF2C2, +0x0600, +0xF245, +0x2A62, +0xF245, +0x296E, +0xF245, +0x2868, +0xF245, +0x2C9C, +0xF245, +0x1ECC, +0xF245, +0x2174, +0xF245, +0x12D2, +0x881D, +0xF8CD, +0xB000, +0x9B02, +0x883F, +0x8836, +0xF8DD, +0xB004, +0x9703, +0xF2C2, +0x0A00, +0xF2C2, +0x0900, +0xF2C2, +0x0800, +0xF2C2, +0x0C00, +0xF2C2, +0x0E00, +0xF2C2, +0x0100, +0xF2C2, +0x0200, +0xF8BA, +0xA000, +0xF8B9, +0x9000, +0xF8B8, +0x8000, +0xF8BC, +0xC000, +0xF8BE, +0xE000, +0x9604, +0x8809, +0x881E, +0x8812, +0xF8A0, +0xB144, +0xF8DD, +0xB000, +0xF8A0, +0xB146, +0xF245, +0x1BB8, +0xF2C2, +0x0B00, +0xF245, +0x17BC, +0xF245, +0x13B6, +0xF8A0, +0xA148, +0xF2C2, +0x0700, +0xF8A0, +0x914A, +0xF8BB, +0xA000, +0xF8DD, +0x900C, +0xF8DD, +0xB010, +0xF8A0, +0x814C, +0xF2C2, +0x0300, +0xF245, +0x2860, +0xF8A0, +0xC14E, +0x883F, +0xF8A0, +0xE150, +0x881B, +0xF8A0, +0x9152, +0xF2C2, +0x0800, +0xF8A0, +0xB154, +0xF245, +0x1CC0, +0xF8DD, +0xB014, +0xF245, +0x2E5E, +0xF245, +0x19C8, +0xF2C2, +0x0C00, +0xF2C2, +0x0E00, +0xF2C2, +0x0900, +0xF8A0, +0xB156, +0xF8A0, +0x1158, +0xF8A0, +0x215A, +0xF8A0, +0x515C, +0xF8A0, +0x615E, +0xF8A0, +0x7160, +0xF8A0, +0x3162, +0xF8B8, +0x3000, +0xF8A0, +0xA164, +0xF8BC, +0x8000, +0xF8BE, +0xA000, +0xF8B9, +0xC000, +0xF8A0, +0x3166, +0xF44F, +0x7100, +0xF241, +0x6B7D, +0xF241, +0x6535, +0xF241, +0x6685, +0xF245, +0x5274, +0x2301, +0xF2C4, +0x0102, +0xF04F, +0x0E00, +0xF2C2, +0x0200, +0x27AC, +0xF2C2, +0x0B00, +0xF2C2, +0x0500, +0xF2C2, +0x0600, +0xF8A0, +0x8168, +0xF8A0, +0xA16A, +0xF8A0, +0xC16C, +0xF8C0, +0x1170, +0xF8A0, +0xE174, +0xF8A0, +0x3176, +0xF8A0, +0x3178, +0xF8A0, +0x717A, +0xF8C0, +0xB180, +0xF8C0, +0x517C, +0xF8C0, +0x6184, +0xF8C0, +0x2188, +0x4604, +0xF7FF, +0xFB26, +0x4620, +0xB007, +0xE8BD, +0x4FF0, +0xF7FF, +0xBCD2, +0xE92D, +0x4FF0, +0xF245, +0x4274, +0xF2C2, +0x0200, +0xB087, +0xF245, +0x43C6, +0x8812, +0xF2C2, +0x0300, +0x9304, +0x9203, +0x9A04, +0xF245, +0x4BBC, +0x8812, +0xF2C2, +0x0B00, +0x9204, +0xF8BB, +0xB000, +0xF245, +0x42F0, +0xF2C2, +0x0200, +0xF8A0, +0xB054, +0xF8C0, +0x2114, +0xF245, +0x22A0, +0xF2C2, +0x0200, +0xF8C0, +0x2118, +0xF245, +0x43AE, +0xF245, +0x4204, +0xF2C2, +0x0200, +0xF245, +0x4AC0, +0xF245, +0x49EA, +0xF2C2, +0x0300, +0xF8C0, +0x211C, +0xF2C2, +0x0A00, +0xF2C2, +0x0900, +0xF245, +0x42CC, +0x881B, +0xF8BA, +0xA000, +0xF8B9, +0x9000, +0x9305, +0xF2C2, +0x0200, +0xF245, +0x48B4, +0xF245, +0x4C78, +0xF245, +0x447E, +0xF8C0, +0x2120, +0xF2C2, +0x0800, +0xF2C2, +0x0C00, +0xF2C2, +0x0400, +0xF245, +0x4284, +0xF2C2, +0x0200, +0xF245, +0x4EE8, +0xF245, +0x477A, +0xF245, +0x4676, +0xF245, +0x45B2, +0xF245, +0x41B8, +0xF245, +0x43BA, +0xF8C0, +0x2124, +0xF8B8, +0x8000, +0xF8A0, +0xA128, +0x8824, +0xF8A0, +0x912A, +0xF8BC, +0xC000, +0x9402, +0xF2C2, +0x0E00, +0xF2C2, +0x0700, +0xF2C2, +0x0600, +0xF2C2, +0x0500, +0xF2C2, +0x0100, +0xF2C2, +0x0300, +0xF245, +0x49E2, +0xF245, +0x4BE4, +0xF2C2, +0x0900, +0xF2C2, +0x0B00, +0xF8BE, +0xE000, +0x883F, +0x8836, +0x882D, +0x8809, +0x881B, +0xF8CD, +0x9004, +0xF8A0, +0x812C, +0xF8CD, +0xB000, +0xF8A0, +0xC12E, +0x9A02, +0xF8DD, +0xB00C, +0xF8A0, +0xE130, +0xF8A0, +0x7132, +0xF8A0, +0x6134, +0xF8A0, +0x5136, +0xF8A0, +0x2138, +0xF8A0, +0x113A, +0x9A04, +0xF8A0, +0xB13C, +0xF8DD, +0xB014, +0xF8A0, +0x213E, +0xF8A0, +0xB140, +0xF245, +0x4B80, +0xF2C2, +0x0B00, +0xF8CD, +0xB008, +0xF8DD, +0xB004, +0xF8A0, +0x3142, +0xF8BB, +0xB000, +0xF245, +0x4570, +0xF8CD, +0xB004, +0xF2C2, +0x0500, +0xF8DD, +0xB000, +0x882D, +0xF8BB, +0xB000, +0x9505, +0xF245, +0x476E, +0xF245, +0x46BE, +0xF245, +0x43E0, +0xF2C2, +0x0300, +0xF2C2, +0x0700, +0xF2C2, +0x0600, +0xF245, +0x4AB0, +0xF245, +0x49AC, +0xF245, +0x4872, +0xF245, +0x4CA8, +0xF245, +0x4EAA, +0xF245, +0x41EC, +0xF245, +0x42B6, +0x881D, +0xF8CD, +0xB000, +0x9B02, +0x883F, +0x8836, +0xF8DD, +0xB004, +0x9703, +0xF2C2, +0x0A00, +0xF2C2, +0x0900, +0xF2C2, +0x0800, +0xF2C2, +0x0C00, +0xF2C2, +0x0E00, +0xF2C2, +0x0100, +0xF2C2, +0x0200, +0xF8BA, +0xA000, +0xF8B9, +0x9000, +0xF8B8, +0x8000, +0xF8BC, +0xC000, +0xF8BE, +0xE000, +0x9604, +0x8809, +0x881E, +0x8812, +0xF8A0, +0xB144, +0xF8DD, +0xB000, +0xF8A0, +0xB146, +0xF245, +0x4BC2, +0xF2C2, +0x0B00, +0xF245, +0x47E6, +0xF245, +0x43C4, +0xF8A0, +0xA148, +0xF2C2, +0x0700, +0xF8A0, +0x914A, +0xF8BB, +0xA000, +0xF8DD, +0x900C, +0xF8DD, +0xB010, +0xF8A0, +0x814C, +0xF2C2, +0x0300, +0xF245, +0x487C, +0xF8A0, +0xC14E, +0x883F, +0xF8A0, +0xE150, +0x881B, +0xF8A0, +0x9152, +0xF2C2, +0x0800, +0xF8A0, +0xB154, +0xF245, +0x4CC8, +0xF8DD, +0xB014, +0xF245, +0x4E82, +0xF245, +0x496C, +0xF2C2, +0x0C00, +0xF2C2, +0x0E00, +0xF2C2, +0x0900, +0xF8A0, +0xB156, +0xF8A0, +0x1158, +0xF8A0, +0x215A, +0xF8A0, +0x515C, +0xF8A0, +0x615E, +0xF8A0, +0x7160, +0xF8A0, +0x3162, +0xF8B8, +0x3000, +0xF8A0, +0xA164, +0xF8BC, +0x8000, +0xF8BE, +0xA000, +0xF8B9, +0xC000, +0xF8A0, +0x3166, +0xF44F, +0x7140, +0xF241, +0x6B81, +0xF241, +0x6559, +0xF241, +0x6689, +0xF645, +0x025C, +0x2302, +0xF2C4, +0x0102, +0xF04F, +0x0E80, +0xF2C2, +0x0200, +0x27AD, +0xF2C2, +0x0B00, +0xF2C2, +0x0500, +0xF2C2, +0x0600, +0xF8A0, +0x8168, +0xF8A0, +0xA16A, +0xF8A0, +0xC16C, +0xF8C0, +0x1170, +0xF8A0, +0xE174, +0xF8A0, +0x3176, +0xF8A0, +0x3178, +0xF8A0, +0x717A, +0xF8C0, +0xB180, +0xF8C0, +0x517C, +0xF8C0, +0x6184, +0xF8C0, +0x2188, +0x4604, +0xF7FF, +0xF99C, +0x4620, +0xB007, +0xE8BD, +0x4FF0, +0xF7FF, +0xBB48, +0xF7FF, +0xBB46, +0xF8B0, +0x204C, +0xB292, +0xB122, +0xF8B0, +0x210C, +0xB292, +0x2A01, +0xD000, +0x4770, +0x2200, +0xF8A0, +0x210C, +0xF7FF, +0xBB37, +0xBF00, +0x8803, +0xB29B, +0xB10B, +0x2003, +0x4770, +0xB672, +0x80C3, +0x8103, +0x8083, +0xB662, +0x2000, +0x4770, +0x8803, +0x3301, +0xB29B, +0x8003, +0x8883, +0xB29B, +0xB31B, +0x88C3, +0xB29B, +0x3301, +0xEB00, +0x03C3, +0x685B, +0x600B, +0x88C3, +0xB29B, +0x3301, +0xEB00, +0x03C3, +0x689B, +0x604B, +0x88C3, +0x3301, +0xB29B, +0x80C3, +0x88C2, +0x8843, +0xB292, +0xB29B, +0x429A, +0xBF24, +0x2300, +0x80C3, +0x8883, +0x3B01, +0xB29B, +0x8083, +0x8803, +0x3B01, +0xB29B, +0x8003, +0x2000, +0x4770, +0x8803, +0x3B01, +0xB29B, +0x8003, +0x2001, +0x4770, +0xBF00, +0x8803, +0x3301, +0xB29B, +0x8003, +0x8882, +0x8843, +0xB292, +0xB29B, +0x429A, +0xD023, +0x8903, +0x680A, +0xB29B, +0x3301, +0xEB00, +0x03C3, +0x605A, +0x8903, +0x684A, +0xB29B, +0x3301, +0xEB00, +0x03C3, +0x609A, +0x8903, +0x3301, +0xB29B, +0x8103, +0x8902, +0x8843, +0xB292, +0xB29B, +0x429A, +0xBF24, +0x2300, +0x8103, +0x8883, +0x3301, +0xB29B, +0x8083, +0x8803, +0x3B01, +0xB29B, +0x8003, +0x2000, +0x4770, +0x8803, +0x3B01, +0xB29B, +0x8003, +0x2002, +0x4770, +0xF8D0, +0x3188, +0x2201, +0x801A, +0xF8D0, +0x1188, +0x2300, +0x808B, +0xF8D0, +0x1188, +0xF8A1, +0x20D2, +0xF8D0, +0x2188, +0xF8A2, +0x30D4, +0x4770, +0xBF00, +0xF8D0, +0x3188, +0xB570, +0x881D, +0xB2AD, +0x2D02, +0xB082, +0x4604, +0xD001, +0xB002, +0xBD70, +0xF8D0, +0x3188, +0xF8B3, +0x30D4, +0xB29B, +0x2B01, +0xD1F6, +0xF8D0, +0x3188, +0x2600, +0x609E, +0xF8D0, +0x3188, +0xF8D3, +0x30C4, +0xF8D0, +0x0188, +0x4669, +0x3078, +0x4798, +0xB138, +0xF8D4, +0x3188, +0x801E, +0xF8D4, +0x3188, +0xF8A3, +0x50D4, +0xE7E0, +0xF8B4, +0x2042, +0xB292, +0x466B, +0xF502, +0x62F0, +0x4620, +0x210F, +0xF7FE, +0xFDFC, +0xE7D5, +0xBF00, +0xF8D0, +0x3188, +0xB510, +0x881B, +0xB29B, +0x2B01, +0xB084, +0x4604, +0xD001, +0xB004, +0xBD10, +0xF8D0, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD1F6, +0x211F, +0xAA01, +0xF7FE, +0xFDBA, +0xF8D4, +0x3188, +0x6F1B, +0xF8D4, +0x0188, +0xA901, +0x3020, +0x4798, +0x2800, +0xD0E8, +0xF8D4, +0x3188, +0x2205, +0xF8A3, +0x20D2, +0xF8D4, +0x3188, +0x2200, +0x801A, +0xE7DE, +0x1C4B, +0xB510, +0x4604, +0x2B20, +0xF200, +0x81E1, +0xE8DF, +0xF013, +0x0038, +0x01D4, +0x01D4, +0x01D4, +0x01D4, +0x01B9, +0x019E, +0x0183, +0x0168, +0x014D, +0x0132, +0x0117, +0x00FC, +0x01D4, +0x01D4, +0x00F2, +0x00DF, +0x00DA, +0x01D4, +0x00D5, +0x01D4, +0x00CB, +0x00C1, +0x00B7, +0x00AD, +0x00A3, +0x0099, +0x008F, +0x0085, +0x0079, +0x005E, +0x0021, +0x0043, +0xF8B0, +0x1174, +0xF246, +0x023C, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x33D8, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF246, +0x0356, +0xF2C2, +0x0300, +0x2100, +0x881A, +0xF8C4, +0x1110, +0x3201, +0x801A, +0xBD10, +0xF8B0, +0x1174, +0xF246, +0x0254, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x33F8, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x4620, +0xF7FF, +0xFF71, +0xE7D9, +0xF8B0, +0x1174, +0xF246, +0x023E, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x33B8, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x4620, +0xF7FE, +0xFFFA, +0xE7BE, +0xF8B0, +0x2174, +0xF241, +0x3398, +0xB292, +0x0152, +0xF2C4, +0x0302, +0x4413, +0x2203, +0x605A, +0xE7AD, +0xF8B0, +0x1174, +0xF246, +0x0250, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x3378, +0xE79A, +0xF8B0, +0x1174, +0xF246, +0x0248, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x3358, +0xE790, +0xF8B0, +0x1174, +0xF246, +0x024E, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x3338, +0xE786, +0xF8B0, +0x1174, +0xF246, +0x0246, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x3318, +0xE77C, +0xF8B0, +0x1174, +0xF246, +0x024C, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x23F8, +0xE772, +0xF8B0, +0x1174, +0xF246, +0x0244, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x23D8, +0xE768, +0xF8B0, +0x1174, +0xF246, +0x024A, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x23B8, +0xE75E, +0xF8B0, +0x1174, +0xF246, +0x0242, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x2398, +0xE754, +0xF8B0, +0x2174, +0xF241, +0x2358, +0xE7A2, +0xF8B0, +0x2174, +0xF241, +0x2318, +0xE79D, +0xF8B0, +0x2174, +0xF241, +0x13F8, +0xB292, +0x0152, +0xF2C4, +0x0302, +0x4413, +0x2203, +0x605A, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xF7FF, +0xFEA9, +0xE745, +0xF8B0, +0x1174, +0xF246, +0x0258, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x13D8, +0xE72D, +0xF8B0, +0x1174, +0xF246, +0x0238, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x1378, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x3108, +0xE720, +0xF8B0, +0x1174, +0xF246, +0x0260, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x1358, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x3100, +0xE705, +0xF8B0, +0x1174, +0xF246, +0x0236, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x1338, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x3106, +0xE6EA, +0xF8B0, +0x1174, +0xF246, +0x025E, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x1318, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x30FE, +0xE6CF, +0xF8B0, +0x1174, +0xF246, +0x0234, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x03F8, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x3104, +0xE6B4, +0xF8B0, +0x1174, +0xF246, +0x025C, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x03D8, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x30FC, +0xE699, +0xF8B0, +0x1174, +0xF246, +0x0262, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x03B8, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x3102, +0xE67E, +0xF8B0, +0x1174, +0xF246, +0x025A, +0xF2C2, +0x0200, +0xB289, +0xF241, +0x0398, +0x8810, +0x0149, +0xF2C4, +0x0302, +0x440B, +0x3001, +0x2103, +0x8010, +0x6059, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0xBF00, +0x2300, +0xF8A4, +0x30FA, +0xE663, +0xF8B0, +0x3174, +0xF246, +0x0252, +0xFA11, +0xF183, +0xF2C2, +0x0200, +0xF241, +0x0318, +0xE64A, +0xF246, +0x0340, +0xF2C2, +0x0300, +0x881A, +0x3201, +0x801A, +0xE650, +0xBF00, +0x2300, +0xF2C4, +0x0302, +0xF04F, +0x32FF, +0xF8C3, +0x21C0, +0xF8D3, +0x2180, +0xF002, +0x023F, +0x2A1F, +0xDD37, +0xF8D3, +0x2184, +0xF002, +0x023F, +0x2A1F, +0xDD20, +0xF8D3, +0x2188, +0xF002, +0x023F, +0x2A1F, +0xDD3B, +0xF8D3, +0x218C, +0xF002, +0x023F, +0x2A1F, +0xBFDF, +0xF8D3, +0x118C, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xBFCC, +0xF64F, +0x71FF, +0x3160, +0xF246, +0x40C8, +0xBFD8, +0xF8C3, +0x214C, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBDDC, +0xF8D3, +0x1184, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xF246, +0x40C8, +0x3120, +0xF8C3, +0x2144, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBDCB, +0xF8D3, +0x1180, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xF246, +0x40C8, +0xF8C3, +0x2140, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBDBB, +0xF8D3, +0x1188, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xF246, +0x40C8, +0x3140, +0xF8C3, +0x2148, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBDAA, +0x2300, +0xF2C4, +0x0302, +0xF04F, +0x32FF, +0xF8C3, +0x21C0, +0xF8D3, +0x2190, +0xF002, +0x023F, +0x2A1F, +0xDD37, +0xF8D3, +0x2194, +0xF002, +0x023F, +0x2A1F, +0xDD20, +0xF8D3, +0x2198, +0xF002, +0x023F, +0x2A1F, +0xDD3B, +0xF8D3, +0x219C, +0xF002, +0x023F, +0x2A1F, +0xBFDF, +0xF8D3, +0x119C, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xBFCC, +0xF64F, +0x71FF, +0x3160, +0xF246, +0x303C, +0xBFD8, +0xF8C3, +0x215C, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBD76, +0xF8D3, +0x1194, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xF246, +0x303C, +0x3120, +0xF8C3, +0x2154, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBD65, +0xF8D3, +0x1190, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xF246, +0x303C, +0xF8C3, +0x2150, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBD55, +0xF8D3, +0x1198, +0xF06F, +0x0201, +0xF001, +0x013F, +0x408A, +0xF246, +0x303C, +0x3140, +0xF8C3, +0x2158, +0xB209, +0xF2C2, +0x0000, +0xF7FF, +0xBD44, +0xF8D0, +0x3188, +0x699A, +0xF8D0, +0x3188, +0x899B, +0xB29B, +0x429A, +0xB430, +0xDC26, +0xF8D0, +0x4188, +0xF8D0, +0x3188, +0x699A, +0xF102, +0x056C, +0xEB04, +0x0445, +0x3201, +0x619A, +0x80A1, +0xF8D0, +0x4188, +0xF8D0, +0x2188, +0xF245, +0x5330, +0xF8B2, +0x00D0, +0xF2C2, +0x0300, +0xB280, +0x881A, +0x4041, +0x2310, +0x3B01, +0x07C8, +0xB29B, +0xBF4C, +0xEA82, +0x0151, +0x0849, +0x2B00, +0xD1F6, +0xF8A4, +0x10D0, +0xBC30, +0x4770, +0xF8D0, +0x3188, +0xF8B3, +0x30D0, +0xB29B, +0x428B, +0xF8D0, +0x3188, +0xF04F, +0x0200, +0x801A, +0xF8D0, +0x3188, +0xBF14, +0x2204, +0x2202, +0xF8A3, +0x20D2, +0xBC30, +0x4770, +0xBF00, +0xF8D0, +0x3188, +0x69DB, +0x2B00, +0xB430, +0x4601, +0xF8D0, +0x3188, +0xDB3E, +0x69DA, +0xF8D0, +0x3188, +0x89DB, +0xB29B, +0x429A, +0xF8D0, +0x3188, +0xDC20, +0x695A, +0xF8D0, +0x3188, +0x69D8, +0xF8D1, +0x5188, +0xF8D1, +0x3188, +0xF832, +0x0010, +0xF8B3, +0x30D0, +0xF245, +0x5230, +0xF2C2, +0x0200, +0xB29B, +0x8814, +0x4043, +0x2210, +0x3A01, +0xF013, +0x0F01, +0xB292, +0xBF14, +0xEA84, +0x0353, +0x085B, +0x2A00, +0xD1F5, +0xF8A5, +0x30D0, +0xE00D, +0x69DA, +0xF8D0, +0x3188, +0x89DB, +0xB29B, +0x3301, +0x429A, +0xBFDB, +0xF8D0, +0x3188, +0xF8B3, +0x00D0, +0x2000, +0xB280, +0xF8D1, +0x3188, +0x69DA, +0x3201, +0x61DA, +0xBC30, +0x4770, +0x89D8, +0xB280, +0xE7F5, +0xBF00, +0xF8D0, +0x3188, +0xF8D0, +0x2188, +0x8812, +0xB292, +0xB530, +0x805A, +0xF8D0, +0x3188, +0x689A, +0x3201, +0x609A, +0xF8D0, +0x3188, +0x889A, +0xF8D0, +0x3188, +0x885B, +0xB292, +0xB29B, +0x429A, +0xF8D0, +0x3188, +0xBF1F, +0x2201, +0x80DA, +0xF8D0, +0x3188, +0x2200, +0xBF0A, +0x2200, +0x609A, +0x80DA, +0xF8D0, +0x3188, +0xF8D0, +0x2188, +0x8852, +0xB292, +0x809A, +0xF8D0, +0x3188, +0x885B, +0xB29B, +0x2B01, +0xB083, +0x4604, +0xD077, +0xD365, +0x2B02, +0xD005, +0xF8D0, +0x3188, +0x2200, +0x801A, +0xB003, +0xBD30, +0xF8D0, +0x3188, +0x88DB, +0xB29B, +0x2B00, +0xF040, +0x810E, +0xF8D4, +0x3188, +0x689A, +0xF8D4, +0x3188, +0xF8D3, +0x30D8, +0x429A, +0xBF98, +0x2500, +0xF200, +0x80DD, +0xF8D4, +0x3188, +0x89DA, +0xF8D4, +0x3188, +0xB292, +0x69DB, +0x3201, +0x429A, +0x4620, +0xDBDF, +0xF8D4, +0x3188, +0xF8B3, +0x207C, +0xF8D4, +0x3188, +0xF8B3, +0x307A, +0xB292, +0xB29B, +0x429A, +0xD2D3, +0xF7FF, +0xFF4E, +0x4603, +0x4620, +0xF8AD, +0x3000, +0xF7FF, +0xFF48, +0x4603, +0x4620, +0xF8AD, +0x3002, +0xF7FF, +0xFF42, +0x4603, +0x4620, +0xF8AD, +0x3004, +0xF7FF, +0xFF3C, +0xF8AD, +0x0006, +0xF8D4, +0x3188, +0x8A1B, +0xB29B, +0x2B01, +0x4669, +0xD008, +0xF8D4, +0x3188, +0xF8D3, +0x30C8, +0xF8D4, +0x0188, +0x3078, +0x4798, +0xE7C2, +0xF8B4, +0x2042, +0xB292, +0x466B, +0xF502, +0x62F0, +0x4620, +0x210F, +0xF7FE, +0xF9EE, +0xF8D4, +0x3188, +0x821D, +0xE7B4, +0xF8D0, +0x3188, +0x88DB, +0xB29B, +0x2B00, +0xD099, +0xF8D0, +0x2188, +0x2300, +0xF8A2, +0x30D2, +0xF8D0, +0x2188, +0xF8A2, +0x30D4, +0xB003, +0xBD30, +0xF8D0, +0x2188, +0x88D2, +0xB292, +0x2A00, +0xF040, +0x8084, +0xF8D4, +0x3188, +0x689A, +0xF8D4, +0x3188, +0xF8D3, +0x30D8, +0x429A, +0xD923, +0xF8D4, +0x3188, +0x2200, +0x801A, +0xF8D4, +0x3188, +0x2203, +0xF8A3, +0x20D2, +0xE774, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD05A, +0xF8D4, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD032, +0xF8D4, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD038, +0xF8D4, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD03E, +0xF8D4, +0x3188, +0x6EDB, +0xF8D4, +0x0188, +0x4669, +0x3020, +0x4798, +0x2800, +0xF47F, +0xAF50, +0xF8D4, +0x3188, +0x6098, +0xF8D4, +0x3188, +0x699B, +0x2B00, +0xF8D4, +0x3188, +0xDAD0, +0xF8BD, +0x2000, +0xB2D2, +0x819A, +0xF8D4, +0x3188, +0x699A, +0x3201, +0x619A, +0xF8D4, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD1CC, +0xF8BD, +0x1002, +0x4620, +0xB289, +0xF7FF, +0xFE66, +0xF8D4, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD1C6, +0xF8BD, +0x1004, +0x4620, +0xB289, +0xF7FF, +0xFE59, +0xF8D4, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xD1C0, +0xF8BD, +0x1006, +0x4620, +0xB289, +0xF7FF, +0xFE4C, +0xE7B9, +0xF8BD, +0x1000, +0x4620, +0xB289, +0xF7FF, +0xFE45, +0xE79D, +0xF8D4, +0x3188, +0x2200, +0x801A, +0xF8D4, +0x3188, +0x2203, +0xF8A3, +0x20D4, +0xE703, +0xF8D0, +0x2188, +0xF8A2, +0x30D2, +0xF8D0, +0x3188, +0x2200, +0xF8A3, +0x20D4, +0xF8D0, +0x3188, +0x6F5B, +0xF8D0, +0x0188, +0x3020, +0x4798, +0xBB60, +0xF8D4, +0x2188, +0xF04F, +0x33FF, +0x6193, +0xF8D4, +0x2188, +0xF8A2, +0x30D0, +0xE760, +0xF8D0, +0x3188, +0x2200, +0xF8A3, +0x20D2, +0xF8D0, +0x3188, +0x2501, +0xF8A3, +0x50D4, +0xF8D0, +0x3188, +0xF8D3, +0x30CC, +0xF8D0, +0x0188, +0x3078, +0x4798, +0xF8D4, +0x3188, +0xB950, +0x821D, +0xF8D4, +0x2188, +0xF04F, +0x33FF, +0x61D3, +0xF8D4, +0x2188, +0xF8A2, +0x30D0, +0xE6D1, +0x22FF, +0x809A, +0xE6C5, +0xF8D4, +0x3188, +0x22FF, +0x809A, +0xE6C0, +0xBF00, +0xB538, +0xF8B0, +0x304C, +0xB29B, +0x4604, +0xB173, +0xF8D0, +0x10B8, +0xF246, +0x033A, +0xF2C2, +0x0300, +0x3901, +0x881A, +0xF8C0, +0x10B8, +0xF8D0, +0x50B8, +0x3201, +0x801A, +0xB105, +0xBD38, +0x2301, +0xF8C0, +0x30B8, +0xF7FE, +0xF943, +0x4620, +0xF7FF, +0xFE6A, +0xF8B4, +0x304C, +0xB29B, +0x2B00, +0xD0F1, +0xF8D4, +0x3170, +0x681B, +0x07DB, +0xBF41, +0xF8D4, +0x3170, +0x781A, +0xF365, +0x0200, +0x701A, +0xBD38, +0xBF00, +0xB538, +0x4608, +0x460D, +0x4611, +0x4614, +0xF7FD, +0xF85F, +0xB108, +0x200A, +0xBD38, +0xF64F, +0x73FF, +0x429C, +0xD005, +0x4620, +0xF7FD, +0xFA51, +0xB130, +0x2016, +0xBD38, +0x4628, +0xF7FD, +0xF9F9, +0x2800, +0xD1F8, +0x2000, +0xBD38, +0xBF00, +0xE92D, +0x43F0, +0xB083, +0x461C, +0xF8BD, +0x5028, +0xF8BD, +0x602C, +0x2300, +0x4688, +0x4617, +0x80E3, +0x80A3, +0x6023, +0x4681, +0xB145, +0x4631, +0x4628, +0xF7FD, +0xF836, +0xB180, +0x200A, +0xB003, +0xE8BD, +0x83F0, +0x4611, +0x4632, +0xF7FC, +0xFFF7, +0x2800, +0xD0F0, +0x2808, +0xBF14, +0x200C, +0x2000, +0xB003, +0xE8BD, +0x83F0, +0x9500, +0x4648, +0x4639, +0x4642, +0x4623, +0xF7FD, +0xF947, +0xB958, +0x2300, +0xF2C4, +0x0306, +0x6CDA, +0xF442, +0x7280, +0x64DA, +0x6CDA, +0xF442, +0x7200, +0x64DA, +0xE7E8, +0x201E, +0xE7E6, +0xE92D, +0x43F8, +0xF8BD, +0x4020, +0xF8BD, +0x5024, +0x460F, +0x4690, +0x4699, +0x4606, +0xB11C, +0xB16C, +0x2028, +0xE8BD, +0x83F8, +0x462A, +0x4641, +0xF7FC, +0xFFC5, +0xF64F, +0x73F7, +0x4003, +0xB113, +0x200C, +0xE8BD, +0x83F8, +0xF1B8, +0x0F00, +0xD014, +0x8838, +0x8833, +0x4283, +0xBF04, +0x1CB5, +0x2400, +0xD006, +0xE00F, +0xF837, +0x0F02, +0xF8B6, +0xC000, +0x4584, +0xD109, +0x3401, +0xB2A4, +0x45A0, +0x462E, +0xF105, +0x0502, +0xD8F2, +0x2000, +0xE8BD, +0x83F8, +0xF8A9, +0x0004, +0x8833, +0xF8C9, +0x6000, +0xF8A9, +0x3006, +0x2028, +0xE8BD, +0x83F8, +0xBF00, +0xB508, +0xF240, +0x0364, +0xF2C2, +0x0300, +0x2100, +0x88DB, +0xB29B, +0x22FF, +0x2B01, +0xE880, +0x0006, +0xD00D, +0xF246, +0x303C, +0xF2C2, +0x0000, +0xF7FE, +0xFFE1, +0xF645, +0x3338, +0xF2C2, +0x0300, +0x4618, +0x6CDB, +0x4798, +0xBD08, +0xF246, +0x40C8, +0xF2C2, +0x0000, +0xF7FE, +0xFE49, +0xE7F0, +0xF240, +0x0364, +0xF2C2, +0x0300, +0xB510, +0x88DB, +0xB29B, +0x2B01, +0xD015, +0xF246, +0x303C, +0xF2C2, +0x0000, +0xF7FF, +0xF94F, +0xF645, +0x3038, +0xF44F, +0x5340, +0xF2C2, +0x0000, +0xF2C4, +0x0309, +0xF246, +0x323C, +0x6D04, +0x6859, +0xF2C2, +0x0200, +0x47A0, +0xBD10, +0xF246, +0x40C8, +0xF2C2, +0x0000, +0xF7FF, +0xF939, +0xF645, +0x3038, +0xF44F, +0x5340, +0xF2C2, +0x0000, +0xF2C4, +0x0309, +0xF246, +0x42C8, +0x6D04, +0x6859, +0xF2C2, +0x0200, +0x47A0, +0xBD10, +0xBF00, +0xF240, +0x0364, +0xF2C2, +0x0300, +0x88DB, +0xB29B, +0x2B01, +0xD005, +0xF246, +0x303C, +0xF2C2, +0x0000, +0xF7FF, +0xBED2, +0xF246, +0x40C8, +0xF2C2, +0x0000, +0xF7FF, +0xBECC, +0x4770, +0xBF00, +0xE92D, +0x4FF0, +0x2300, +0xB083, +0x2001, +0x095A, +0x0092, +0xF102, +0x4260, +0xF502, +0x4261, +0xF003, +0x011F, +0xFA00, +0xF101, +0xF8C2, +0x1080, +0xF3BF, +0x8F4F, +0xF3BF, +0x8F6F, +0x3301, +0x2BC1, +0xF8C2, +0x1180, +0xD1EA, +0xF44F, +0x436D, +0xF2CE, +0x0300, +0xF240, +0x4200, +0xF2C2, +0x0200, +0x609A, +0x68D9, +0xF64F, +0x02FF, +0x400A, +0xF645, +0x3090, +0xF2C2, +0x0000, +0xF042, +0x62BF, +0xF442, +0x3201, +0x60DA, +0x68C3, +0x4798, +0xF44F, +0x5380, +0xF2C4, +0x0309, +0xF44F, +0x5100, +0x7B18, +0xF2C4, +0x0109, +0xF04F, +0x0B09, +0xF242, +0x720F, +0xF040, +0x0001, +0x7318, +0xF44F, +0x44E0, +0x609A, +0xF8C3, +0xB000, +0x7B08, +0xF2C4, +0x0401, +0x9400, +0xF44F, +0x4400, +0xF2C4, +0x0401, +0xF040, +0x0001, +0x9401, +0xF44F, +0x5240, +0x7308, +0xF248, +0x609F, +0x4694, +0xF2C0, +0x0001, +0xF2C4, +0x0209, +0x6088, +0xF44F, +0x4361, +0xF8C1, +0xB000, +0xF04F, +0x3BFF, +0xF8C2, +0xB008, +0xF2CE, +0x0300, +0xF04F, +0x0B01, +0xF8C2, +0xB000, +0xF44F, +0x3200, +0x605A, +0x2240, +0xF883, +0x2331, +0xF04F, +0x0A00, +0xF44F, +0x2280, +0xF44F, +0x5980, +0xF44F, +0x5800, +0xF44F, +0x4780, +0xF44F, +0x46A0, +0xF44F, +0x45C0, +0x605A, +0xF2C4, +0x0A01, +0xF2C4, +0x0901, +0xF2C4, +0x0801, +0xF2C4, +0x0C01, +0xF2C4, +0x0701, +0xF2C4, +0x0601, +0xF2C4, +0x0501, +0x2260, +0xF883, +0x2332, +0xF64F, +0x73FF, +0xF8CA, +0x3014, +0xF8C9, +0x3014, +0xF8C8, +0x3014, +0xF8CC, +0x3014, +0x617B, +0x6173, +0x616B, +0x9A00, +0xF44F, +0x4410, +0x6153, +0xF44F, +0x4020, +0xF44F, +0x4130, +0x9A01, +0xF2C4, +0x0401, +0xF2C4, +0x0001, +0xF2C4, +0x0101, +0x6153, +0x6163, +0x6143, +0x614B, +0xB003, +0xE8BD, +0x8FF0, +0xB508, +0xF645, +0x3390, +0xF2C2, +0x0300, +0x4618, +0x691B, +0x4798, +0xBD08, +0xBF00, +0xB508, +0xF645, +0x3390, +0xF2C2, +0x0300, +0x4618, +0x699B, +0x4798, +0xBD08, +0xBF00, +0xB508, +0xF645, +0x3390, +0xF2C2, +0x0300, +0x4618, +0x695B, +0x4798, +0xBD08, +0xBF00, +0xF24F, +0x0201, +0x2300, +0xF8A0, +0x2044, +0x6403, +0x4770, +0xBF00, +0xF246, +0x0398, +0xF2C2, +0x0300, +0xB410, +0x881A, +0x3201, +0xB2D2, +0x801A, +0x885A, +0x8819, +0xB289, +0xEB03, +0x0141, +0x8889, +0x440A, +0xB2D2, +0x805A, +0x881A, +0xB292, +0xEB03, +0x0242, +0x8891, +0x881A, +0x8858, +0xB280, +0xEB03, +0x0040, +0xB292, +0x8880, +0xEB03, +0x0242, +0xB280, +0x8090, +0x885A, +0xB292, +0xEB03, +0x0242, +0xB2C9, +0x8091, +0x881A, +0xB292, +0xEB03, +0x0242, +0x8892, +0x8859, +0xB289, +0xEB03, +0x0141, +0x8889, +0x440A, +0xB2D2, +0xEB03, +0x0242, +0x8892, +0x8819, +0x3101, +0xB2C9, +0x8019, +0x8859, +0x8818, +0xB280, +0xEB03, +0x0040, +0x8880, +0x4401, +0xB2C9, +0x8059, +0x8819, +0xB289, +0xEB03, +0x0141, +0x8888, +0x8819, +0x885C, +0xB2A4, +0xEB03, +0x0444, +0xB289, +0x88A4, +0xEB03, +0x0141, +0xB2A4, +0x808C, +0x8859, +0xB289, +0xEB03, +0x0141, +0xB2C0, +0x8088, +0x8819, +0xF85D, +0x4B04, +0xB289, +0xEB03, +0x0141, +0x8889, +0x8858, +0xB280, +0xEB03, +0x0040, +0x8880, +0x4401, +0xB2C9, +0xEB03, +0x0341, +0x8898, +0xEB02, +0x2000, +0xB280, +0x4770, +0xBF00, +0xF246, +0x0198, +0xB5F8, +0xF2C2, +0x0100, +0x2300, +0xEB01, +0x0243, +0xB29C, +0x3301, +0xF5B3, +0x7F80, +0x8094, +0xD1F7, +0x2300, +0x461D, +0xEB01, +0x0243, +0xF003, +0x040F, +0x8896, +0x5D04, +0x8897, +0xFA14, +0xF486, +0x4425, +0xB2ED, +0xEB01, +0x0645, +0x3301, +0xF8B6, +0xE004, +0xB2FF, +0xFA1F, +0xFE8E, +0xF246, +0x0498, +0xF5B3, +0x7F80, +0xF8A2, +0xE004, +0xF2C2, +0x0400, +0x80B7, +0xD1E2, +0x2300, +0x8023, +0xF44F, +0x6500, +0x8063, +0x3D01, +0xB2AD, +0xF7FF, +0xFF5A, +0x2D00, +0xD1F9, +0xBDF8, +0xBF00, +0x8803, +0xE92D, +0x4FF0, +0xB29B, +0x4604, +0x8043, +0x8880, +0x8863, +0xB280, +0xB29B, +0x4298, +0xB08F, +0x4615, +0xD039, +0x2301, +0x2600, +0x2700, +0x80E3, +0xE9C4, +0x6704, +0x8863, +0xB29B, +0x80A3, +0xE9D4, +0x6704, +0x68A3, +0x1A5B, +0x18F6, +0xF147, +0x0700, +0xE9C4, +0x6704, +0x60A1, +0x8863, +0xB29B, +0x2B03, +0xF000, +0x8089, +0xD919, +0x2B05, +0xD04C, +0xD37B, +0x2BFA, +0xD01E, +0x2BFF, +0xF040, +0x80BA, +0xF44F, +0x5640, +0xF2C4, +0x0609, +0x88E3, +0x6873, +0xB29B, +0xF8AD, +0x3036, +0xF8BD, +0x3036, +0xB29B, +0x2B00, +0xF040, +0x80C7, +0xB00F, +0xE8BD, +0x8FF0, +0x2B01, +0xD05C, +0xD844, +0x88E3, +0xB00F, +0xE8BD, +0x8FF0, +0x2300, +0x80E3, +0xE7C8, +0x88E3, +0xB29B, +0x2B00, +0xD0EE, +0xF240, +0x0364, +0xF2C2, +0x0300, +0xF248, +0x521F, +0x88DB, +0xB29B, +0x2B01, +0xF44F, +0x5340, +0xF2C4, +0x0309, +0xF2C5, +0x12EB, +0x685B, +0xF000, +0x808D, +0xFBA2, +0x9203, +0x0912, +0x2132, +0xFB01, +0x3212, +0xF246, +0x333C, +0xF2C2, +0x0300, +0x323C, +0xB292, +0x4618, +0xF8A3, +0x2042, +0xF7FE, +0xFF1A, +0x2300, +0x8323, +0x8023, +0xE7C7, +0x88E3, +0xE9D4, +0x2304, +0xF249, +0x6080, +0xF2C0, +0x0098, +0x2100, +0x4299, +0xBF08, +0x4290, +0xD2BB, +0xF245, +0x5334, +0xF2C2, +0x0300, +0x68DB, +0x4798, +0xE7B4, +0x88E3, +0xB29B, +0x2B00, +0xF040, +0x8186, +0xF8B4, +0x2046, +0xF246, +0x209C, +0xB292, +0xF2C2, +0x0000, +0x2100, +0xF7FF, +0xFCDE, +0x8B23, +0x2800, +0xD140, +0x2202, +0xF362, +0x2309, +0x8323, +0xE79D, +0x88E2, +0x2300, +0x8323, +0xB00F, +0xE8BD, +0x8FF0, +0x88E3, +0x8B23, +0x2202, +0xF362, +0x2309, +0x8323, +0xB00F, +0xE8BD, +0x8FF0, +0x88E3, +0xB29B, +0x2B00, +0xF040, +0x81C5, +0x69A3, +0xF3C3, +0x2301, +0x2B02, +0xD084, +0xF8D5, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B01, +0xF43F, +0xAF7D, +0xF8D5, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B02, +0xF8D5, +0x3188, +0xF000, +0x81B9, +0xF8B3, +0x30D2, +0xB29B, +0x2B04, +0xD02F, +0xF8D5, +0x3188, +0xF8B3, +0x30D2, +0xB29B, +0x2B03, +0x8B23, +0xBF04, +0xF443, +0x4380, +0x8323, +0xD002, +0xF443, +0x4300, +0x8323, +0x8B23, +0x2202, +0xF362, +0x2309, +0x2200, +0x8323, +0x8022, +0xB00F, +0xE8BD, +0x8FF0, +0x23FF, +0x8023, +0xB00F, +0xE8BD, +0x8FF0, +0xFBA2, +0x8203, +0x2132, +0x0912, +0xFB01, +0x3212, +0xF246, +0x43C8, +0xF2C2, +0x0300, +0x323C, +0xB292, +0x4618, +0xF8A3, +0x2042, +0xF7FE, +0xFE8D, +0xE771, +0x8B23, +0xF443, +0x5380, +0x8323, +0xE7D9, +0xF8BD, +0x0036, +0x4FBD, +0xB280, +0xF001, +0xF8E5, +0xF107, +0x0510, +0xF001, +0xF8EB, +0xB280, +0xF8AD, +0x0036, +0xF8BD, +0x3036, +0xB29B, +0xB15B, +0x2300, +0x6872, +0xB2D2, +0xF88D, +0x2035, +0xF8BD, +0x2036, +0x3301, +0xB29B, +0xB292, +0x429A, +0xD8F4, +0xF89D, +0x3035, +0xF807, +0x3F01, +0x42AF, +0xD1E4, +0xF246, +0x20D4, +0xF2C2, +0x0000, +0xF246, +0x352C, +0xF2C2, +0x0500, +0xF000, +0xFF48, +0xF246, +0x20D4, +0x2210, +0x4629, +0xF2C2, +0x0000, +0xF246, +0x0688, +0xF2C2, +0x0600, +0xF000, +0xFF56, +0xF246, +0x21D4, +0x4630, +0xF2C2, +0x0100, +0xF000, +0xFF97, +0xF896, +0xB00C, +0xF896, +0x9002, +0xF8CD, +0xB01C, +0xF896, +0xB00B, +0xF896, +0x8001, +0xF896, +0xA000, +0xF8CD, +0xB018, +0xEA4F, +0x4B09, +0xF896, +0xC003, +0x7A71, +0x79B7, +0x7AB3, +0x7970, +0xF896, +0xE004, +0x7A32, +0x9105, +0xEB0B, +0x2B08, +0x44D3, +0xEB0B, +0x6B0C, +0xF8C4, +0xB01C, +0xF896, +0xB00E, +0x79F1, +0xF8CD, +0xB010, +0xF896, +0xB00D, +0x7BF6, +0xF8CD, +0xB020, +0x9609, +0x043E, +0xEB06, +0x2600, +0xEA6F, +0x0909, +0xEA6F, +0x0C0C, +0x4476, +0xEB06, +0x6601, +0xF885, +0x9002, +0x43C9, +0xF8DD, +0x9010, +0xF885, +0xC003, +0xF8DD, +0xC014, +0x910B, +0xEA6F, +0x0A0A, +0xEA6F, +0x0808, +0x43C0, +0x0419, +0xF885, +0xA000, +0xF885, +0x8001, +0xF8DD, +0xA01C, +0x9003, +0xEB01, +0x210C, +0x9806, +0x960A, +0xEA4F, +0x4809, +0xEA6F, +0x0E0E, +0x4411, +0xEB08, +0x280B, +0xEB01, +0x6100, +0xEA6F, +0x060C, +0x43FF, +0xEA6F, +0x0C00, +0xF885, +0xE004, +0x9809, +0xEA6F, +0x0E0A, +0x44D0, +0xF8DD, +0xA020, +0x71AF, +0x9F0B, +0xF885, +0xC00B, +0xEA6F, +0x0B09, +0xEB08, +0x6800, +0xEA6F, +0x090A, +0xEA6F, +0x0A00, +0x9803, +0x71EF, +0x9F0A, +0x7168, +0xF246, +0x20D4, +0x43DB, +0x43D2, +0x6227, +0xF2C2, +0x0000, +0x6261, +0xF8C4, +0x8028, +0x72AB, +0xF885, +0xE00C, +0x722A, +0x726E, +0xF885, +0x900D, +0xF885, +0xB00E, +0xF885, +0xA00F, +0xF000, +0xFEA7, +0xF246, +0x20D4, +0x2210, +0x4629, +0xF2C2, +0x0000, +0xF000, +0xFEB9, +0xF246, +0x20B4, +0xF246, +0x21D4, +0xF2C2, +0x0000, +0xF2C2, +0x0100, +0xF000, +0xFEF7, +0xF246, +0x22B4, +0xF2C2, +0x0200, +0x2600, +0x5D93, +0x55AB, +0x3601, +0x2E10, +0xD1FA, +0xF246, +0x20D4, +0xF2C2, +0x0000, +0xF000, +0xFE85, +0xF246, +0x20D4, +0xF246, +0x312C, +0x4632, +0xF2C2, +0x0000, +0xF2C2, +0x0100, +0xF000, +0xFE94, +0xF246, +0x20A4, +0xF246, +0x21D4, +0xF2C2, +0x0000, +0xF2C2, +0x0100, +0xF000, +0xFED2, +0xF246, +0x20A4, +0xF2C2, +0x0000, +0xF7FF, +0xFDB6, +0x2300, +0x8323, +0x8023, +0xE629, +0x8B22, +0x2301, +0xF363, +0x2209, +0x2100, +0xF246, +0x20A4, +0x8322, +0xF2C2, +0x0000, +0xF8A4, +0x3048, +0x6421, +0xF7FF, +0xFDA3, +0xF246, +0x23B4, +0xF2C2, +0x0300, +0x6AE1, +0x781A, +0x785D, +0x78DE, +0x7898, +0xF893, +0xB005, +0xF893, +0x9004, +0xF893, +0xA007, +0x799F, +0xF893, +0x8009, +0xF893, +0xC008, +0xF893, +0xE00B, +0xEB02, +0x2505, +0xF246, +0x22C4, +0xF2C2, +0x0200, +0x4069, +0xB289, +0x8011, +0x6AE5, +0x7A99, +0xEB00, +0x2006, +0xEA80, +0x4015, +0xB280, +0x8050, +0x6B20, +0x7B5E, +0x7B1D, +0xEB09, +0x290B, +0xEA89, +0x0000, +0xB280, +0x8090, +0xF8D4, +0x9030, +0x7BD8, +0x7B9B, +0xEB07, +0x270A, +0xEA87, +0x4719, +0xB2BF, +0x80D7, +0x6B67, +0xEB0C, +0x2C08, +0xEA8C, +0x0707, +0xB2BF, +0x8117, +0x6B67, +0xEB01, +0x210E, +0xEA81, +0x4117, +0xB289, +0x8151, +0x6BA1, +0xEB05, +0x2506, +0x4069, +0xB289, +0x8191, +0x6BA1, +0xEB03, +0x2300, +0xEA83, +0x4311, +0xB29B, +0x81D3, +0xE614, +0x8B23, +0x2201, +0xF362, +0x2309, +0x8323, +0x4628, +0xF7FE, +0xFD8F, +0xE631, +0x632B, +0x2000, +0x2700, +0x899B, +0x463E, +0x46A1, +0xF8D5, +0x4188, +0xF8D5, +0x3188, +0x376C, +0x007F, +0x443B, +0x4427, +0xF8B3, +0x8004, +0xF7FF, +0xFCC2, +0xFA1F, +0xF888, +0xEA88, +0x0000, +0xFA1F, +0xF880, +0xF8A7, +0x8004, +0xF8D5, +0x3188, +0x899B, +0x3601, +0xB2B6, +0xB29B, +0x42B3, +0x4637, +0xDAE2, +0xF8D9, +0x003C, +0xF8D5, +0x1188, +0xF8D5, +0x3188, +0x899A, +0xF8B9, +0x6046, +0xB292, +0xB2B6, +0x2700, +0xF246, +0x239C, +0x9601, +0x31DC, +0x3201, +0x9700, +0xF2C2, +0x0300, +0xF7FF, +0xFAD7, +0x464C, +0x4606, +0xB178, +0xF8B9, +0x3018, +0xF443, +0x4300, +0xF8A9, +0x3018, +0xF8B9, +0x3018, +0x2202, +0xF362, +0x2309, +0xF8A9, +0x3018, +0xF8A9, +0x7000, +0xE56F, +0xF8D9, +0x003C, +0xF8D5, +0x1188, +0xF8D5, +0x3188, +0x899A, +0xF8B9, +0x7046, +0x9600, +0xB292, +0xB2BF, +0xF246, +0x239C, +0x31DC, +0x3201, +0x9701, +0xF2C2, +0x0300, +0xF7FF, +0xFAEB, +0xB9A8, +0xF8D5, +0x2188, +0x8992, +0x4603, +0x6C22, +0x6BE1, +0xF831, +0x1013, +0x3101, +0xFA12, +0xF281, +0x6422, +0xF8D5, +0x2188, +0x8992, +0x3301, +0xB29B, +0xB292, +0x429A, +0xDAEF, +0x8B23, +0xE5A0, +0xF8B9, +0x3018, +0xF443, +0x4300, +0xF8A9, +0x3018, +0xF8B9, +0x3018, +0x2202, +0xF362, +0x2309, +0xF8A9, +0x3018, +0xF8A9, +0x6000, +0xE533, +0xB430, +0xF44F, +0x5380, +0xF2C4, +0x0308, +0x2102, +0x6B5A, +0xF361, +0x2209, +0x635A, +0x6B5A, +0x2501, +0xF365, +0x621D, +0x635A, +0x6B5A, +0xF442, +0x3280, +0x635A, +0x6B5A, +0xF042, +0x0210, +0x635A, +0x6B58, +0xF44F, +0x5240, +0xF2C4, +0x0208, +0xF248, +0x64A0, +0xF24E, +0x5151, +0x4328, +0xF365, +0x441F, +0xF6C1, +0x21CC, +0x6358, +0xF8C2, +0x1C00, +0x6014, +0x7A13, +0x432B, +0x7213, +0x7A13, +0xF043, +0x0302, +0x7213, +0xF8C2, +0x1C00, +0xBC30, +0x4770, +0xF44F, +0x5340, +0xF2C4, +0x0308, +0xF24E, +0x5251, +0xF6C1, +0x22CC, +0xF8C3, +0x2C00, +0x7A19, +0xF36F, +0x0100, +0x7219, +0x7A19, +0xF36F, +0x0141, +0x7219, +0xF8C3, +0x2C00, +0x4770, +0xBF00, +0xF44F, +0x5340, +0xF2C4, +0x0308, +0xF24E, +0x5251, +0xF6C1, +0x22CC, +0xF641, +0x514C, +0xF8C3, +0x2C00, +0x6019, +0xF8C3, +0x2C00, +0x4770, +0xB672, +0xF44F, +0x5280, +0xF2C4, +0x0208, +0x2402, +0x6B53, +0xF364, +0x2309, +0x6353, +0x6B53, +0x2601, +0xF366, +0x631D, +0x6353, +0x6B53, +0xF443, +0x3380, +0x6353, +0x6B53, +0xF043, +0x0310, +0x6353, +0x6B50, +0xF44F, +0x5340, +0xF2C4, +0x0308, +0xF248, +0x65A0, +0xF24E, +0x5151, +0xF6C1, +0x21CC, +0x4330, +0xF366, +0x451F, +0x6350, +0xF8C3, +0x1C00, +0x601D, +0x7A1A, +0x4332, +0x721A, +0x7A1A, +0x4322, +0x721A, +0xF8C3, +0x1C00, +0xF8C3, +0x1C00, +0x601C, +0xF8C3, +0x1C00, +0xE7FE, +0xBF00, +0xB5F8, +0xB672, +0xF7FD, +0xF966, +0xF7FC, +0xFC50, +0xF240, +0x7044, +0xF640, +0x32DC, +0xF2C2, +0x0000, +0xF2C2, +0x0200, +0xF240, +0x7144, +0x1A12, +0xF2C2, +0x0100, +0xF000, +0xFD57, +0xF240, +0x0464, +0xF240, +0x4000, +0xF240, +0x7244, +0xF2C2, +0x0000, +0xF2C2, +0x0200, +0xF240, +0x4100, +0xF2C2, +0x0400, +0x1A12, +0xF2C2, +0x0100, +0xF000, +0xFD44, +0x8822, +0xF241, +0x2334, +0xB292, +0x429A, +0xD00D, +0x2278, +0x2303, +0x2100, +0x2001, +0x80E0, +0x81A1, +0x8062, +0x80A3, +0x8122, +0x8163, +0xF7FD, +0xF948, +0xF7FD, +0xF958, +0x8863, +0xF246, +0x47C8, +0xF2C2, +0x0700, +0xB29B, +0xF8A7, +0x3042, +0x88A3, +0xB29B, +0xF8A7, +0x3044, +0x8923, +0xF246, +0x363C, +0xF2C2, +0x0600, +0xB29B, +0xF8A6, +0x3042, +0x8963, +0xB29B, +0xF8A6, +0x3044, +0x88E2, +0xF240, +0x0364, +0xB292, +0xF2C2, +0x0300, +0x2101, +0xB32A, +0x2200, +0x80D9, +0x819A, +0xF645, +0x35AC, +0xF2C2, +0x0500, +0x2200, +0x68EB, +0x8022, +0x4628, +0x4798, +0xB662, +0x2126, +0x2200, +0x2301, +0xF246, +0x046A, +0x61F9, +0xF2C2, +0x0400, +0x623A, +0xF8A7, +0x3062, +0x61F1, +0x6232, +0xF8A6, +0x3062, +0x8822, +0x692B, +0x3201, +0xF645, +0x30AC, +0x8022, +0xF2C2, +0x0000, +0x4798, +0xE7F5, +0x80DA, +0x8199, +0xE7D9, +0xBF00, +0xB538, +0xF44F, +0x5540, +0xF2C4, +0x0509, +0xF246, +0x0464, +0xF645, +0x30AC, +0x686B, +0xF2C2, +0x0000, +0xF2C2, +0x0400, +0x6023, +0x6983, +0x4798, +0xF246, +0x036C, +0xF2C2, +0x0300, +0x6820, +0x881A, +0x3201, +0x801A, +0x6869, +0xF246, +0x0270, +0xF2C2, +0x0200, +0xF44F, +0x5300, +0xF2C4, +0x0309, +0x1A41, +0x8011, +0x7B1A, +0xF042, +0x0201, +0x731A, +0xBD38, +0xBF00, +0xB538, +0xF44F, +0x5540, +0xF2C4, +0x0509, +0xF246, +0x0474, +0xF645, +0x30AC, +0x686B, +0xF2C2, +0x0000, +0xF2C2, +0x0400, +0x6023, +0x6943, +0x4798, +0xF246, +0x036E, +0xF2C2, +0x0300, +0x6820, +0x881A, +0x3201, +0x801A, +0x6869, +0xF246, +0x0268, +0xF2C2, +0x0200, +0xF44F, +0x5380, +0xF2C4, +0x0309, +0x1A41, +0x8011, +0x7B1A, +0xF042, +0x0201, +0x731A, +0xBD38, +0xBF00, +0xB430, +0xB192, +0x4603, +0x2400, +0x680D, +0x5505, +0xF851, +0x5B04, +0x0A2D, +0x705D, +0xF831, +0x5C02, +0x709D, +0xF811, +0x5C01, +0x3404, +0x42A2, +0x70DD, +0xF103, +0x0304, +0xD8EE, +0xBC30, +0x4770, +0xBF00, +0xE92D, +0x4FF0, +0x6802, +0x4603, +0x3004, +0xE890, +0x1081, +0xB093, +0x2500, +0x9201, +0x460C, +0x9500, +0x462A, +0x78A5, +0xF894, +0x8001, +0xF811, +0xE002, +0x78E6, +0x042D, +0xEA45, +0x2508, +0xEA45, +0x050E, +0xEA45, +0x6506, +0xAE02, +0x3404, +0x50B5, +0x3204, +0x2A40, +0xD1EC, +0x9200, +0xF24A, +0x4178, +0x9A02, +0x9E01, +0xF2CD, +0x716A, +0xEA2C, +0x0500, +0xEA07, +0x0400, +0x4411, +0x4431, +0xEA45, +0x0E04, +0x9A03, +0x9D04, +0x448E, +0xF24B, +0x7156, +0xEB00, +0x6E7E, +0xF6CE, +0x01C7, +0xEA27, +0x060E, +0xEA0E, +0x0400, +0x4411, +0x4334, +0xEB01, +0x060C, +0x4426, +0xF247, +0x01DB, +0xEB0E, +0x5636, +0xF2C2, +0x4120, +0xEA20, +0x0206, +0xEA06, +0x040E, +0x4429, +0x4314, +0x19CD, +0x4425, +0xF64C, +0x61EE, +0x9C05, +0xEB06, +0x35F5, +0xF2CC, +0x11BD, +0xEA2E, +0x0805, +0xEA05, +0x0206, +0x4421, +0x4401, +0xEA48, +0x0402, +0x440C, +0xF640, +0x78AF, +0x9906, +0x9A07, +0xEB05, +0x24B4, +0xF2CF, +0x587C, +0xEA26, +0x0A04, +0x4488, +0xEA04, +0x0905, +0xEA4A, +0x0909, +0x44C6, +0x44CE, +0xF24C, +0x682A, +0xEB04, +0x617E, +0xF2C4, +0x7887, +0xEA25, +0x0A01, +0x4490, +0xEA01, +0x0904, +0xEA4A, +0x0909, +0x4446, +0x444E, +0xEB01, +0x5E36, +0xF244, +0x6813, +0x9E08, +0x9A09, +0xF6CA, +0x0830, +0xEA24, +0x0A0E, +0x44B0, +0xEA0E, +0x0901, +0xEA4A, +0x0909, +0x4445, +0x444D, +0xF249, +0x5801, +0xEB0E, +0x36F5, +0xF6CF, +0x5846, +0xEA21, +0x0A06, +0x4490, +0xEA06, +0x090E, +0xEA4A, +0x0909, +0x4444, +0x444C, +0xEB06, +0x25B4, +0xF649, +0x08D8, +0x9C0A, +0x9A0C, +0xF6C6, +0x1880, +0xEA2E, +0x0A05, +0x44A0, +0xEA05, +0x0906, +0xEA4A, +0x0909, +0x4441, +0x4449, +0xEB05, +0x6471, +0xF24F, +0x78AF, +0x990B, +0xF6C8, +0x3844, +0xEA26, +0x0A04, +0x4488, +0xEA04, +0x0905, +0xEA4A, +0x0909, +0x44C6, +0x44CE, +0xEB04, +0x513E, +0xF5A2, +0x4E24, +0xEA25, +0x0901, +0xEA01, +0x0804, +0xF1AE, +0x0E4F, +0x4476, +0xEA49, +0x0E08, +0x44B6, +0xF24D, +0x78BE, +0x9E0D, +0x9A0E, +0xEB01, +0x3EFE, +0xF6C8, +0x185C, +0xEA24, +0x0A0E, +0x44B0, +0xEA0E, +0x0901, +0xEA4A, +0x0909, +0x4445, +0x444D, +0xF241, +0x1822, +0xEB0E, +0x26B5, +0xF6C6, +0x3890, +0xEA21, +0x0A06, +0x4490, +0xEA06, +0x090E, +0xEA4A, +0x0909, +0x4444, +0x444C, +0xEB06, +0x6574, +0xF247, +0x1893, +0x9C0F, +0x9A11, +0xF6CF, +0x5898, +0xEA2E, +0x0A05, +0x44A0, +0xEA05, +0x0906, +0xEA4A, +0x0909, +0x4441, +0x4449, +0xEB05, +0x5431, +0xF244, +0x388E, +0x9910, +0xEA6F, +0x0904, +0xF2CA, +0x6879, +0xEA09, +0x0B06, +0x4488, +0xEA04, +0x0A05, +0xEA4B, +0x0A0A, +0x44C6, +0x44D6, +0xEB04, +0x31FE, +0xF640, +0x0E21, +0xEA6F, +0x0801, +0xF6C4, +0x1EB4, +0xEA08, +0x0B05, +0x4496, +0xEA01, +0x0A04, +0xEA4B, +0x0A0A, +0x4476, +0x9A03, +0x4456, +0xF242, +0x5E62, +0xEB01, +0x26B6, +0xF2CF, +0x6E1E, +0xEA06, +0x0A04, +0xEA01, +0x0909, +0x4496, +0xEA4A, +0x0909, +0x44AE, +0x9A08, +0x44CE, +0xF24B, +0x3B40, +0xEB06, +0x6EFE, +0xF2CC, +0x0B40, +0xEA0E, +0x0501, +0x4493, +0xEA06, +0x0808, +0xEA45, +0x0808, +0x445C, +0x9A0D, +0x4444, +0xF645, +0x2551, +0xEB0E, +0x54F4, +0xF2C2, +0x655E, +0xEA04, +0x0906, +0x4415, +0xEA2E, +0x0806, +0xEA49, +0x0808, +0x4429, +0x9A02, +0x4441, +0xF24C, +0x75AA, +0xEB04, +0x41B1, +0xF6CE, +0x15B6, +0xEA01, +0x090E, +0x4415, +0xEA24, +0x080E, +0xEA49, +0x0808, +0x442E, +0x9A07, +0x4446, +0xF241, +0x055D, +0xEB01, +0x3636, +0xF2CD, +0x652F, +0xEA06, +0x0A04, +0x4415, +0xEA21, +0x0904, +0xEA4A, +0x0909, +0x44AE, +0x44CE, +0x9D0C, +0x9A11, +0xF241, +0x4953, +0xEB06, +0x68FE, +0xF2C0, +0x2944, +0xEA08, +0x0A01, +0x44A9, +0xEA26, +0x0E01, +0xEA4A, +0x0E0E, +0x444C, +0x4474, +0xF24E, +0x6E81, +0xEB08, +0x55F4, +0xF6CD, +0x0EA1, +0xEA05, +0x0A06, +0x4496, +0xEA28, +0x0906, +0xEA4A, +0x0909, +0x4471, +0x4449, +0xEB05, +0x44B1, +0xF64F, +0x3EC8, +0x9906, +0x9A0B, +0xF2CE, +0x7ED3, +0xEA04, +0x0A08, +0x448E, +0xEA25, +0x0908, +0xEA4A, +0x0909, +0x4476, +0x444E, +0xF64C, +0x59E6, +0xEB04, +0x3136, +0xF2C2, +0x19E1, +0xEA01, +0x0A05, +0x4491, +0xEA24, +0x0605, +0xEA4A, +0x0606, +0x44C8, +0x44B0, +0xF240, +0x79D6, +0x9E10, +0x9A05, +0xEB01, +0x6EF8, +0xF2CC, +0x3937, +0xEA0E, +0x0A04, +0x44B1, +0xEA21, +0x0804, +0xEA4A, +0x0808, +0x444D, +0x4445, +0xF640, +0x5887, +0xEB0E, +0x56F5, +0xF2CF, +0x48D5, +0xEA06, +0x0A01, +0x4490, +0xEA2E, +0x0901, +0xEA4A, +0x0909, +0x4444, +0x444C, +0xEB06, +0x45B4, +0xF241, +0x48ED, +0x9C0A, +0x9A04, +0xF2C4, +0x585A, +0xEA05, +0x0A0E, +0x44A0, +0xEA26, +0x090E, +0xEA4A, +0x0909, +0x4441, +0x4449, +0xEB05, +0x3431, +0xF64E, +0x1805, +0x990F, +0xF6CA, +0x18E3, +0xEA04, +0x0A06, +0x4488, +0xEA25, +0x0906, +0xEA4A, +0x0909, +0x44C6, +0x44CE, +0xF24A, +0x38F8, +0xEB04, +0x61FE, +0xF6CF, +0x48EF, +0xEA01, +0x0905, +0x4490, +0xEA24, +0x0E05, +0xEA49, +0x0E0E, +0x4446, +0x9A09, +0x4476, +0xF240, +0x2ED9, +0xEB01, +0x56F6, +0xF2C6, +0x7E6F, +0xEA06, +0x0904, +0x4496, +0xEA21, +0x0804, +0xEA49, +0x0808, +0x4475, +0x9A0E, +0x4445, +0xF644, +0x4E8A, +0xEB06, +0x45B5, +0xF6C8, +0x5E2A, +0xEA05, +0x0901, +0x4496, +0xEA26, +0x0801, +0x9A07, +0xEA49, +0x0808, +0x4474, +0x4444, +0xF5A2, +0x2EB8, +0xEB05, +0x3434, +0xEA85, +0x0806, +0xF2AE, +0x6EBE, +0x9A0A, +0xEA88, +0x0804, +0x4471, +0xF24F, +0x6E81, +0x4441, +0xF2C8, +0x7E71, +0xEB04, +0x7131, +0x4496, +0xEA84, +0x0805, +0x9A0D, +0xEA88, +0x0801, +0x4476, +0xF246, +0x1E22, +0x4446, +0xF6C6, +0x5E9D, +0xEB01, +0x5676, +0x4496, +0xEA81, +0x0804, +0x9A10, +0xEA88, +0x0806, +0x4475, +0xF643, +0x0E0C, +0x4445, +0xF6CF, +0x5EE5, +0xEB06, +0x4535, +0x4496, +0xEA86, +0x0801, +0xEA88, +0x0805, +0x4474, +0x4444, +0xEB05, +0x2974, +0xF64E, +0x2E44, +0x9C03, +0x9A09, +0xF2CA, +0x4EBE, +0x44A6, +0xEA85, +0x0406, +0x4471, +0xEA84, +0x0809, +0x4488, +0xF64C, +0x74A9, +0x9906, +0xF6C4, +0x34DE, +0xEB09, +0x7838, +0x440C, +0xEA89, +0x0105, +0x4426, +0xEA81, +0x0408, +0xF644, +0x3160, +0x4434, +0xF2CF, +0x61BB, +0xEB08, +0x5474, +0x4411, +0xEA88, +0x0609, +0x4066, +0x440D, +0x4435, +0xF64B, +0x4170, +0x9E0C, +0x9A0F, +0xF6CB, +0x61BF, +0xEB04, +0x4535, +0x4431, +0xEA84, +0x0608, +0x406E, +0x4489, +0xF647, +0x61C6, +0x44B1, +0xF6C2, +0x019B, +0xEB05, +0x2E79, +0xEA85, +0x0604, +0x4411, +0x4488, +0x9A02, +0xEA86, +0x010E, +0xF242, +0x76FA, +0x4441, +0xF6CE, +0x26A1, +0xEB0E, +0x7131, +0x4416, +0xEA8E, +0x0805, +0x9A05, +0xEA88, +0x0801, +0x4434, +0xF243, +0x0685, +0x4444, +0xF2CD, +0x46EF, +0xEB01, +0x5474, +0xEA81, +0x080E, +0x4416, +0x4435, +0xEA88, +0x0604, +0x442E, +0xF641, +0x5805, +0x9D08, +0x9A0B, +0xF2C0, +0x4888, +0xEB04, +0x4636, +0x44A8, +0xEA84, +0x0901, +0xEA89, +0x0906, +0x44C6, +0xF24D, +0x0839, +0x44CE, +0xF6CD, +0x18D4, +0xEB06, +0x257E, +0x4490, +0xEA86, +0x0904, +0xEA89, +0x0905, +0x4441, +0x4449, +0xEB05, +0x7E31, +0xF649, +0x18E5, +0x990E, +0x9A11, +0xF2CE, +0x68DB, +0x4488, +0xEA85, +0x0106, +0x4444, +0xEA81, +0x080E, +0xF647, +0x41F8, +0x4444, +0xF6C1, +0x71A2, +0xEB0E, +0x5474, +0xEA8E, +0x0805, +0x4411, +0x440E, +0xEA88, +0x0104, +0x4431, +0xF245, +0x6865, +0x9E04, +0x9A02, +0xF2CC, +0x48AC, +0xEB04, +0x4131, +0x44B0, +0xEA84, +0x060E, +0x404E, +0x4445, +0x4435, +0xF242, +0x2944, +0xEB01, +0x2575, +0xF2CF, +0x4929, +0x4491, +0xEA65, +0x0604, +0x44CE, +0x404E, +0x9A09, +0x4476, +0xF64F, +0x7897, +0xEB05, +0x66B6, +0xF2C4, +0x382A, +0x4490, +0xEA66, +0x0E01, +0xEA8E, +0x0E05, +0x4444, +0x9A10, +0x4474, +0xF242, +0x39A7, +0xEB06, +0x54B4, +0xF6CA, +0x3994, +0x4491, +0xEA64, +0x0E05, +0xEA8E, +0x0E06, +0x4449, +0x9A07, +0x4471, +0xF24A, +0x0839, +0xEB04, +0x4171, +0xF6CF, +0x4893, +0x4490, +0xEA61, +0x0E06, +0xEA8E, +0x0E04, +0x4445, +0x9A0E, +0x4475, +0xF645, +0x19C3, +0xEB01, +0x25F5, +0xF2C6, +0x595B, +0x4491, +0xEA65, +0x0E04, +0xEA8E, +0x0E01, +0x444E, +0x9A05, +0x4476, +0xF64C, +0x4E92, +0xEB05, +0x66B6, +0xF6C8, +0x7E0C, +0xEA66, +0x0801, +0x4496, +0x4474, +0xEA88, +0x0805, +0x44A0, +0x9C0C, +0x9A03, +0xEB06, +0x58B8, +0xF5A4, +0x1E80, +0xF6AE, +0x3E83, +0xEA68, +0x0405, +0x4074, +0x4471, +0x4421, +0xF645, +0x59D1, +0xEB08, +0x4171, +0xF2C8, +0x5984, +0x4491, +0xEA61, +0x0406, +0x444D, +0xEA84, +0x0408, +0x442C, +0xF647, +0x6E4F, +0x9D0A, +0x9A08, +0xEB01, +0x24F4, +0xF6C6, +0x7EA8, +0x44AE, +0xEA64, +0x0508, +0x4476, +0x404D, +0x4435, +0xF24E, +0x69E0, +0x9E11, +0xEB04, +0x65B5, +0xF6CF, +0x692C, +0x44B1, +0xEA65, +0x0601, +0x44C8, +0x4066, +0x4446, +0xF244, +0x3E14, +0xEB05, +0x56B6, +0xF2CA, +0x3E01, +0x4496, +0xEA66, +0x0804, +0xEA88, +0x0805, +0x4471, +0x9A0F, +0x4441, +0xF241, +0x19A1, +0xEB06, +0x4171, +0xF6C4, +0x6908, +0x4491, +0xEA61, +0x0E05, +0xEA8E, +0x0E06, +0x444C, +0x9A06, +0x4474, +0xF647, +0x6882, +0xEB01, +0x24F4, +0xF2CF, +0x7853, +0x4490, +0xEA64, +0x0E06, +0xEA8E, +0x0E01, +0x4445, +0x9A0D, +0x4475, +0xF24F, +0x2935, +0xEB04, +0x65B5, +0xF6CB, +0x593A, +0x4491, +0xEA65, +0x0E01, +0xEA8E, +0x0E04, +0x444E, +0x9A04, +0x4476, +0xF24D, +0x2EBB, +0xEB05, +0x56B6, +0xF6C2, +0x2ED7, +0x4496, +0xEA66, +0x0804, +0xEA88, +0x0805, +0x4471, +0x9A0B, +0x4441, +0xF24D, +0x3E91, +0xEB06, +0x4171, +0xF6CE, +0x3E86, +0x4496, +0xEA61, +0x0805, +0x9A01, +0xEA88, +0x0806, +0x4474, +0x4408, +0x4444, +0x4415, +0x4466, +0x440F, +0xEB00, +0x24F4, +0x9A00, +0x601D, +0xA802, +0x60DE, +0x609F, +0x605C, +0x2100, +0xF000, +0xF92B, +0xB013, +0xE8BD, +0x8FF0, +0xB430, +0xF64D, +0x41FE, +0xF242, +0x3501, +0xF64A, +0x3489, +0xF245, +0x4276, +0xF2C6, +0x7545, +0xF6CE, +0x74CD, +0x2300, +0xF6C9, +0x01BA, +0xF2C1, +0x0232, +0x6005, +0x6044, +0x6081, +0x60C2, +0x6143, +0x6103, +0xBC30, +0x4770, +0xE92D, +0x43F8, +0x4605, +0x6900, +0x4616, +0x00D2, +0x1813, +0x429A, +0x612B, +0x696B, +0xF3C0, +0x08C5, +0xBF88, +0x3301, +0xF1C8, +0x0440, +0xEB03, +0x7356, +0x42A6, +0x460F, +0x616B, +0xD20A, +0xF108, +0x0818, +0xEB05, +0x0008, +0x2200, +0x18B9, +0x1AB2, +0xE8BD, +0x43F8, +0xF000, +0xB853, +0xF108, +0x0018, +0x4622, +0x4428, +0xF105, +0x0918, +0xF000, +0xF84B, +0xF1C8, +0x087F, +0x4649, +0x4628, +0xF7FF, +0xFBCB, +0x4546, +0xD801, +0xE011, +0x4614, +0x4628, +0x1939, +0xF7FF, +0xFBC3, +0xF104, +0x037F, +0x42B3, +0xF104, +0x0240, +0xD3F4, +0x18B9, +0x4648, +0x1AB2, +0xE8BD, +0x43F8, +0xF000, +0xB830, +0x4648, +0x4622, +0xE7D3, +0xBF00, +0xB530, +0x460C, +0xB083, +0x4605, +0x3110, +0x4668, +0x2208, +0xF7FF, +0xFB91, +0x6922, +0xF3C2, +0x02C5, +0x2A37, +0xF645, +0x31C8, +0xBF94, +0xF1C2, +0x0238, +0xF1C2, +0x0278, +0x4620, +0xF2C2, +0x0100, +0xF7FF, +0xFF9F, +0x4620, +0x4669, +0x2208, +0xF7FF, +0xFF9A, +0x4628, +0x4621, +0x2210, +0xF7FF, +0xFB77, +0x4620, +0x2100, +0x2258, +0xB003, +0xE8BD, +0x4030, +0xF000, +0xB89B, +0xBF00, +0x4684, +0xEA41, +0x0300, +0xF013, +0x0303, +0xD16D, +0x3A40, +0xD341, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0x3A40, +0xD2BD, +0x3230, +0xD311, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0xF851, +0x3B04, +0xF840, +0x3B04, +0x3A10, +0xD2ED, +0x320C, +0xD305, +0xF851, +0x3B04, +0xF840, +0x3B04, +0x3A04, +0xD2F9, +0x3204, +0xD008, +0x07D2, +0xBF1C, +0xF811, +0x3B01, +0xF800, +0x3B01, +0xD301, +0x880B, +0x8003, +0x4660, +0x4770, +0xBF00, +0x2A08, +0xD313, +0x078B, +0xD08D, +0xF010, +0x0303, +0xD08A, +0xF1C3, +0x0304, +0x1AD2, +0x07DB, +0xBF1C, +0xF811, +0x3B01, +0xF800, +0x3B01, +0xD380, +0xF831, +0x3B02, +0xF820, +0x3B02, +0xE77B, +0x3A04, +0xD3D9, +0x3A01, +0xF811, +0x3B01, +0xF800, +0x3B01, +0xD2F9, +0x780B, +0x7003, +0x784B, +0x7043, +0x788B, +0x7083, +0x4660, +0x4770, +0xB470, +0x0784, +0xD046, +0x1E54, +0x2A00, +0xD041, +0xB2CD, +0x4603, +0xE002, +0x1E62, +0xB3E4, +0x4614, +0xF803, +0x5B01, +0x079A, +0xD1F8, +0x2C03, +0xD92E, +0xB2CD, +0xEA45, +0x2505, +0x2C0F, +0xEA45, +0x4505, +0xD919, +0xF103, +0x0210, +0x4626, +0x3E10, +0x2E0F, +0xF842, +0x5C10, +0xF842, +0x5C0C, +0xF842, +0x5C08, +0xF842, +0x5C04, +0xF102, +0x0210, +0xD8F2, +0xF1A4, +0x0210, +0xF022, +0x020F, +0xF004, +0x040F, +0x3210, +0x2C03, +0x4413, +0xD90D, +0x461E, +0x4622, +0x3A04, +0x2A03, +0xF846, +0x5B04, +0xD8FA, +0x1F22, +0xF022, +0x0203, +0x3204, +0x4413, +0xF004, +0x0403, +0xB12C, +0xB2C9, +0x441C, +0xF803, +0x1B01, +0x42A3, +0xD1FB, +0xBC70, +0x4770, +0x4614, +0x4603, +0xE7C2, +0xBF00, +0x4B03, +0x681B, +0x2200, +0xF8C3, +0x00A8, +0xF8C3, +0x20AC, +0x4770, +0x6030, +0x2000, +0xB410, +0x4B0C, +0x4C0C, +0x6819, +0x4A0C, +0xF8D1, +0x30A8, +0xF8D1, +0x00AC, +0xFB04, +0xF403, +0xFB02, +0x4000, +0xFBA3, +0x2302, +0x4403, +0x3201, +0xF143, +0x0300, +0xE9C1, +0x232A, +0xF023, +0x4000, +0xF85D, +0x4B04, +0x4770, +0x6030, +0x2000, +0xF42D, +0x5851, +0x7F2D, +0x4C95, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0004, +0x000B, +0x0001, +0x0C80, +0x000C, +0x0000, +0x0C80, +0x000D, +0x0001, +0x0C80, +0x000E, +0x0002, +0x0C80, +0x000F, +0x0003, +0x8A00, +0x002D, +0x0004, +0x0001, +0x0001, +0x007F, +0xA030, +0x005F, +0x0005, +0x0003, +0x0880, +0x0072, +0x0006, +0x0A80, +0x0073, +0x0007, +0x0C80, +0x0074, +0x0008, +0x0A80, +0x0592, +0x0009, +0x0A80, +0x0D79, +0x000A, +0x000F, +0x0D6F, +0x0007, +0x4A00, +0x0D70, +0x000B, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0A00, +0x0D71, +0x000C, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D72, +0x000D, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D73, +0x000E, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D83, +0x000F, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D84, +0x0010, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D74, +0x0011, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D75, +0x0012, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D85, +0x0013, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D86, +0x0014, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D76, +0x0015, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0A00, +0x0D77, +0x0016, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4A00, +0x0D78, +0x0017, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0A00, +0x0D88, +0x0018, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C80, +0x0D91, +0x0019, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0002, +0x0037, +0x0000, +0x0027, +0x0037, +0x0004, +0x0010, +0x0000, +0x0031, +0x0020, +0x0010, +0x0023, +0x002F, +0x0025, +0x0025, +0x0033, +0x0004, +0x0000, +0x0004, +0x0004, +0x0004, +0x0004, +0x0004, +0x0004, +0x0004, +0x0005, +0x0004, +0x0000, +0x0027, +0x0009, +0x0029, +0x0000, +0x64E0, +0x2000, +0x64E4, +0x2000, +0x64E8, +0x2000, +0x64EC, +0x2000, +0x650A, +0x2000, +0x650C, +0x2000, +0x6514, +0x2000, +0x6516, +0x2000, +0x6518, +0x2000, +0x651C, +0x2000, +0x652A, +0x2000, +0x5B38, +0x2000, +0x5B50, +0x2000, +0x5B54, +0x2000, +0x5B58, +0x2000, +0x5B5C, +0x2000, +0x5B60, +0x2000, +0x5B64, +0x2000, +0x5B68, +0x2000, +0x5B6C, +0x2000, +0x5B70, +0x2000, +0x5B74, +0x2000, +0x5B7C, +0x2000, +0x5B7E, +0x2000, +0x5B82, +0x2000, +0x5B78, +0x2000, +0x0006, +0x0010, +0x0002, +0x002B, +0x0002, +0x001E, +0x002D, +0x002F, +0x0029, +0x002B, +0x0000, +0x0035, +0x0033, +0x0031, +0x1018, +0x0000, +0x2000, +0x000F, +0x2001, +0x0015, +0x2015, +0x0019, +0x2016, +0x001C, +0x2017, +0x001F, +0x2081, +0x0022, +0x2700, +0x0025, +0x2701, +0x0028, +0x002D, +0x0035, +0x0004, +0x000B, +0x0001, +0x0C80, +0x000C, +0x0000, +0x0C80, +0x000D, +0x0001, +0x0C80, +0x000E, +0x0002, +0x0C80, +0x000F, +0x0003, +0x8A00, +0x002D, +0x0004, +0x0001, +0x0001, +0x007F, +0xA030, +0x005F, +0x0005, +0x0003, +0x0880, +0x0072, +0x0006, +0x0A80, +0x0073, +0x0007, +0x0C80, +0x0074, +0x0008, +0x0A80, +0x0592, +0x0009, +0x0A80, +0x0D79, +0x000A, +0x000F, +0x0D6F, +0x0007, +0x4A00, +0x0D70, +0x000B, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0A00, +0x0D71, +0x000C, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D72, +0x000D, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D73, +0x000E, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D83, +0x000F, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C00, +0x0D84, +0x0010, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D74, +0x0011, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D75, +0x0012, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D85, +0x0013, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D86, +0x0014, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4C00, +0x0D76, +0x0015, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0A00, +0x0D77, +0x0016, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x4A00, +0x0D78, +0x0017, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0A00, +0x0D88, +0x0018, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0C80, +0x0D91, +0x0019, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x6354, +0x2000, +0x6358, +0x2000, +0x635C, +0x2000, +0x6360, +0x2000, +0x637E, +0x2000, +0x6380, +0x2000, +0x6388, +0x2000, +0x638A, +0x2000, +0x638C, +0x2000, +0x6390, +0x2000, +0x639E, +0x2000, +0x5B38, +0x2000, +0x5B50, +0x2000, +0x5B54, +0x2000, +0x5B58, +0x2000, +0x5B5C, +0x2000, +0x5B60, +0x2000, +0x5B64, +0x2000, +0x5B68, +0x2000, +0x5B6C, +0x2000, +0x5B70, +0x2000, +0x5B74, +0x2000, +0x5B7C, +0x2000, +0x5B7E, +0x2000, +0x5B82, +0x2000, +0x5B78, +0x2000, +0x0010, +0x002F, +0x0031, +0x002D, +0x0DD1, +0x0DB2, +0x0DAE, +0x0DB0, +0x0002, +0x0DCC, +0x0035, +0x0010, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x002D, +0x002F, +0x002B, +0x0027, +0x002B, +0x0DCA, +0x0DAE, +0x0033, +0x0DCF, +0x0027, +0x0009, +0x0031, +0x0DAC, +0x0000, +0x0037, +0x0DD1, +0x0010, +0x0000, +0x0004, +0x0004, +0x0004, +0x0004, +0x0004, +0x0004, +0x0004, +0x0005, +0x0004, +0x0000, +0x0035, +0x0029, +0x0029, +0x0037, +0x0DB0, +0x0DAC, +0x0033, +0x0000, +0x1018, +0x0000, +0x2000, +0x000F, +0x2001, +0x0015, +0x2015, +0x0019, +0x2016, +0x001C, +0x2017, +0x001F, +0x2081, +0x0022, +0x2700, +0x0025, +0x2701, +0x0028, +0x0043, +0x0000, +0x5530, +0x2000, +0x5530, +0x2000, +0x0B04, +0x0000, +0x6034, +0x2000, +0x0620, +0x0000, +0xA001, +0x0000, +0x420D, +0x2000, +0x4275, +0x2000, +0x42A1, +0x2000, +0x42C1, +0x2000, +0x0006, +0x0006, +0x0006, +0x0006, +0x0006, +0x0006, +0x0001, +0x0001, +0x0001, +0x0001, +0x0001, +0x0001, +0x0013, +0x0031, +0x0013, +0x0009, +0x0027, +0x0013, +0x0001, +0x0001, +0x0001, +0x0001, +0x0000, +0x0000, +0x0000, +0x0000, +0x00FF, +0x0001, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0008, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x2B4D, +0x2000, +0x2BB1, +0x2000, +0x2B35, +0x2000, +0x0000, +0x0008, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x2B4D, +0x2000, +0x2BB1, +0x2000, +0x2B35, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x01F4, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0001, +0x0001, +0x0001, +0x0001, +0x0001, +0x0001, +0x0000, +0x0000, +0x00FF, +0x0001, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0008, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x2B4D, +0x2000, +0x2BB1, +0x2000, +0x2B35, +0x2000, +0x0000, +0x0008, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x2B4D, +0x2000, +0x2BB1, +0x2000, +0x2B35, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x01F4, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x00FF, +0x00FF, +0x00FF, +0x0001, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0001, +0x3A95, +0x2000, +0x3BF9, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x3815, +0x2000, +0x3859, +0x2000, +0x38C5, +0x2000, +0x38ED, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x38F1, +0x2000, +0x3A59, +0x2000, +0x3A6D, +0x2000, +0x3A81, +0x2000, +0x0080, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x5EF4, +0x2000, +0x5F5C, +0x2000, +0x5FC4, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x5514, +0x2000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0001, +0x0000, +0x0000, +0x0000, +0x330E, +0xABCD, +0x1234, +0xE66D, +0xDEEC, +0x0005, +0x000B, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x0000, +0x5C08, +0x2000 +}; diff --git a/Vsrc/X_CANFlashProgStarterM4F.c b/Vsrc/X_CANFlashProgStarterM4F.c new file mode 100644 index 0000000..d64dc2c --- /dev/null +++ b/Vsrc/X_CANFlashProgStarterM4F.c @@ -0,0 +1,126 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file X_CANFlashProgStarter.c + \brief Инициализирует процесс прожига по CANу + \author Алямкин Д. + \version v 1.0 30/05/2017 +*/ + +/** \addtogroup TCANFlashProgStarter */ +/*@{*/ + + +#include "DSP.h" +#include "main.h" +#include "X_CANFlashProgData.h" +#include "X_CANFlashProgStarter.h" +void GPIO_reset(); +//в данной функции важно загружать код прошивальщика в ОЗУ непосредственно перед переходом в прошивальщик, +//иначе можно испортить данные кода прошивальщика, скопированные в ОЗУ (так как там могут распологататьсЯ +//переменные изменЯемые в данной функции) +TFlashProgSettings FPsettings; +void StartFlashProgrammer() +{ + Uint16 i,j; + volatile Uint8* sourcePtr; + volatile Uint8* destPtr; + volatile Uint16* sourcePtr16; + volatile Uint16* destPtr16; + void (*FlashProgProjectCall)(void); + + //запрещаем все прерываниЯ + DINT; + //еще запрещаем все прерывания NVIC + /*NVIC->ICER[0] = 0xFFFFFFFF; + NVIC->ICER[1] = 0xFFFFFFFF; + NVIC->ICER[2] = 0xFFFFFFFF; + NVIC->ICER[3] = 0xFFFFFFFF; + NVIC->ICER[4] = 0xFFFFFFFF;*/ + + //переводим все GPIO в исходное состоЯние + GPIO_reset(); + //инициализируем GPIO CANов тут, так как прошивальщик не знает через какие ножки вылазит CAN у пользователя + #ifdef FP_DEVICE_M4F + #ifdef CAN_1_ENABLE + co_CAN1GpioInit(); + #endif + #ifdef CAN_2_ENABLE + co_CAN2GpioInit(); + #endif + #endif + //передаем настройки прошивальщика + FPsettings.magic_number = 0x1234; + + #if defined(CAN_1_ENABLE) && defined(CAN_2_ENABLE) + //если разрешены оба CAN-а, CANx_enable выставлены в call_back функциЯх + FPsettings.CANa_bitRate = co1_vars.co_bitRate; + FPsettings.CANa_nodeID = co1_vars.co_nodeID; + FPsettings.CANb_bitRate = co2_vars.co_bitRate; + FPsettings.CANb_nodeID = co2_vars.co_nodeID; + #else + #ifdef CAN_1_ENABLE + FPsettings.CANa_enable = 1; + FPsettings.CANb_enable = 0; + FPsettings.CANa_bitRate = co1_vars.co_bitRate; + FPsettings.CANa_nodeID = co1_vars.co_nodeID; + #else + FPsettings.CANa_enable = 0; + #endif + + #ifdef CAN_2_ENABLE + FPsettings.CANa_enable = 0; + FPsettings.CANb_enable = 1; + FPsettings.CANb_bitRate = co2_vars.co_bitRate; + FPsettings.CANb_nodeID = co2_vars.co_nodeID; + #else + FPsettings.CANb_enable = 0; + #endif + #endif + + //копируем настройки прошивальщика, по нужному адресу + sourcePtr = (Uint8*)&FPsettings; + destPtr = ((Uint8*)0x20000064);//настройки всегда хранЯтсЯ на 2 слова ниже стартового адреса + for(i=0; ids = v->as; + v->qs = _IQmpy((v->as + _IQmpy(_IQ(2),v->bs)), _IQ(0.57735026918963)); +} + +/*@}*/ + diff --git a/Vsrc/cood1.c b/Vsrc/cood1.c new file mode 100644 index 0000000..6013058 --- /dev/null +++ b/Vsrc/cood1.c @@ -0,0 +1,4278 @@ +// Файл: +// Профиль: E:\VectorWork\motorcontroldemo_028\cood.xml +// Конфигурация: Базовый профиль +// Дата создания: 23.07.2019 12:58:12 +// Пользователь: default +// COODEdit Basic v.7.3.8 +#include "DSP.h" +#include "main.h" +#include "cood1.h" +#include "co_ODvars.h" + +// всего 128 индексов в словаре +// всего 865 элементов в словаре +Uint16 const co1_numOfInd = 128; +// Номер перечесления для групп +Uint16 const co1_groupEnum = 15; +// Хэш-сумма: +Uint32 const co1_odHash[4] = {0xF8B5F27F, 0x9B6F7CA3, 0x7802BC66, 0xD1B686E2}; +// Таблица с адресами переменных +long const CO1_OD_TBL3[] = { +(long)(&co1_vars.co_deviceType), //[1000h.00h], Название: Тип устройства, ТекстПУ: Device Type, Группа: CAN +(long)(&co1_vars.co_errorRegister), //[1001h.00h], Название: Регистр ошибок, ТекстПУ: ErrReg, Группа: CAN +(long)(&co1_vars.co_deviceState), //[1002h.00h], Название: Manufacturer Status Register, ТекстПУ: DevSta, Группа: CAN +(long)(&co1_vars.co_emcyCOBID), //[1014h.00h], Название: COB-ID Emergency Object, ТекстПУ: eCOBID, Группа: CAN +(long)(&co1_vars.co_CHBT), //[1016h.01h], Название: Время ожидания сообщения Heartbeat, ТекстПУ: CHBT, Группа: CAN +(long)(&co1_vars.co_PHBT), //[1017h.00h], Название: Период генерации сообщения Heartbeat, ТекстПУ: PHBT, Группа: CAN +(long)(&co1_vars.co_vendorID), //[1018h.01h], Название: Код производителя, ТекстПУ: VendID, Группа: CAN +(long)(&co1_vars.co_productCode), //[1018h.02h], Название: Код продукта, ТекстПУ: PrCode, Группа: CAN +(long)(&co1_vars.co_revisionNumber), //[1018h.03h], Название: Номер ревизии, ТекстПУ: RevNum, Группа: CAN +(long)(&co1_vars.co_serialNumber), //[1018h.04h], Название: Серийный номер, ТекстПУ: SerNum, Группа: CAN +(long)(&co1_vars.co_csrxCOBID), //[1200h.01h], Название: COB-ID Client->Server(rx), ТекстПУ: CSRXID, Группа: CAN +(long)(&co1_vars.co_sctxCOBID), //[1200h.02h], Название: COB-ID Server->Client(tx), ТекстПУ: SCTXID, Группа: CAN +(long)(&co1_vars.co_cstxCOBID), //[1280h.01h], Название: COB-ID Client->Server(tx), ТекстПУ: CSTXID, Группа: CAN +(long)(&co1_vars.co_scrxCOBID), //[1280h.02h], Название: COB-ID Server->Client(rx), ТекстПУ: SCRXID, Группа: CAN +(long)(&co1_vars.co_ssNODEID), //[1280h.03h], Название: NODE-ID on SDO server, ТекстПУ: SDOSID, Группа: CAN +(long)(&co1_vars.co_RPDO1COBID), //[1400h.01h], Название: COB-ID for RPDO1, ТекстПУ: IRPDO1, Группа: CAN +(long)(&co1_vars.co_transType), //[1400h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO2COBID), //[1401h.01h], Название: COB-ID for RPDO2, ТекстПУ: IRPDO2, Группа: CAN +(long)(&co1_vars.co_transType), //[1401h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO3COBID), //[1402h.01h], Название: COB-ID for RPDO3, ТекстПУ: IRPDO3, Группа: CAN +(long)(&co1_vars.co_transType), //[1402h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO4COBID), //[1403h.01h], Название: COB-ID for RPDO4, ТекстПУ: IRPDO4, Группа: CAN +(long)(&co1_vars.co_transType), //[1403h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO5COBID), //[1404h.01h], Название: COB-ID for RPDO5, ТекстПУ: IRPDO5, Группа: CAN +(long)(&co1_vars.co_transType), //[1404h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO6COBID), //[1405h.01h], Название: COB-ID for RPDO6, ТекстПУ: IRPDO6, Группа: CAN +(long)(&co1_vars.co_transType), //[1405h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO7COBID), //[1406h.01h], Название: COB-ID for RPDO7, ТекстПУ: IRPDO7, Группа: CAN +(long)(&co1_vars.co_transType), //[1406h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO8COBID), //[1407h.01h], Название: COB-ID for RPDO8, ТекстПУ: IRPDO8, Группа: CAN +(long)(&co1_vars.co_transType), //[1407h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_RPDO1_1Mapping), //[1600h.01h], Название: RPDO1-1 Mapping, ТекстПУ: RPM11, Группа: CAN +(long)(&co1_vars.co_RPDO1_2Mapping), //[1600h.02h], Название: RPDO1-2 Mapping, ТекстПУ: RPM12, Группа: CAN +(long)(&co1_vars.co_RPDO1_3Mapping), //[1600h.03h], Название: RPDO1-3 Mapping, ТекстПУ: RPM13, Группа: CAN +(long)(&co1_vars.co_RPDO1_4Mapping), //[1600h.04h], Название: RPDO1-4 Mapping, ТекстПУ: RPM14, Группа: CAN +(long)(&co1_vars.co_RPDO2_1Mapping), //[1601h.01h], Название: RPDO2-1 Mapping, ТекстПУ: RPM21, Группа: CAN +(long)(&co1_vars.co_RPDO2_2Mapping), //[1601h.02h], Название: RPDO2-2 Mapping, ТекстПУ: RPM22, Группа: CAN +(long)(&co1_vars.co_RPDO2_3Mapping), //[1601h.03h], Название: RPDO2-3 Mapping, ТекстПУ: RPM23, Группа: CAN +(long)(&co1_vars.co_RPDO2_4Mapping), //[1601h.04h], Название: RPDO2-4 Mapping, ТекстПУ: RPM24, Группа: CAN +(long)(&co1_vars.co_RPDO3_1Mapping), //[1602h.01h], Название: RPDO3-1 Mapping, ТекстПУ: RPM31, Группа: CAN +(long)(&co1_vars.co_RPDO3_2Mapping), //[1602h.02h], Название: RPDO3-2 Mapping, ТекстПУ: RPM32, Группа: CAN +(long)(&co1_vars.co_RPDO3_3Mapping), //[1602h.03h], Название: RPDO3-3 Mapping, ТекстПУ: RPM33, Группа: CAN +(long)(&co1_vars.co_RPDO3_4Mapping), //[1602h.04h], Название: RPDO3-4 Mapping, ТекстПУ: RPM34, Группа: CAN +(long)(&co1_vars.co_RPDO4_1Mapping), //[1603h.01h], Название: RPDO4-1 Mapping, ТекстПУ: RPM41, Группа: CAN +(long)(&co1_vars.co_RPDO4_2Mapping), //[1603h.02h], Название: RPDO4-2 Mapping, ТекстПУ: RPM42, Группа: CAN +(long)(&co1_vars.co_RPDO4_3Mapping), //[1603h.03h], Название: RPDO4-3 Mapping, ТекстПУ: RPM43, Группа: CAN +(long)(&co1_vars.co_RPDO4_4Mapping), //[1603h.04h], Название: RPDO4-4 Mapping, ТекстПУ: RPM44, Группа: CAN +(long)(&co1_vars.co_RPDO5_1Mapping), //[1604h.01h], Название: RPDO5-1 Mapping, ТекстПУ: RPM51, Группа: CAN +(long)(&co1_vars.co_RPDO5_2Mapping), //[1604h.02h], Название: RPDO5-2 Mapping, ТекстПУ: RPM52, Группа: CAN +(long)(&co1_vars.co_RPDO5_3Mapping), //[1604h.03h], Название: RPDO5-3 Mapping, ТекстПУ: RPM53, Группа: CAN +(long)(&co1_vars.co_RPDO5_4Mapping), //[1604h.04h], Название: RPDO5-4 Mapping, ТекстПУ: RPM54, Группа: CAN +(long)(&co1_vars.co_RPDO6_1Mapping), //[1605h.01h], Название: RPDO6-1 Mapping, ТекстПУ: RPM61, Группа: CAN +(long)(&co1_vars.co_RPDO6_2Mapping), //[1605h.02h], Название: RPDO6-2 Mapping, ТекстПУ: RPM62, Группа: CAN +(long)(&co1_vars.co_RPDO6_3Mapping), //[1605h.03h], Название: RPDO6-3 Mapping, ТекстПУ: RPM63, Группа: CAN +(long)(&co1_vars.co_RPDO6_4Mapping), //[1605h.04h], Название: RPDO6-4 Mapping, ТекстПУ: RPM64, Группа: CAN +(long)(&co1_vars.co_RPDO7_1Mapping), //[1606h.01h], Название: RPDO7-1 Mapping, ТекстПУ: RPM71, Группа: CAN +(long)(&co1_vars.co_RPDO7_2Mapping), //[1606h.02h], Название: RPDO7-2 Mapping, ТекстПУ: RPM72, Группа: CAN +(long)(&co1_vars.co_RPDO7_3Mapping), //[1606h.03h], Название: RPDO7-3 Mapping, ТекстПУ: RPM73, Группа: CAN +(long)(&co1_vars.co_RPDO7_4Mapping), //[1606h.04h], Название: RPDO7-4 Mapping, ТекстПУ: RPM74, Группа: CAN +(long)(&co1_vars.co_RPDO8_1Mapping), //[1607h.01h], Название: RPDO8-1 Mapping, ТекстПУ: RPM81, Группа: CAN +(long)(&co1_vars.co_RPDO8_2Mapping), //[1607h.02h], Название: RPDO8-2 Mapping, ТекстПУ: RPM82, Группа: CAN +(long)(&co1_vars.co_RPDO8_3Mapping), //[1607h.03h], Название: RPDO8-3 Mapping, ТекстПУ: RPM83, Группа: CAN +(long)(&co1_vars.co_RPDO8_4Mapping), //[1607h.04h], Название: RPDO8-4 Mapping, ТекстПУ: RPM84, Группа: CAN +(long)(&co1_vars.co_TPDO1COBID), //[1800h.01h], Название: COB-ID for TPDO1, ТекстПУ: ITPDO1, Группа: CAN +(long)(&co1_vars.co_transType), //[1800h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO1ITime), //[1800h.03h], Название: Inhibit Time 1, ТекстПУ: ITime1, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1800h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO1EventTimer), //[1800h.05h], Название: Event Timer 1, ТекстПУ: EvTmr1, Группа: CAN +(long)(&co1_vars.co_TPDO2COBID), //[1801h.01h], Название: COB-ID for TPDO2, ТекстПУ: ITPDO2, Группа: CAN +(long)(&co1_vars.co_transType), //[1801h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO2ITime), //[1801h.03h], Название: Inhibit Time 2, ТекстПУ: ITime2, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1801h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO2EventTimer), //[1801h.05h], Название: Event Timer 2, ТекстПУ: EvTmr2, Группа: CAN +(long)(&co1_vars.co_TPDO3COBID), //[1802h.01h], Название: COB-ID for TPDO3, ТекстПУ: ITPDO3, Группа: CAN +(long)(&co1_vars.co_transType), //[1802h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO3ITime), //[1802h.03h], Название: Inhibit Time 3, ТекстПУ: ITime3, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1802h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO3EventTimer), //[1802h.05h], Название: Event Timer 3, ТекстПУ: EvTmr3, Группа: CAN +(long)(&co1_vars.co_TPDO4COBID), //[1803h.01h], Название: COB-ID for TPDO4, ТекстПУ: ITPDO4, Группа: CAN +(long)(&co1_vars.co_transType), //[1803h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO4ITime), //[1803h.03h], Название: Inhibit Time 4, ТекстПУ: ITime4, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1803h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO4EventTimer), //[1803h.05h], Название: Event Timer 4, ТекстПУ: EvTmr4, Группа: CAN +(long)(&co1_vars.co_TPDO5COBID), //[1804h.01h], Название: COB-ID for TPDO5, ТекстПУ: ITPDO5, Группа: CAN +(long)(&co1_vars.co_transType), //[1804h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO5ITime), //[1804h.03h], Название: Inhibit Time 5, ТекстПУ: ITime5, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1804h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO5EventTimer), //[1804h.05h], Название: Event Timer 5, ТекстПУ: EvTmr5, Группа: CAN +(long)(&co1_vars.co_TPDO6COBID), //[1805h.01h], Название: COB-ID for TPDO6, ТекстПУ: ITPDO6, Группа: CAN +(long)(&co1_vars.co_transType), //[1805h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO6ITime), //[1805h.03h], Название: Inhibit Time 6, ТекстПУ: ITime6, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1805h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO6EventTimer), //[1805h.05h], Название: Event Timer 6, ТекстПУ: EvTmr6, Группа: CAN +(long)(&co1_vars.co_TPDO7COBID), //[1806h.01h], Название: COB-ID for TPDO7, ТекстПУ: ITPDO7, Группа: CAN +(long)(&co1_vars.co_transType), //[1806h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO7ITime), //[1806h.03h], Название: Inhibit Time 7, ТекстПУ: ITime7, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1806h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO7EventTimer), //[1806h.05h], Название: Event Timer 7, ТекстПУ: EvTmr7, Группа: CAN +(long)(&co1_vars.co_TPDO8COBID), //[1807h.01h], Название: COB-ID for TPDO8, ТекстПУ: ITPDO8, Группа: CAN +(long)(&co1_vars.co_transType), //[1807h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co1_vars.co_TPDO8ITime), //[1807h.03h], Название: Inhibit Time 8, ТекстПУ: ITime8, Группа: CAN +(long)(&co1_vars.co_compatEntry), //[1807h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co1_vars.co_TPDO8EventTimer), //[1807h.05h], Название: Event Timer 8, ТекстПУ: EvTmr8, Группа: CAN +(long)(&co1_vars.co_TPDO1_1Mapping), //[1A00h.01h], Название: TPDO1-1 Mapping, ТекстПУ: TPM11, Группа: CAN +(long)(&co1_vars.co_TPDO1_2Mapping), //[1A00h.02h], Название: TPDO1-2 Mapping, ТекстПУ: TPM12, Группа: CAN +(long)(&co1_vars.co_TPDO1_3Mapping), //[1A00h.03h], Название: TPDO1-3 Mapping, ТекстПУ: TPM13, Группа: CAN +(long)(&co1_vars.co_TPDO1_4Mapping), //[1A00h.04h], Название: TPDO1-4 Mapping, ТекстПУ: TPM14, Группа: CAN +(long)(&co1_vars.co_TPDO2_1Mapping), //[1A01h.01h], Название: TPDO2-1 Mapping, ТекстПУ: TPM21, Группа: CAN +(long)(&co1_vars.co_TPDO2_2Mapping), //[1A01h.02h], Название: TPDO2-2 Mapping, ТекстПУ: TPM22, Группа: CAN +(long)(&co1_vars.co_TPDO2_3Mapping), //[1A01h.03h], Название: TPDO2-3 Mapping, ТекстПУ: TPM23, Группа: CAN +(long)(&co1_vars.co_TPDO2_4Mapping), //[1A01h.04h], Название: TPDO2-4 Mapping, ТекстПУ: TPM24, Группа: CAN +(long)(&co1_vars.co_TPDO3_1Mapping), //[1A02h.01h], Название: TPDO3-1 Mapping, ТекстПУ: TPM31, Группа: CAN +(long)(&co1_vars.co_TPDO3_2Mapping), //[1A02h.02h], Название: TPDO3-2 Mapping, ТекстПУ: TPM32, Группа: CAN +(long)(&co1_vars.co_TPDO3_3Mapping), //[1A02h.03h], Название: TPDO3-3 Mapping, ТекстПУ: TPM33, Группа: CAN +(long)(&co1_vars.co_TPDO3_4Mapping), //[1A02h.04h], Название: TPDO3-4 Mapping, ТекстПУ: TPM34, Группа: CAN +(long)(&co1_vars.co_TPDO4_1Mapping), //[1A03h.01h], Название: TPDO4-1 Mapping, ТекстПУ: TPM41, Группа: CAN +(long)(&co1_vars.co_TPDO4_2Mapping), //[1A03h.02h], Название: TPDO4-2 Mapping, ТекстПУ: TPM42, Группа: CAN +(long)(&co1_vars.co_TPDO4_3Mapping), //[1A03h.03h], Название: TPDO4-3 Mapping, ТекстПУ: TPM43, Группа: CAN +(long)(&co1_vars.co_TPDO4_4Mapping), //[1A03h.04h], Название: TPDO4-4 Mapping, ТекстПУ: TPM44, Группа: CAN +(long)(&co1_vars.co_TPDO5_1Mapping), //[1A04h.01h], Название: TPDO5-1 Mapping, ТекстПУ: TPM51, Группа: CAN +(long)(&co1_vars.co_TPDO5_2Mapping), //[1A04h.02h], Название: TPDO5-2 Mapping, ТекстПУ: TPM52, Группа: CAN +(long)(&co1_vars.co_TPDO5_3Mapping), //[1A04h.03h], Название: TPDO5-3 Mapping, ТекстПУ: TPM53, Группа: CAN +(long)(&co1_vars.co_TPDO5_4Mapping), //[1A04h.04h], Название: TPDO5-4 Mapping, ТекстПУ: TPM54, Группа: CAN +(long)(&co1_vars.co_TPDO6_1Mapping), //[1A05h.01h], Название: TPDO6-1 Mapping, ТекстПУ: TPM61, Группа: CAN +(long)(&co1_vars.co_TPDO6_2Mapping), //[1A05h.02h], Название: TPDO6-2 Mapping, ТекстПУ: TPM62, Группа: CAN +(long)(&co1_vars.co_TPDO6_3Mapping), //[1A05h.03h], Название: TPDO6-3 Mapping, ТекстПУ: TPM63, Группа: CAN +(long)(&co1_vars.co_TPDO6_4Mapping), //[1A05h.04h], Название: TPDO6-4 Mapping, ТекстПУ: TPM64, Группа: CAN +(long)(&co1_vars.co_TPDO7_1Mapping), //[1A06h.01h], Название: TPDO7-1 Mapping, ТекстПУ: TPM71, Группа: CAN +(long)(&co1_vars.co_TPDO7_2Mapping), //[1A06h.02h], Название: TPDO7-2 Mapping, ТекстПУ: TPM72, Группа: CAN +(long)(&co1_vars.co_TPDO7_3Mapping), //[1A06h.03h], Название: TPDO7-3 Mapping, ТекстПУ: TPM73, Группа: CAN +(long)(&co1_vars.co_TPDO7_4Mapping), //[1A06h.04h], Название: TPDO7-4 Mapping, ТекстПУ: TPM74, Группа: CAN +(long)(&co1_vars.co_TPDO8_1Mapping), //[1A07h.01h], Название: TPDO8-1 Mapping, ТекстПУ: TPM81, Группа: CAN +(long)(&co1_vars.co_TPDO8_2Mapping), //[1A07h.02h], Название: TPDO8-2 Mapping, ТекстПУ: TPM82, Группа: CAN +(long)(&co1_vars.co_TPDO8_3Mapping), //[1A07h.03h], Название: TPDO8-3 Mapping, ТекстПУ: TPM83, Группа: CAN +(long)(&co1_vars.co_TPDO8_4Mapping), //[1A07h.04h], Название: TPDO8-4 Mapping, ТекстПУ: TPM84, Группа: CAN +(long)(&co1_vars.co_nodeID), //[2000h.00h], Название: CAN NODE-ID, ТекстПУ: NodeID, Группа: CAN +(long)(&co1_vars.co_bitRate), //[2001h.00h], Название: CAN Bit Rate, ТекстПУ: CANBR, Группа: CAN, биты с 0 по 2: 0000000000000111b +(long)(&co1_vars.co_vendorID), //[2002h.01h], Название: Код производителя, ТекстПУ: VendID, Группа: CAN +(long)(&co1_vars.co_productCode), //[2002h.02h], Название: Код продукта, ТекстПУ: PrCode, Группа: CAN +(long)(&co1_vars.co_revisionNumber), //[2002h.03h], Название: Номер ревизии, ТекстПУ: RevNum, Группа: CAN +(long)(&co1_vars.co_serialNumber), //[2002h.04h], Название: Серийный номер, ТекстПУ: SerNum, Группа: CAN +(long)(&co1_vars.co_specialData1), //[2003h.01h], Название: Special Data 1, ТекстПУ: SpDat1, Группа: CAN +(long)(&co1_vars.co_specialData2), //[2003h.02h], Название: Special Data 2, ТекстПУ: SpDat2, Группа: CAN +(long)(&co1_vars.co_specialData3), //[2003h.03h], Название: Special Data 3, ТекстПУ: SpDat3, Группа: CAN +(long)(&co1_vars.co_specialData4), //[2003h.04h], Название: Special Data 4, ТекстПУ: SpDat4, Группа: CAN +(long)(&co1_vars.co_secretCode), //[2004h.00h], Название: Secret Code, ТекстПУ: Secret, Группа: CAN +(long)(&co1_vars.co_protectBit), //[2005h.00h], Название: Protect Bit, ТекстПУ: ProtBt, Группа: CAN, биты с 0 по 0: 0000000000000001b +(long)(&co1_odHash[0]), //[2007h.01h], Название: md5_hash_0, ТекстПУ: md5_hash_0, Группа: CAN +(long)(&co1_odHash[1]), //[2007h.02h], Название: md5_hash_1, ТекстПУ: md5_hash_1, Группа: CAN +(long)(&co1_odHash[2]), //[2007h.03h], Название: md5_hash_2, ТекстПУ: md5_hash_2, Группа: CAN +(long)(&co1_odHash[3]), //[2007h.04h], Название: md5_hash_3, ТекстПУ: md5_hash_3, Группа: CAN +(long)(&co1_vars.co_heartbeatFlag0), //[2010h.01h], Название: Heartbeat Flag 0-31, ТекстПУ: HFlag0, Группа: CAN +(long)(&co1_vars.co_heartbeatFlag1), //[2010h.02h], Название: Heartbeat Flag 32-63, ТекстПУ: HFlag1, Группа: CAN +(long)(&co1_vars.co_heartbeatFlag2), //[2010h.03h], Название: Heartbeat Flag 64-95, ТекстПУ: HFlag2, Группа: CAN +(long)(&co1_vars.co_heartbeatFlag3), //[2010h.04h], Название: Heartbeat Flag 96-127, ТекстПУ: HFlag3, Группа: CAN +(long)(&co1_vars.co_heartbeatMask0), //[2011h.01h], Название: Heartbeat Mask 0-31, ТекстПУ: HMask0, Группа: CAN +(long)(&co1_vars.co_heartbeatMask1), //[2011h.02h], Название: Heartbeat Mask 32-63, ТекстПУ: HMask1, Группа: CAN +(long)(&co1_vars.co_heartbeatMask2), //[2011h.03h], Название: Heartbeat Mask 64-95, ТекстПУ: HMask2, Группа: CAN +(long)(&co1_vars.co_heartbeatMask3), //[2011h.04h], Название: Heartbeat Mask 96-127, ТекстПУ: HMask3, Группа: CAN +(long)(&co1_vars.co_heartbeatAutoStart), //[2012h.00h], Название: Heartbeat Autostart, ТекстПУ: HBASta, Группа: CAN, биты с 0 по 0: 0000000000000001b +(long)(&co1_vars.co_heartbeatAutoRecovery), //[2014h.00h], Название: Heartbeat Autorecovery, ТекстПУ: HBARec, Группа: CAN, биты с 0 по 0: 0000000000000001b +(long)(&co1_vars.co_nodeState), //[2015h.00h], Название: Состояние драйвера CAN-Open, ТекстПУ: State, Группа: CAN +(long)(&co1_vars.co_emergencyErrorCode), //[2016h.00h], Название: Emergency Error Code, ТекстПУ: EmErCo, Группа: CAN +(long)(&co1_vars.co_deviceErrorState), //[2017h.00h], Название: Device Error State, ТекстПУ: DeErSt, Группа: CAN +(long)(&co1_vars.co_ODCommand), //[2080h.01h], Название: Object Dictionary Command, ТекстПУ: ODComm, Группа: CAN +(long)(&co1_vars.co_currentODIndex), //[2080h.02h], Название: Current OD Index, ТекстПУ: ODCInd, Группа: CAN +(long)(&co1_vars.co_currentODSubIndex), //[2080h.03h], Название: Current OD Sub-Index, ТекстПУ: ODCSub, Группа: CAN +(long)(&co1_vars.co_currentODEText), //[2080h.04h], Название: Current OD Element Text, ТекстПУ: ODCTxt, Группа: CAN +(long)(&co1_vars.co_currentODEFormat), //[2080h.05h], Название: Current OD Element Format, ТекстПУ: ODCFrm, Группа: CAN +(long)(&co1_vars.co_currentODEMin), //[2080h.06h], Название: Current OD Element Min, ТекстПУ: ODCMin, Группа: CAN +(long)(&co1_vars.co_currentODEMax), //[2080h.07h], Название: Current OD Element Max, ТекстПУ: ODCMax, Группа: CAN +(long)(&co1_vars.co_currentODEDefault), //[2080h.08h], Название: Current OD Element Default, ТекстПУ: ODCDef, Группа: CAN +(long)(&co1_vars.co_currentODEMinLow), //[2080h.09h], Название: Current OD Element MinLow, ТекстПУ: ODCMiL, Группа: CAN +(long)(&co1_vars.co_currentODEMaxLow), //[2080h.0Ah], Название: Current OD Element MaxLow, ТекстПУ: ODCMaL, Группа: CAN +(long)(&co1_vars.co_currentODEDefaultLow), //[2080h.0Bh], Название: Current OD Element Default Low, ТекстПУ: ODCDeL, Группа: CAN +(long)(&co1_vars.co_currentODEAddrLow), //[2080h.0Ch], Название: Current OD Element Address, ТекстПУ: ODCAdr, Группа: CAN +(long)(&co1_vars.co_currentODEAddrLow), //[2080h.0Dh], Название: Current OD Element Address, ТекстПУ: ODCAdr, Группа: CAN +(long)(&co1_vars.co_currentODEType), //[2080h.0Eh], Название: Группа параметров, ТекстПУ: Группа, Группа: CAN +(long)(&co1_vars.co_odIndexSize), //[2081h.00h], Название: Количество индексов, ТекстПУ: КолИнд, Группа: CAN +(long)(&co1_vars.co_defaultIndex1), //[2082h.01h], Название: Default Index 1, ТекстПУ: DfInd1, Группа: CAN +(long)(&co1_vars.co_defaultIndex2), //[2082h.02h], Название: Default Index 2, ТекстПУ: DfInd2, Группа: CAN +(long)(&co1_vars.co_maskElement01), //[2083h.01h], Название: Mask Element, ТекстПУ: MskEl0, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElement01), //[2083h.02h], Название: Mask Element, ТекстПУ: MskEl1, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElement23), //[2083h.03h], Название: Mask Element, ТекстПУ: MskEl2, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElement23), //[2083h.04h], Название: Mask Element, ТекстПУ: MskEl3, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElement45), //[2083h.05h], Название: Mask Element, ТекстПУ: MskEl4, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElement45), //[2083h.06h], Название: Mask Element, ТекстПУ: MskEl5, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElement67), //[2083h.07h], Название: Mask Element, ТекстПУ: MskEl6, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElement67), //[2083h.08h], Название: Mask Element, ТекстПУ: MskEl7, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElement89), //[2083h.09h], Название: Mask Element, ТекстПУ: MskEl8, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElement89), //[2083h.0Ah], Название: Mask Element, ТекстПУ: MskEl9, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElementAB), //[2083h.0Bh], Название: Mask Element, ТекстПУ: MskElA, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElementAB), //[2083h.0Ch], Название: Mask Element, ТекстПУ: MskElB, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElementCD), //[2083h.0Dh], Название: Mask Element, ТекстПУ: MskElC, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElementCD), //[2083h.0Eh], Название: Mask Element, ТекстПУ: MskElD, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_maskElementEF), //[2083h.0Fh], Название: Mask Element, ТекстПУ: MskElE, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co1_vars.co_maskElementEF), //[2083h.10h], Название: Mask Element, ТекстПУ: MskElF, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co1_vars.co_scaleNum0), //[2100h.01h], Название: Scale Number 0, ТекстПУ: SN0, Группа: CAN +(long)(&co1_vars.co_scaleNum0Format), //[2100h.02h], Название: Scale Number 0 Format, ТекстПУ: S0Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum0Format), //[2100h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum0Format), //[2100h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum0Format), //[2100h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum0Format), //[2100h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum1), //[2101h.01h], Название: Scale Number 1, ТекстПУ: SN1, Группа: CAN +(long)(&co1_vars.co_scaleNum1Format), //[2101h.02h], Название: Scale Number 1 Format, ТекстПУ: S1Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum1Format), //[2101h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum1Format), //[2101h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum1Format), //[2101h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum1Format), //[2101h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum2), //[2102h.01h], Название: Scale Number 2, ТекстПУ: SN2, Группа: CAN +(long)(&co1_vars.co_scaleNum2Format), //[2102h.02h], Название: Scale Number 2 Format, ТекстПУ: S2Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum2Format), //[2102h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum2Format), //[2102h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum2Format), //[2102h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum2Format), //[2102h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum3), //[2103h.01h], Название: Scale Number 3, ТекстПУ: SN3, Группа: CAN +(long)(&co1_vars.co_scaleNum3Format), //[2103h.02h], Название: Scale Number 3 Format, ТекстПУ: S3Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum3Format), //[2103h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum3Format), //[2103h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum3Format), //[2103h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum3Format), //[2103h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum4), //[2104h.01h], Название: Scale Number 4, ТекстПУ: SN4, Группа: CAN +(long)(&co1_vars.co_scaleNum4Format), //[2104h.02h], Название: Scale Number 4 Format, ТекстПУ: S4Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum4Format), //[2104h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum4Format), //[2104h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum4Format), //[2104h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum4Format), //[2104h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum5), //[2105h.01h], Название: Scale Number 5, ТекстПУ: SN5, Группа: CAN +(long)(&co1_vars.co_scaleNum5Format), //[2105h.02h], Название: Scale Number 5 Format, ТекстПУ: S5Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum5Format), //[2105h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum5Format), //[2105h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum5Format), //[2105h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum5Format), //[2105h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum6), //[2106h.01h], Название: Scale Number 6, ТекстПУ: SN6, Группа: CAN +(long)(&co1_vars.co_scaleNum6Format), //[2106h.02h], Название: Scale Number 6 Format, ТекстПУ: S6Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum6Format), //[2106h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum6Format), //[2106h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum6Format), //[2106h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum6Format), //[2106h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum7), //[2107h.01h], Название: Scale Number 7, ТекстПУ: SN7, Группа: CAN +(long)(&co1_vars.co_scaleNum7Format), //[2107h.02h], Название: Scale Number 7 Format, ТекстПУ: S7Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum7Format), //[2107h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum7Format), //[2107h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum7Format), //[2107h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum7Format), //[2107h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum8), //[2108h.01h], Название: Scale Number 8, ТекстПУ: SN8, Группа: CAN +(long)(&co1_vars.co_scaleNum8Format), //[2108h.02h], Название: Scale Number 8 Format, ТекстПУ: S8Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum8Format), //[2108h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum8Format), //[2108h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum8Format), //[2108h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum8Format), //[2108h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum9), //[2109h.01h], Название: Scale Number 9, ТекстПУ: SN9, Группа: CAN +(long)(&co1_vars.co_scaleNum9Format), //[2109h.02h], Название: Scale Number 9 Format, ТекстПУ: S9Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum9Format), //[2109h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum9Format), //[2109h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum9Format), //[2109h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum9Format), //[2109h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNumA), //[210Ah.01h], Название: Scale Number A, ТекстПУ: SNA, Группа: CAN +(long)(&co1_vars.co_scaleNumAFormat), //[210Ah.02h], Название: Scale Number A Format, ТекстПУ: SAFmt, Группа: CAN +(long)(&co1_vars.co_scaleNumAFormat), //[210Ah.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNumAFormat), //[210Ah.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNumAFormat), //[210Ah.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNumAFormat), //[210Ah.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNumB), //[210Bh.01h], Название: Scale Number B, ТекстПУ: SNB, Группа: CAN +(long)(&co1_vars.co_scaleNumBFormat), //[210Bh.02h], Название: Scale Number B Format, ТекстПУ: SBFmt, Группа: CAN +(long)(&co1_vars.co_scaleNumBFormat), //[210Bh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNumBFormat), //[210Bh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNumBFormat), //[210Bh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNumBFormat), //[210Bh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNumC), //[210Ch.01h], Название: Scale Number C, ТекстПУ: SNC, Группа: CAN +(long)(&co1_vars.co_scaleNumCFormat), //[210Ch.02h], Название: Scale Number C Format, ТекстПУ: SCFmt, Группа: CAN +(long)(&co1_vars.co_scaleNumCFormat), //[210Ch.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNumCFormat), //[210Ch.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNumCFormat), //[210Ch.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNumCFormat), //[210Ch.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNumD), //[210Dh.01h], Название: Scale Number D, ТекстПУ: SND, Группа: CAN +(long)(&co1_vars.co_scaleNumDFormat), //[210Dh.02h], Название: Scale Number D Format, ТекстПУ: SDFmt, Группа: CAN +(long)(&co1_vars.co_scaleNumDFormat), //[210Dh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNumDFormat), //[210Dh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNumDFormat), //[210Dh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNumDFormat), //[210Dh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNumE), //[210Eh.01h], Название: Scale Number E, ТекстПУ: SNE, Группа: CAN +(long)(&co1_vars.co_scaleNumEFormat), //[210Eh.02h], Название: Scale Number E Format, ТекстПУ: SEFmt, Группа: CAN +(long)(&co1_vars.co_scaleNumEFormat), //[210Eh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNumEFormat), //[210Eh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNumEFormat), //[210Eh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNumEFormat), //[210Eh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNumF), //[210Fh.01h], Название: Scale Number F, ТекстПУ: SNF, Группа: CAN +(long)(&co1_vars.co_scaleNumFFormat), //[210Fh.02h], Название: Scale Number F Format, ТекстПУ: SFFmt, Группа: CAN +(long)(&co1_vars.co_scaleNumFFormat), //[210Fh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNumFFormat), //[210Fh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNumFFormat), //[210Fh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNumFFormat), //[210Fh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum10), //[2110h.01h], Название: Scale Number 10, ТекстПУ: SN10, Группа: CAN +(long)(&co1_vars.co_scaleNum10Format), //[2110h.02h], Название: Scale Number 10 Format, ТекстПУ: S10Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum10Format), //[2110h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum10Format), //[2110h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum10Format), //[2110h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum10Format), //[2110h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum11), //[2111h.01h], Название: Scale Number 11, ТекстПУ: SN11, Группа: CAN +(long)(&co1_vars.co_scaleNum11Format), //[2111h.02h], Название: Scale Number 11 Format, ТекстПУ: S11Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum11Format), //[2111h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum11Format), //[2111h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum11Format), //[2111h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum11Format), //[2111h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum12), //[2112h.01h], Название: Scale Number 12, ТекстПУ: SN12, Группа: CAN +(long)(&co1_vars.co_scaleNum12Format), //[2112h.02h], Название: Scale Number 12 Format, ТекстПУ: S12Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum12Format), //[2112h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum12Format), //[2112h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum12Format), //[2112h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum12Format), //[2112h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum13), //[2113h.01h], Название: Scale Number 13, ТекстПУ: SN13, Группа: CAN +(long)(&co1_vars.co_scaleNum13Format), //[2113h.02h], Название: Scale Number 13 Format, ТекстПУ: S13Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum13Format), //[2113h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum13Format), //[2113h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum13Format), //[2113h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum13Format), //[2113h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum14), //[2114h.01h], Название: Scale Number 14, ТекстПУ: SN14, Группа: CAN +(long)(&co1_vars.co_scaleNum14Format), //[2114h.02h], Название: Scale Number 14 Format, ТекстПУ: S14Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum14Format), //[2114h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum14Format), //[2114h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum14Format), //[2114h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum14Format), //[2114h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum15), //[2115h.01h], Название: Scale Number 15, ТекстПУ: SN15, Группа: CAN +(long)(&co1_vars.co_scaleNum15Format), //[2115h.02h], Название: Scale Number 15Format, ТекстПУ: S15Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum15Format), //[2115h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum15Format), //[2115h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum15Format), //[2115h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum15Format), //[2115h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum16), //[2116h.01h], Название: Scale Number 16, ТекстПУ: SN16, Группа: CAN +(long)(&co1_vars.co_scaleNum16Format), //[2116h.02h], Название: Scale Number 16Format, ТекстПУ: S16Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum16Format), //[2116h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum16Format), //[2116h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum16Format), //[2116h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum16Format), //[2116h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum17), //[2117h.01h], Название: Scale Number 17, ТекстПУ: SN17, Группа: CAN +(long)(&co1_vars.co_scaleNum17Format), //[2117h.02h], Название: Scale Number 17Format, ТекстПУ: S17Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum17Format), //[2117h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum17Format), //[2117h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum17Format), //[2117h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum17Format), //[2117h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum18), //[2118h.01h], Название: Scale Number 18, ТекстПУ: SN18, Группа: CAN +(long)(&co1_vars.co_scaleNum18Format), //[2118h.02h], Название: Scale Number 18Format, ТекстПУ: S18Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum18Format), //[2118h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum18Format), //[2118h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum18Format), //[2118h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum18Format), //[2118h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum19), //[2119h.01h], Название: Scale Number 19, ТекстПУ: SN19, Группа: CAN +(long)(&co1_vars.co_scaleNum19Format), //[2119h.02h], Название: Scale Number 19Format, ТекстПУ: S19Fmt, Группа: CAN +(long)(&co1_vars.co_scaleNum19Format), //[2119h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum19Format), //[2119h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum19Format), //[2119h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum19Format), //[2119h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum1A), //[211Ah.01h], Название: Scale Number 1A, ТекстПУ: SN1A, Группа: CAN +(long)(&co1_vars.co_scaleNum1AFormat), //[211Ah.02h], Название: Scale Number 1AFormat, ТекстПУ: S1AFmt, Группа: CAN +(long)(&co1_vars.co_scaleNum1AFormat), //[211Ah.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum1AFormat), //[211Ah.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum1AFormat), //[211Ah.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum1AFormat), //[211Ah.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum1B), //[211Bh.01h], Название: Scale Number 1B, ТекстПУ: SN1B, Группа: CAN +(long)(&co1_vars.co_scaleNum1BFormat), //[211Bh.02h], Название: Scale Number 1BFormat, ТекстПУ: S1BFmt, Группа: CAN +(long)(&co1_vars.co_scaleNum1BFormat), //[211Bh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum1BFormat), //[211Bh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum1BFormat), //[211Bh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum1BFormat), //[211Bh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum1C), //[211Ch.01h], Название: Scale Number 1C, ТекстПУ: SN1C, Группа: CAN +(long)(&co1_vars.co_scaleNum1CFormat), //[211Ch.02h], Название: Scale Number 1C Format, ТекстПУ: S1CFmt, Группа: CAN +(long)(&co1_vars.co_scaleNum1CFormat), //[211Ch.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum1CFormat), //[211Ch.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum1CFormat), //[211Ch.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum1CFormat), //[211Ch.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co1_vars.co_scaleNum1D), //[211Dh.01h], Название: Scale Number 1D, ТекстПУ: SN1D, Группа: CAN +(long)(&co1_vars.co_scaleNum1DFormat), //[211Dh.02h], Название: Scale Number 1D Format, ТекстПУ: S1DFmt, Группа: CAN +(long)(&co1_vars.co_scaleNum1DFormat), //[211Dh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co1_vars.co_scaleNum1DFormat), //[211Dh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co1_vars.co_scaleNum1DFormat), //[211Dh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co1_vars.co_scaleNum1DFormat), //[211Dh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&cmd.all), //[2502h.01h], Название: Пуск, ТекстПУ: Пуск, Группа: Слово управления, биты с 0 по 0: 0000000000000001b +(long)(&cmd.all), //[2502h.02h], Название: Стоп, ТекстПУ: Стоп, Группа: Слово управления, биты с 1 по 1: 0000000000000010b +(long)(&cmd.all), //[2502h.03h], Название: Сбросить состояние Аварии, ТекстПУ: СбрАвр, Группа: Слово управления, биты с 2 по 2: 0000000000000100b +(long)(&cmd.all), //[2502h.04h], Название: Слово управления CAN, ТекстПУ: КмдCAN, Группа: Слово управления +(long)(&drv_interface.req_data), //[2506h.01h], Название: Таймаут потери связи, ТекстПУ: OfflineCounterMax, Группа: ВНЕ ГРУПП +(long)(&drv_interface.ans_data), //[2506h.02h], Название: Счетчик потери связи, ТекстПУ: OfflineCounter, Группа: ВНЕ ГРУПП +(long)(&drv_interface.data_Low), //[2506h.03h], Название: data_Low, ТекстПУ: data_L, Группа: ВНЕ ГРУПП +(long)(&drv_interface.data_High), //[2506h.04h], Название: data_High, ТекстПУ: data_H, Группа: ВНЕ ГРУПП +(long)(&RTCclock.packed_time), //[250Fh.00h], Название: Часы реального времени, ТекстПУ: RTC, Группа: Наблюдаемые +(long)(&sm_prot.Main_ErrorCode), //[2532h.01h], Название: Код аварии ARM, ТекстПУ: Код аварии ARM, Группа: Рег. тока якоря, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.Main_ErrorCode), //[2532h.02h], Название: Расширение кода аварии, ТекстПУ: Авр+, Группа: Рег. тока якоря, биты с 8 по 15: 1111111100000000b +(long)(&sm_prot.Main_Flags), //[2532h.03h], Название: Системный объект, ТекстПУ: System, Группа: Рег. тока якоря, биты с 0 по 0: 0000000000000001b +(long)(&disp_group_number), //[2534h.01h], Название: Номер груп для пульта управления, ТекстПУ: № гр ПУ, Группа: CAN +(long)(&VendorToken), //[2600h.01h], Название: VendorToken, ТекстПУ: VendorToken, Группа: ВНЕ ГРУПП +(long)(&co1_vars.co_blockTransferCommand), //[2700h.00h], Название: Block Transfer Interpreter, ТекстПУ: BT Interpreter, Группа: Слово управления +(long)(&swu_vars), //[2701h.01h], Название: cmd, ТекстПУ: cmd, Группа: Слово управления +(long)(&swu_vars), //[2701h.02h], Название: status, ТекстПУ: status, Группа: Слово управления +(long)(&swu_vars), //[2701h.03h], Название: quest1, ТекстПУ: quest1, Группа: Слово управления +(long)(&swu_vars), //[2701h.04h], Название: quest2, ТекстПУ: quest2, Группа: Слово управления +(long)(&swu_vars), //[2701h.05h], Название: quest3, ТекстПУ: quest3, Группа: Слово управления +(long)(&swu_vars), //[2701h.06h], Название: quest4, ТекстПУ: quest4, Группа: Слово управления +(long)(&swu_vars), //[2701h.07h], Название: ans1, ТекстПУ: ans1, Группа: Слово управления +(long)(&swu_vars), //[2701h.08h], Название: ans2, ТекстПУ: ans2, Группа: Слово управления +(long)(&swu_vars), //[2701h.09h], Название: ans3, ТекстПУ: ans3, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Ah], Название: ans4, ТекстПУ: ans4, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Bh], Название: addr, ТекстПУ: addr, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Ch], Название: CPU_ID, ТекстПУ: CPU_ID, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Dh], Название: sector_mask, ТекстПУ: sector_mask, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Eh], Название: version, ТекстПУ: version, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Fh], Название: CRC, ТекстПУ: CRC, Группа: Слово управления +(long)(&drv_status.all), //[3000h.00h], Название: Статус преобразователя, ТекстПУ: Статус, Группа: ВНЕ ГРУПП, биты с 0 по 5: 0000000000111111b +(long)(&msCounter), //[3100h.01h], Название: Счётчик прерываний 1 кГц, ТекстПУ: Сч.прерыв.1 кГц, Группа: Счетчики +(long)(&FastCounter), //[3100h.02h], Название: Счётчик прерываний 10 кГц, ТекстПУ: Сч.прерыв.10 кГц, Группа: Счетчики +(long)(&LoopCounter), //[3100h.03h], Название: BackgroundCounter, ТекстПУ: BackgroundCounter, Группа: Счетчики +(long)(&TIsr10), //[3100h.04h], Название: T_10кГц, ТекстПУ: T_10кГц, Группа: Счетчики +(long)(&TIsr1), //[3100h.05h], Название: T_1кГц, ТекстПУ: T_1кГц, Группа: Счетчики +(long)(&rmp.T), //[5000h.01h], Название: T разгона до номинала, ТекстПУ: rmpT, Группа: ЗИ +(long)(&rmp.input), //[5000h.02h], Название: Вход ЗИ, ТекстПУ: ВходЗИ, Группа: ЗИ +(long)(&rmp.output), //[5000h.03h], Название: Выход ЗИ, ТекстПУ: ВыходЗИ, Группа: ЗИ +(long)(&pid_id.pid_ref_reg3), //[5100h.01h], Название: Задание, ТекстПУ: Зад-е, Группа: Рег. тока Id +(long)(&pid_id.pid_fdb_reg3), //[5100h.02h], Название: Обратная связь, ТекстПУ: Обр.Св, Группа: Рег. тока Id +(long)(&pid_id.Kp_reg3), //[5100h.03h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. тока Id +(long)(&pid_id.pid_out_max), //[5100h.04h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. тока Id +(long)(&pid_id.pid_out_min), //[5100h.05h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. тока Id +(long)(&pid_id.Ki_reg3), //[5100h.06h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. тока Id +(long)(&pid_id.Kd_reg3), //[5100h.07h], Название: Дифф. коэфф. Kd, ТекстПУ: Kd, Группа: Рег. тока Id +(long)(&pid_id.Kc_reg3), //[5100h.08h], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. тока Id +(long)(&pid_id.e_reg3), //[5100h.09h], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. тока Id +(long)(&pid_id.pid_out_reg3), //[5100h.0Ah], Название: Выход регулятора, ТекстПУ: Выход, Группа: Рег. тока Id +(long)(&pid_id.up_reg3), //[5100h.0Bh], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. тока Id +(long)(&pid_id.ui_reg3), //[5100h.0Ch], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. тока Id +(long)(&pid_id.ud_reg3), //[5100h.0Dh], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. тока Id +(long)(&pid_spd.pid_ref_reg3), //[5101h.01h], Название: Задание, ТекстПУ: pisref, Группа: Рег. скорости +(long)(&pid_spd.pid_fdb_reg3), //[5101h.02h], Название: Обратная связь, ТекстПУ: pisfbd, Группа: Рег. скорости +(long)(&pid_spd.Kp_reg3), //[5101h.03h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. скорости +(long)(&pid_spd.pid_out_max), //[5101h.04h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. скорости +(long)(&pid_spd.pid_out_min), //[5101h.05h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. скорости +(long)(&pid_spd.Ki_reg3), //[5101h.06h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. скорости +(long)(&pid_spd.Kd_reg3), //[5101h.07h], Название: Дифф. коэфф. Kd, ТекстПУ: pisKd, Группа: Рег. скорости +(long)(&pid_spd.Kc_reg3), //[5101h.08h], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. скорости +(long)(&pid_spd.e_reg3), //[5101h.09h], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. скорости +(long)(&pid_spd.pid_out_reg3), //[5101h.0Ah], Название: Выход регулятора, ТекстПУ: pisout, Группа: Рег. скорости +(long)(&pid_spd.up_reg3), //[5101h.0Bh], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. скорости +(long)(&pid_spd.ui_reg3), //[5101h.0Ch], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. скорости +(long)(&pid_spd.ud_reg3), //[5101h.0Dh], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. скорости +(long)(&pid_spd.saterr_reg3), //[5101h.0Eh], Название: Превышение насыщения, ТекстПУ: Прев. насыщ, Группа: Рег. скорости +(long)(&pid_iq.pid_ref_reg3), //[5102h.01h], Название: Задание, ТекстПУ: Зад-ие, Группа: Рег. тока Iq +(long)(&pid_iq.pid_fdb_reg3), //[5102h.02h], Название: Обратная связь, ТекстПУ: Обр.Св, Группа: Рег. тока Iq +(long)(&pid_iq.Kp_reg3), //[5102h.03h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. тока Iq +(long)(&pid_iq.pid_out_max), //[5102h.04h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. тока Iq +(long)(&pid_iq.pid_out_min), //[5102h.05h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. тока Iq +(long)(&pid_iq.Ki_reg3), //[5102h.06h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. тока Iq +(long)(&pid_iq.Kd_reg3), //[5102h.07h], Название: Дифф. коэфф. Kd, ТекстПУ: Kd, Группа: Рег. тока Iq +(long)(&pid_iq.Kc_reg3), //[5102h.08h], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. тока Iq +(long)(&pid_iq.e_reg3), //[5102h.09h], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. тока Iq +(long)(&pid_iq.pid_out_reg3), //[5102h.0Ah], Название: Выход регулятора, ТекстПУ: Выход, Группа: Рег. тока Iq +(long)(&pid_iq.up_reg3), //[5102h.0Bh], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. тока Iq +(long)(&pid_iq.ui_reg3), //[5102h.0Ch], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. тока Iq +(long)(&pid_iq.ud_reg3), //[5102h.0Dh], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. тока Iq +(long)(&pid_pos.pid_ref_reg3), //[5103h.01h], Название: Задание, ТекстПУ: pisref, Группа: Рег. положения +(long)(&pid_pos.pid_ref_reg3), //[5103h.02h], Название: Задание, ТекстПУ: pisref, Группа: Рег. положения +(long)(&pid_pos.pid_fdb_reg3), //[5103h.03h], Название: Обратная связь, ТекстПУ: pisfbd, Группа: Рег. положения +(long)(&pid_pos.pid_fdb_reg3), //[5103h.04h], Название: Обратная связь, ТекстПУ: pisfbd, Группа: Рег. положения +(long)(&pid_pos.Kp_reg3), //[5103h.05h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. положения +(long)(&pid_pos.pid_out_max), //[5103h.06h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. положения +(long)(&pid_pos.pid_out_min), //[5103h.07h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. положения +(long)(&pid_pos.Ki_reg3), //[5103h.08h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. положения +(long)(&pid_pos.Kd_reg3), //[5103h.09h], Название: Дифф. коэфф. Kd, ТекстПУ: pisKd, Группа: Рег. положения +(long)(&pid_pos.DiffDelim), //[5103h.0Ah], Название: Делит. дифф. части, ТекстПУ: Делит. дифф. части, Группа: Рег. положения +(long)(&pid_pos.Kf_d), //[5103h.0Bh], Название: Коэф. фильтра, ТекстПУ: Коэф. фильтра, Группа: Рег. положения +(long)(&pid_pos.Kc_reg3), //[5103h.0Ch], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. положения +(long)(&pid_pos.DeadZone), //[5103h.0Dh], Название: Мертвая зона, ТекстПУ: Мертвая зона, Группа: Рег. положения +(long)(&pid_pos.e_reg3), //[5103h.0Eh], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. положения +(long)(&pid_spd.saterr_reg3), //[5103h.0Fh], Название: Превышение насыщения, ТекстПУ: Прев. насыщ, Группа: Рег. положения +(long)(&pid_pos.pid_out_reg3), //[5103h.10h], Название: Выход регулятора, ТекстПУ: pisout, Группа: Рег. положения +(long)(&pid_pos.up_reg3), //[5103h.11h], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. положения +(long)(&pid_pos.ui_reg3), //[5103h.12h], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. положения +(long)(&pid_pos.ud_reg3), //[5103h.13h], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. положения +(long)(&pid_pos.e_reg3_filterOut), //[5103h.14h], Название: Фильтр ошибки, ТекстПУ: Фильтр ошибки, Группа: Рег. положения +(long)(&pwm.UalphaRef), //[5105h.01h], Название: UaЗад, ТекстПУ: UaЗад, Группа: ШИМ +(long)(&pwm.UbetaRef), //[5105h.02h], Название: UbЗад, ТекстПУ: UbЗад, Группа: ШИМ +(long)(&pwm.U_lim), //[5105h.03h], Название: U_огр, ТекстПУ: U_огр, Группа: ШИМ +(long)(&pwm.GammaA), //[5105h.04h], Название: GammaA, ТекстПУ: GmA, Группа: ШИМ +(long)(&pwm.GammaB), //[5105h.05h], Название: GammaB, ТекстПУ: GmB, Группа: ШИМ +(long)(&pwm.GammaC), //[5105h.06h], Название: GammaC, ТекстПУ: GmC, Группа: ШИМ +(long)(&pwm.k_pwm), //[5105h.07h], Название: TPWM, ТекстПУ: TPWM, Группа: ШИМ +(long)(&pwm.DeadBand), //[5105h.08h], Название: Мертвое время (мкс), ТекстПУ: Мерт. время, Группа: ШИМ +(long)(&pwm.MinGammaLimit), //[5105h.09h], Название: Ограничение мин. скважн., ТекстПУ: GamLim, Группа: ШИМ +(long)(&pwm.UdCompK), //[5105h.0Ah], Название: Коэф. компенсации Ud, ТекстПУ: UdКомпK, Группа: ШИМ +(long)(&pwm.UdCompEnable), //[5105h.0Bh], Название: Компенсация Ud, ТекстПУ: UdКомп, Группа: ШИМ, биты с 0 по 0: 0000000000000001b +(long)(&pwm.PWM_type), //[5105h.0Ch], Название: Тип ШИМ, ТекстПУ: ТипШИМ, Группа: ШИМ +(long)(&pwm.ULimitation), //[5105h.0Dh], Название: ULimitation, ТекстПУ: ULimitation, Группа: ШИМ +(long)(&pwm.Frequency), //[5105h.0Eh], Название: Частота ШИМ, ТекстПУ: Fшим, Группа: ШИМ +(long)(&pwm.sector), //[5105h.0Fh], Название: Сектор, ТекстПУ: Сектор, Группа: ШИМ +(long)(&pwm.U_mag), //[5105h.10h], Название: U_ампл, ТекстПУ: U_ампл, Группа: ШИМ +(long)(&pwm.PDP_Fault), //[5105h.11h], Название: Флаги аварий, ТекстПУ: F_bits, Группа: ШИМ +(long)(&sm_ctrl.state), //[510Bh.01h], Название: sm_state, ТекстПУ: smstat, Группа: ДА sm_ctrl +(long)(&drv_status_code), //[510Bh.02h], Название: drv_status_code, ТекстПУ: stcode, Группа: ДА sm_ctrl, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.bit_fault1), //[510Eh.01h], Название: Флаги аварий 1, ТекстПУ: bitF_1, Группа: Защиты +(long)(&sm_prot.bit_fault2), //[510Eh.02h], Название: Флаги аварий 2, ТекстПУ: bitF_2, Группа: Защиты +(long)(&sm_prot.mask_fault1), //[510Eh.03h], Название: Маска аварий 1L, ТекстПУ: mask1L, Группа: Защиты, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.mask_fault1), //[510Eh.04h], Название: Маска аварий 1H, ТекстПУ: mask1H, Группа: Защиты, биты с 8 по 15: 1111111100000000b +(long)(&sm_prot.mask_fault2), //[510Eh.05h], Название: Маска аварий 2L, ТекстПУ: mask2L, Группа: Защиты, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.mask_fault2), //[510Eh.06h], Название: Маска аварий 2H, ТекстПУ: mask2H, Группа: Защиты, биты с 8 по 15: 1111111100000000b +(long)(&sm_prot.Imax_protect), //[510Eh.07h], Название: Максимальный ток, ТекстПУ: Макс.Ток, Группа: Защиты +(long)(&sm_prot.Umax_protect), //[510Eh.08h], Название: Максимальное напряжение, ТекстПУ: Ud_max, Группа: Защиты +(long)(&sm_prot.Umin_protect), //[510Eh.09h], Название: Минимальное напряжение, ТекстПУ: Ud_min, Группа: Защиты +(long)(&sm_prot.speed_max), //[510Eh.0Ah], Название: Максимальная скорость, ТекстПУ: speed_max, Группа: Защиты +(long)(&sm_prot.T_max), //[510Eh.0Bh], Название: Максимальная температура, ТекстПУ: t_max, Группа: Защиты +(long)(&refs.speed_ref), //[5112h.01h], Название: Скорость, ТекстПУ: Скор_з, Группа: Задания +(long)(&refs.Iq_ref), //[5112h.02h], Название: Макс. ток ВУ, ТекстПУ: ТокСТз, Группа: Задания +(long)(&refs.i_flux_ref), //[5112h.03h], Название: Ток удержания, ТекстПУ: ТокУПз, Группа: Задания +(long)(&refs.theta_elec), //[5112h.04h], Название: theta_elec, ТекстПУ: элекУг, Группа: Задания +(long)(&refs.uf_ref), //[5112h.05h], Название: Заданное напряжение ОВ, ТекстПУ: Uf_ref, Группа: Задания +(long)(&drv_params.p), //[5113h.01h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Базов. парам +(long)(&drv_params.I_nom), //[5113h.02h], Название: Номинальный ток, ТекстПУ: IпчНом, Группа: Базов. парам +(long)(&drv_params.U_nom), //[5113h.03h], Название: Номинальное напряжение фазн., ТекстПУ: Uф_ном, Группа: Базов. парам +(long)(&drv_params.speed_nom), //[5113h.04h], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Базов. парам +(long)(&drv_params.Udc_nom), //[5113h.05h], Название: Номинальное напряжение ЗПТ, ТекстПУ: UdcНом, Группа: Базов. парам +(long)(&drv_params.Rs), //[5113h.06h], Название: Rs, ТекстПУ: Rs, Группа: Базов. парам +(long)(&drv_params.Ls), //[5113h.07h], Название: Ls, ТекстПУ: Ls, Группа: Базов. парам +(long)(&drv_params.freq_nom), //[5113h.08h], Название: Номинальная частота, ТекстПУ: Ном.част., Группа: Базов. парам +(long)(&drv_params.sens_type), //[5113h.09h], Название: Тип датчика положения, ТекстПУ: Sens_type, Группа: Базов. парам, биты с 0 по 2: 0000000000000111b +(long)(&sw.HardwareType), //[5114h.01h], Название: Тип аппаратной части, ТекстПУ: HardwareType, Группа: Настройки СУ, биты с 0 по 7: 0000000011111111b +(long)(&sm_ctrl.run_mode), //[5114h.02h], Название: Режим работы, ТекстПУ: РежРаб, Группа: Настройки СУ +(long)(&sw.recuperation_ena), //[5114h.03h], Название: Рекуперация, ТекстПУ: Рекупр, Группа: Настройки СУ +(long)(&sw.AutoOffset), //[5114h.04h], Название: АЦП авто смещ., ТекстПУ: АЦПсмещ, Группа: Настройки СУ +(long)(&sw.Reboot), //[5114h.05h], Название: Перезагрузка, ТекстПУ: Перезагрузка, Группа: Настройки СУ +(long)(&sw.excitation_ena), //[5114h.06h], Название: Возбудитель, ТекстПУ: Возб, Группа: Настройки СУ +(long)(&adc.Imeas_a_gain), //[5116h.01h], Название: Коэффициент тока фазы А, ТекстПУ: IaУсил, Группа: АЦП +(long)(&adc.Imeas_a_offset), //[5116h.02h], Название: Смещение тока фазы А, ТекстПУ: IaСмещ, Группа: АЦП +(long)(&adc.Imeas_a), //[5116h.03h], Название: Ток фазы А, ТекстПУ: Ia_мгн, Группа: АЦП +(long)(&adc.Imeas_b_gain), //[5116h.04h], Название: Коэффициент тока фазы В, ТекстПУ: IbУсил, Группа: АЦП +(long)(&adc.Imeas_b_offset), //[5116h.05h], Название: Смещение тока фазы В, ТекстПУ: IbСмещ, Группа: АЦП +(long)(&adc.Imeas_b), //[5116h.06h], Название: Ток фазы В, ТекстПУ: Ib_мгн, Группа: АЦП +(long)(&adc.Imeas_c_gain), //[5116h.07h], Название: Коэффициент тока фазы C, ТекстПУ: IcУсил, Группа: АЦП +(long)(&adc.Imeas_c_offset), //[5116h.08h], Название: Смещение тока фазы C, ТекстПУ: IcСмещ, Группа: АЦП +(long)(&adc.Imeas_c), //[5116h.09h], Название: Ток фазы С, ТекстПУ: Ic_мгн, Группа: АЦП +(long)(&adc.Udc_meas_gain), //[5116h.0Ah], Название: Коэффициент напряжения ЗПТ, ТекстПУ: UdУсил, Группа: АЦП +(long)(&adc.Udc_meas_offset), //[5116h.0Bh], Название: Смещение напряж. ЗПТ, ТекстПУ: Udсмещ, Группа: АЦП +(long)(&adc.Udc_meas), //[5116h.0Ch], Название: Напряжение ЗПТ, ТекстПУ: Ud, Группа: АЦП +(long)(&adc.T_meas_gain), //[5116h.0Dh], Название: Коэффициент температуры, ТекстПУ: t_gain, Группа: АЦП +(long)(&adc.T_meas), //[5116h.0Eh], Название: Температура, ТекстПУ: t, Группа: АЦП +(long)(&vhz.freq), //[511Ah.01h], Название: Выходная частота, ТекстПУ: F_вых, Группа: Кривая U-f +(long)(&vhz.vout), //[511Ah.02h], Название: Выходное напряжение, ТекстПУ: U_вых, Группа: Кривая U-f +(long)(&vhz.FL), //[511Ah.03h], Название: Нулевая опроная частота, ТекстПУ: f [0], Группа: Кривая U-f +(long)(&vhz.Vmin), //[511Ah.04h], Название: Нулевое опорное напряжение, ТекстПУ: U [0], Группа: Кривая U-f +(long)(&vhz.FH), //[511Ah.05h], Название: Первая опорная частота, ТекстПУ: f [1], Группа: Кривая U-f +(long)(&vhz.Vmax), //[511Ah.06h], Название: Первое опорное напряжение, ТекстПУ: U [1], Группа: Кривая U-f +(long)(&vhz.Fmax), //[511Ah.07h], Название: Максимальная частота, ТекстПУ: f max, Группа: Кривая U-f +(long)(&cur_par.speed), //[5138h.01h], Название: Скорость, ТекстПУ: скор, Группа: Наблюдаемые +(long)(&cur_par.power), //[5138h.02h], Название: Акт. мощность, ТекстПУ: АктМощ, Группа: Наблюдаемые +(long)(&cur_par.Is), //[5138h.03h], Название: Ток статора, ТекстПУ: ТокСт, Группа: Наблюдаемые +(long)(&cur_par.ThetaRefCurr), //[5138h.04h], Название: ЭлУголЗад, ТекстПУ: ЭлУголЗад, Группа: Наблюдаемые +(long)(&cur_par.ThetaCurr), //[5138h.05h], Название: ЭлУгол, ТекстПУ: ЭлУгол, Группа: Наблюдаемые +(long)(&cur_par.IsRef), //[5138h.06h], Название: Ток статора зад, ТекстПУ: ТокСтЗад, Группа: Наблюдаемые +(long)(&global_time.PowerOn_time_min), //[5138h.07h], Название: Время запитанного состояния, мин, ТекстПУ: Power On Time, Группа: Наблюдаемые +(long)(&global_time.operational_time_min), //[5138h.08h], Название: Вреря работы привода, мин, ТекстПУ: Work Time, Группа: Наблюдаемые +(long)(&dlog.mode_reset), //[5150h.01h], Название: dlog.mode_reset, ТекстПУ: mode, Группа: dlog +(long)(&dlog.control), //[5150h.02h], Название: dlog.control, ТекстПУ: dlcont, Группа: dlog +(long)(&dlog.ind_subind1), //[5150h.03h], Название: dlog.ind_subind1, ТекстПУ: dlisi1, Группа: dlog +(long)(&dlog.ind_subind2), //[5150h.04h], Название: dlog.ind_subind2, ТекстПУ: dlisi2, Группа: dlog +(long)(&dlog.ind_subind3), //[5150h.05h], Название: dlog.ind_subind3, ТекстПУ: dlisi3, Группа: dlog +(long)(&dlog.ind_subind4), //[5150h.06h], Название: dlog.ind_subind4, ТекстПУ: dlisi4, Группа: dlog +(long)(&dlog.StartBits), //[5150h.07h], Название: StartBitL, ТекстПУ: StrtBL, Группа: dlog, биты с 0 по 7: 0000000011111111b +(long)(&dlog.StartBits), //[5150h.08h], Название: StartBitH, ТекстПУ: StrtBH, Группа: dlog, биты с 8 по 15: 1111111100000000b +(long)(&dlog.OneShotOperation), //[5150h.09h], Название: OneShotOperation, ТекстПУ: OneShotOp, Группа: dlog, биты с 0 по 0: 0000000000000001b +(long)(&dlog.trig_shift), //[5150h.0Ah], Название: Количество точек предыстории, ТекстПУ: N предыст., Группа: dlog +(long)(&dlog.update_sample_rate), //[5150h.0Bh], Название: Частота даталогера, ТекстПУ: dlogFreq, Группа: dlog +(long)(&dlog.next_value_var), //[5151h.00h], Название: dlog.next_value_var, ТекстПУ: dlnval, Группа: ВНЕ ГРУПП +(long)(&posspeedEqep.resol), //[5152h.01h], Название: Кол-во периодов, ТекстПУ: Кол-во периодов, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Posspeed_CTL.all), //[5152h.02h], Название: Наличие репера, ТекстПУ: Наличие репера, Группа: ДПР-Энкодер, биты с 2 по 2: 0000000000000100b +(long)(&posspeedEqep.SpeedCalcType), //[5152h.03h], Название: Рассчитывать скорость программно, ТекстПУ: SpeedCalcType, Группа: ДПР-Энкодер +(long)(&posspeedEqep.AngleOffset), //[5152h.04h], Название: СмещУгол, ТекстПУ: СмещУг, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_res), //[5152h.05h], Название: Механическ.угол в метках, ТекстПУ: Механическ.угол в ме, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_res16), //[5152h.06h], Название: Механическ.угол в метках, ТекстПУ: Механическ.угол в ме, Группа: ДПР-Энкодер +(long)(&posspeedEqep.speed_elec), //[5152h.07h], Название: Скорость , ТекстПУ: Скорость, Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_elec), //[5152h.08h], Название: Угол. электр., ТекстПУ: Угол. электр., Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_mech), //[5152h.09h], Название: Угол мех., ТекстПУ: Угол мех., Группа: ДПР-Энкодер +(long)(&posspeedEqep.Posspeed_CTL.all), //[5152h.0Ah], Название: Команда иниц., ТекстПУ: Команда иниц., Группа: ДПР-Энкодер, биты с 4 по 4: 0000000000010000b +(long)(&posspeedEqep.speed_filter.T), //[5152h.0Bh], Название: К быстродействия фильтра скорости, ТекстПУ: Кф. скорости, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Posspeed_FLG1.all), //[5152h.0Ch], Название: Posspeed_FLG1, ТекстПУ: Posspeed_FLG1, Группа: ДПР-Энкодер +(long)(&posspeedEqep.GPIOsValue), //[5152h.0Dh], Название: GPIOsValue, ТекстПУ: GPIOsValue, Группа: ДПР-Энкодер +(long)(&posspeedEqep.UPPS_forWatch), //[5152h.0Eh], Название: UPPS, ТекстПУ: UPPS, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Qcprdlat_tmp), //[5152h.0Fh], Название: QCPRD, ТекстПУ: QCPRD, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Qcprdlat16_tmp), //[5152h.10h], Название: QCPRD, ТекстПУ: QCPRD, Группа: ДПР-Энкодер +(long)(&posspeedEqep.QEPSTS), //[5152h.11h], Название: QEPSTS, ТекстПУ: QEPSTS, Группа: ДПР-Энкодер +(long)(&posspeedEqep.RevolutionCounter), //[5152h.12h], Название: Число оборотов, ТекстПУ: revolCounter, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_resContinouosInt8), //[5152h.13h], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_resContinouosInt), //[5152h.14h], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_resContinouosLong), //[5152h.15h], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_mechContinouos), //[5152h.16h], Название: Угол механический не огранич., ТекстПУ: Уг.мех.не_огр, Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_elecContinouos), //[5152h.17h], Название: Угол электрический не огранич., ТекстПУ: Уг.эл.не_огр, Группа: ДПР-Энкодер +(long)(&DPReCAP.Angle), //[5155h.01h], Название: ЭлУгол, ТекстПУ: ЭлУгол, Группа: ДПР-Холл +(long)(&DPReCAP.speed), //[5155h.02h], Название: Скорость , ТекстПУ: Скорость, Группа: ДПР-Холл +(long)(&DPReCAP.speedMIN), //[5155h.03h], Название: Уставка Скорости, ТекстПУ: Уставка Скорости, Группа: ДПР-Холл +(long)(&DPReCAP.Angle6), //[5155h.04h], Название: ЭлУгол6, ТекстПУ: ЭлУгол6, Группа: ДПР-Холл +(long)(&DPReCAP.DPReCAP_FLG1.all), //[5155h.05h], Название: Инт-полятор вкл, ТекстПУ: Инт-полятор вкл, Группа: ДПР-Холл, биты с 0 по 0: 0000000000000001b +(long)(&DPReCAP.milsecREF), //[5155h.06h], Название: Уставка обнуления скорости, ТекстПУ: Уставка обнуления ск, Группа: ДПР-Холл +(long)(&DPReCAP.speedMinREF), //[5155h.07h], Название: Скорость Мин., ТекстПУ: Скорость Мин., Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt), //[5155h.08h], Название: Ложные фронты, ТекстПУ: Ложные фронты, Группа: ДПР-Холл +(long)(&DPReCAP.HallCode), //[5155h.09h], Название: Дискретные входы, ТекстПУ: Входы, Группа: ДПР-Холл, биты с 0 по 2: 0000000000000111b +(long)(&DPReCAP.AngleOffset), //[5155h.0Ah], Название: СмещУгол, ТекстПУ: СмещУг, Группа: ДПР-Холл +(long)(&DPReCAP.ErrorLevel), //[5155h.0Bh], Название: Уровень помех, ТекстПУ: Уровень помех, Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt1), //[5155h.0Ch], Название: Ошибка 1 канала, ТекстПУ: Ошиб_1_к., Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt2), //[5155h.0Dh], Название: Ошибка 2 канала, ТекстПУ: Ошиб_2_к., Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt3), //[5155h.0Eh], Название: Ошибка 3 канала, ТекстПУ: Ошиб_3_к., Группа: ДПР-Холл +(long)(&DPReCAP.UserDirection), //[5155h.0Fh], Название: Направление вращения, ТекстПУ: НапрВр, Группа: ДПР-Холл, биты с 2 по 2: 0000000000000100b +(long)(&DPReCAP.WrongCodeCounterLimitPerSec), //[5155h.10h], Название: Макс.число ошибок ДПР, ТекстПУ: Макс.ош.ДПР, Группа: ДПР-Холл +(long)(&DPReCAP.WrongCodeCounter), //[5155h.11h], Название: Кол-во ошибок неверной последовательности , ТекстПУ: Ошибки последоват., Группа: ДПР-Холл +(long)(&CounterCAP_isr), //[5155h.12h], Название: Счётчик прерываний по приему, ТекстПУ: Счёт.Rx.Int., Группа: ДПР-Холл +(long)(&cap0_counter), //[5155h.13h], Название: Счётчик прерываний CAP1, ТекстПУ: Сч.прерыв.CAP1, Группа: ДПР-Холл +(long)(&cap1_counter), //[5155h.14h], Название: Счётчик прерываний CAP2, ТекстПУ: Сч.прерыв.CAP2, Группа: ДПР-Холл +(long)(&cap2_counter), //[5155h.15h], Название: Счётчик прерываний CAP3, ТекстПУ: Сч.прерыв.CAP3, Группа: ДПР-Холл +(long)(&SSI_Encoder.resol), //[5157h.01h], Название: Количество импульсов на оборот, ТекстПУ: qepTik, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.AngleOffset), //[5157h.02h], Название: СмещУгол, ТекстПУ: СмещУг, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_res), //[5157h.03h], Название: Механическ.угол в метках, ТекстПУ: Механическ.угол в ме, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.speed_elec), //[5157h.04h], Название: Скорость , ТекстПУ: Скорость, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_elec), //[5157h.05h], Название: Угол. электр., ТекстПУ: Угол. электр., Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mech), //[5157h.06h], Название: Угол мех., ТекстПУ: Угол мех., Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mech_filtered), //[5157h.07h], Название: Угол мех. фильтрованный, ТекстПУ: theta_mech_filtered, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mech_filterK), //[5157h.08h], Название: К быстродействия фильтра угла, ТекстПУ: Кф. угла, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.RevolutionCounter), //[5157h.09h], Название: Число оборотов, ТекстПУ: revolCounter, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_resContinouosLong), //[5157h.0Ah], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_resContinouosInt8), //[5157h.0Bh], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_resContinouosInt), //[5157h.0Ch], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mechContinouos), //[5157h.0Dh], Название: Угол механический не огранич., ТекстПУ: Уг.мех.не_огр, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_elecContinouos), //[5157h.0Eh], Название: Угол электрический не огранич., ТекстПУ: Уг.эл.не_огр, Группа: ДПР-SSI энкодер +(long)(&Debug1), //[5174h.01h], Название: DebugL1, ТекстПУ: DebugL1, Группа: Для отладки +(long)(&Debug1), //[5174h.02h], Название: DebugL1, ТекстПУ: DebugL1, Группа: Для отладки +(long)(&Debug2), //[5174h.03h], Название: DebugL2, ТекстПУ: DebugL2, Группа: Для отладки +(long)(&Debug2), //[5174h.04h], Название: DebugL2, ТекстПУ: DebugL2, Группа: Для отладки +(long)(&Debug3), //[5174h.05h], Название: DebugI3, ТекстПУ: DebugI3, Группа: Для отладки +(long)(&Debug3), //[5174h.06h], Название: DebugI3, ТекстПУ: DebugI3, Группа: Для отладки +(long)(&Debug4), //[5174h.07h], Название: DebugI4, ТекстПУ: DebugI4, Группа: Для отладки +(long)(&Debug4), //[5174h.08h], Название: DebugI4, ТекстПУ: DebugI4, Группа: Для отладки +(long)(&DebugW1), //[5174h.09h], Название: DebugW1, ТекстПУ: DebugW1, Группа: Для отладки +(long)(&DebugW1), //[5174h.0Ah], Название: DebugW1, ТекстПУ: DebugW1, Группа: Для отладки +(long)(&DebugW2), //[5174h.0Bh], Название: DebugW2, ТекстПУ: DebugW2, Группа: Для отладки +(long)(&DebugW2), //[5174h.0Ch], Название: DebugW2, ТекстПУ: DebugW2, Группа: Для отладки +(long)(&DebugW3), //[5174h.0Dh], Название: DebugW3, ТекстПУ: DebugW3, Группа: Для отладки +(long)(&DebugW3), //[5174h.0Eh], Название: DebugW3, ТекстПУ: DebugW3, Группа: Для отладки +(long)(&DebugW4), //[5174h.0Fh], Название: DebugW4, ТекстПУ: DebugW4, Группа: Для отладки +(long)(&DebugW4), //[5174h.10h], Название: DebugW4, ТекстПУ: DebugW4, Группа: Для отладки +(long)(&DebugF1), //[5174h.11h], Название: DebugF1, ТекстПУ: DebugF1, Группа: Для отладки +(long)(&DebugF2), //[5174h.12h], Название: DebugF2, ТекстПУ: DebugF2, Группа: Для отладки +(long)(&DebugF3), //[5174h.13h], Название: DebugF3, ТекстПУ: DebugF3, Группа: Для отладки +(long)(&DebugF4), //[5174h.14h], Название: DebugF4, ТекстПУ: DebugF4, Группа: Для отладки +(long)(&UserMem.MemStartAddr), //[5174h.15h], Название: Адрес в EEPROM, ТекстПУ: (null), Группа: Для отладки +(long)(&model.MotorType), //[5181h.01h], Название: Тип двигателя модели, ТекстПУ: ModelMotorType, Группа: Модель общие данные, биты с 0 по 7: 0000000011111111b +(long)(&model.MotorParametersNum), //[5181h.02h], Название: Параметры двигателя, ТекстПУ: ПарДв, Группа: Модель общие данные +(long)(&model.load), //[5181h.03h], Название: Симулируемый момент нагрузки, ТекстПУ: Мнагр сим., Группа: Модель общие данные +(long)(&model.motorInternals.udc), //[5181h.04h], Название: Напряжение ЗПТ, ТекстПУ: Ud, Группа: Модель общие данные +(long)(&model.motorInternals.torque), //[5181h.05h], Название: Реализованный электрический момент, ТекстПУ: Реал.Эл.Мом, Группа: Модель общие данные +(long)(&model.motorInternals.omega), //[5181h.06h], Название: Скорость, ТекстПУ: qepspd, Группа: Модель общие данные +(long)(&model.motorInternals.omega_rpm), //[5181h.07h], Название: Скорость, ТекстПУ: qepspd, Группа: Модель общие данные +(long)(&model.motorInternals.tetaRM), //[5181h.08h], Название: Механический угол, ТекстПУ: qeptm, Группа: Модель общие данные +(long)(&model.qepCounter), //[5181h.09h], Название: EncoderIncrements, ТекстПУ: EncoderIncrements, Группа: Модель общие данные +(long)(&model.motorInternals.isa), //[5181h.0Ah], Название: Ток статора по оси Alpha, ТекстПУ: IsAlpha, Группа: Модель общие данные +(long)(&model.motorInternals.isb), //[5181h.0Bh], Название: Ток статора по оси Beta, ТекстПУ: IsBeta, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseA), //[5181h.0Ch], Название: Ток фазы А, ТекстПУ: Ia, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseB), //[5181h.0Dh], Название: Ток фазы В, ТекстПУ: Ib_мгн, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseC), //[5181h.0Eh], Название: Ток фазы C, ТекстПУ: Ic, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseD), //[5181h.0Fh], Название: Ток фазы D, ТекстПУ: Id, Группа: Модель общие данные +(long)(&model.motorInternals.ua), //[5181h.10h], Название: Напряжение фазы A, ТекстПУ: Ua, Группа: Модель общие данные +(long)(&model.motorInternals.ub), //[5181h.11h], Название: Напряжение фазы B, ТекстПУ: Ub, Группа: Модель общие данные +(long)(&model.motorInternals.uc), //[5181h.12h], Название: Напряжение фазы C, ТекстПУ: Uc, Группа: Модель общие данные +(long)(&model.motorInternals.power), //[5181h.13h], Название: Мощность, ТекстПУ: Мощ-ть, Группа: Модель общие данные +(long)(&model.fault), //[5181h.14h], Название: Код аварии, ТекстПУ: КодАвр, Группа: Модель общие данные +(long)(&model.motorInternals.lm), //[5182h.01h], Название: Взаимная индуктивность Lm, ТекстПУ: Lm, Группа: Модель (асинхронный) +(long)(&model.motorInternals.ls), //[5182h.02h], Название: Индуктивность статора Ls, ТекстПУ: Ls, Группа: Модель (асинхронный) +(long)(&model.motorInternals.lr), //[5182h.03h], Название: Индуктивность ротора Lr, ТекстПУ: Lr, Группа: Модель (асинхронный) +(long)(&model.motorInternals.rs), //[5182h.04h], Название: Сопротивление статора Rs, ТекстПУ: Rs, Группа: Модель (асинхронный) +(long)(&model.motorInternals.rr), //[5182h.05h], Название: Сопротивление ротора Rr, ТекстПУ: Rr, Группа: Модель (асинхронный) +(long)(&model.motorInternals.pp), //[5182h.06h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Модель (асинхронный) +(long)(&model.motorInternals.j), //[5182h.07h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (асинхронный) +(long)(&model.motorInternals.MechLoss), //[5182h.08h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (асинхронный) +(long)(&model.motorInternals.QEPResolution), //[5182h.09h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (асинхронный) +(long)(&model.motorInternals.RatedCurrent), //[5182h.0Ah], Название: Номинальный действующий ток, ТекстПУ: RatedCurrent, Группа: Модель (асинхронный) +(long)(&model.motorInternals.RatedPower), //[5182h.0Bh], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (асинхронный) +(long)(&model.motorInternals.RatedSpeed), //[5182h.0Ch], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (асинхронный) +(long)(&model.motorInternals.iADCk), //[5182h.0Dh], Название: Коэффициент АЦП тока фаз, ТекстПУ: Коэф. АЦП тока, Группа: Модель (асинхронный) +(long)(&model.motorInternals.isa), //[5182h.0Eh], Название: Ток статора по оси Alpha, ТекстПУ: IsAlpha, Группа: Модель (асинхронный) +(long)(&model.motorInternals.isb), //[5182h.0Fh], Название: Ток статора по оси Beta, ТекстПУ: IsBeta, Группа: Модель (асинхронный) +(long)(&model.motorInternals.prd), //[5182h.10h], Название: Поток ротора по оси D, ТекстПУ: PsiRD, Группа: Модель (асинхронный) +(long)(&model.motorInternals.prq), //[5182h.11h], Название: Поток ротора по оси Q, ТекстПУ: PsiRQ, Группа: Модель (асинхронный) +(long)(&model.motorInternals.pra), //[5182h.12h], Название: Поток ротора по оси Alpha, ТекстПУ: PsiRAlfa, Группа: Модель (асинхронный) +(long)(&model.motorInternals.prb), //[5182h.13h], Название: Поток ротора по оси Beta, ТекстПУ: PsiRBeta, Группа: Модель (асинхронный) +(long)(&model.motorInternals.m), //[5183h.01h], Название: Потокосцепление магнитов, ТекстПУ: m, Группа: Модель (синхронный) +(long)(&model.motorInternals.lsd), //[5183h.02h], Название: Индуктивность статора Lsd, ТекстПУ: Lsd, Группа: Модель (синхронный) +(long)(&model.motorInternals.lsq), //[5183h.03h], Название: Индуктивность статора Lsq, ТекстПУ: Lsq, Группа: Модель (синхронный) +(long)(&model.motorInternals.rs), //[5183h.04h], Название: Сопротивление статора Rs, ТекстПУ: Rs, Группа: Модель (синхронный) +(long)(&model.motorInternals.pp), //[5183h.05h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Модель (синхронный) +(long)(&model.motorInternals.j), //[5183h.06h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (синхронный) +(long)(&model.motorInternals.MechLoss), //[5183h.07h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (синхронный) +(long)(&model.motorInternals.QEPResolution), //[5183h.08h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (синхронный) +(long)(&model.motorInternals.iADCk), //[5183h.09h], Название: Коэффициент АЦП тока фаз, ТекстПУ: Коэф. АЦП тока, Группа: Модель (синхронный) +(long)(&model.motorInternals.ifADCk), //[5183h.0Ah], Название: Коэффициент АЦП тока ОВ, ТекстПУ: Коэф. АЦП ток ОВ, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedCurrent), //[5183h.0Bh], Название: Номинальный действующий ток, ТекстПУ: RatedCurrent, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedPower), //[5183h.0Ch], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedSpeed), //[5183h.0Dh], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedFluxCurrent), //[5183h.0Eh], Название: Номинальный ток ОВ, ТекстПУ: RatedFluxCurrent, Группа: Модель (синхронный) +(long)(&model.motorInternals.u_f), //[5183h.0Fh], Название: Разность потенциалов ОВ, ТекстПУ: Uf, Группа: Модель (синхронный) +(long)(&model.motorInternals.i_f), //[5183h.10h], Название: Ток ОВ, ТекстПУ: Ток ОВ, Группа: Модель (синхронный) +(long)(&model.motorInternals.m), //[5183h.11h], Название: Поток возбуждения, ТекстПУ: Psi возб, Группа: Модель (синхронный) +(long)(&model.motorInternals.l_a), //[5184h.01h], Название: Индуктивность якоря, ТекстПУ: La, Группа: Модель (ДПТ) +(long)(&model.motorInternals.l_f), //[5184h.02h], Название: Индуктивность ОВ, ТекстПУ: Lf, Группа: Модель (ДПТ) +(long)(&model.motorInternals.r_a), //[5184h.03h], Название: Сопротивление якоря, ТекстПУ: Ra, Группа: Модель (ДПТ) +(long)(&model.motorInternals.r_f), //[5184h.04h], Название: Сопротивление ОВ, ТекстПУ: Rf, Группа: Модель (ДПТ) +(long)(&model.motorInternals.j), //[5184h.05h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (ДПТ) +(long)(&model.motorInternals.MechLoss), //[5184h.06h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (ДПТ) +(long)(&model.motorInternals.QEPResolution), //[5184h.07h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedCurrent), //[5184h.08h], Название: Номинальный ток якоря, ТекстПУ: RatedCurrent, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedFluxCurrent), //[5184h.09h], Название: Номинальный ток ОВ, ТекстПУ: RatedFluxCurrent, Группа: Модель (ДПТ) +(long)(&model.motorInternals.iADCk), //[5184h.0Ah], Название: Коэффициент АЦП тока ОЯ, ТекстПУ: Коэф. АЦП ток ОЯ, Группа: Модель (ДПТ) +(long)(&model.motorInternals.ifADCk), //[5184h.0Bh], Название: Коэффициент АЦП тока ОВ, ТекстПУ: Коэф. АЦП ток ОВ, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedPower), //[5184h.0Ch], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedSpeed), //[5184h.0Dh], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (ДПТ) +(long)(&model.motorInternals.r_ad), //[5184h.0Eh], Название: Добавочное сопротивление, Rad, ТекстПУ: Доб.сопротив., Группа: Модель (ДПТ) +(long)(&model.motorInternals.u_a), //[5184h.0Fh], Название: Разность потенциалов ОЯ, ТекстПУ: Ua, Группа: Модель (ДПТ) +(long)(&model.motorInternals.u_f), //[5184h.10h], Название: Разность потенциалов ОВ, ТекстПУ: Uf, Группа: Модель (ДПТ) +(long)(&model.motorInternals.i_a), //[5184h.11h], Название: Ток ОЯ, ТекстПУ: Ia, Группа: Модель (ДПТ) +(long)(&model.motorInternals.i_f), //[5184h.12h], Название: Ток ОВ, ТекстПУ: Ток ОВ, Группа: Модель (ДПТ) +(long)(&refs.DCMspeed_ref), //[5185h.01h], Название: Задание скорости (Подч. Рег.), ТекстПУ: Зад. Скор., Группа: ДПТ Сист. Упр. +(long)(&refs.ua_ref), //[5185h.02h], Название: Заданное напряжение якоря, ТекстПУ: Ua_ref, Группа: ДПТ Сист. Упр. +(long)(&refs.uf_ref), //[5185h.03h], Название: Заданное напряжение ОВ, ТекстПУ: Uf_ref, Группа: ДПТ Сист. Упр. +(long)(&model.motorInternals.j), //[5186h.01h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (ВИД) +(long)(&model.motorInternals.MechLoss), //[5186h.02h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (ВИД) +(long)(&model.motorInternals.rs), //[5186h.03h], Название: Сопротивление статора Rs, ТекстПУ: Rs, Группа: Модель (ВИД) +(long)(&model.motorInternals.pp), //[5186h.04h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Модель (ВИД) +(long)(&model.motorInternals.QEPResolution), //[5186h.05h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (ВИД) +(long)(&model.motorInternals.iADCk), //[5186h.06h], Название: Коэффициент АЦП тока фаз, ТекстПУ: Коэф. АЦП тока, Группа: Модель (ВИД) +(long)(&model.motorInternals.RatedCurrent), //[5186h.07h], Название: Номинальный действующий ток, ТекстПУ: RatedCurrent, Группа: Модель (ВИД) +(long)(&model.motorInternals.RatedPower), //[5186h.08h], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (ВИД) +(long)(&model.motorInternals.RatedSpeed), //[5186h.09h], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (ВИД) +(long)(&model.motorInternals.psa), //[5186h.0Ah], Название: Поток статора фазы A, ТекстПУ: Поток A, Группа: Модель (ВИД) +(long)(&model.motorInternals.psb), //[5186h.0Bh], Название: Поток статора фазы B, ТекстПУ: Поток B, Группа: Модель (ВИД) +(long)(&model.motorInternals.psc), //[5186h.0Ch], Название: Поток статора фазы C, ТекстПУ: Поток C, Группа: Модель (ВИД) +(long)(&model.motorInternals.torque_a), //[5186h.0Dh], Название: Момент фазы A, ТекстПУ: Момент A, Группа: Модель (ВИД) +(long)(&model.motorInternals.torque_b), //[5186h.0Eh], Название: Момент фазы B, ТекстПУ: Момент B, Группа: Модель (ВИД) +(long)(&model.motorInternals.torque_c), //[5186h.0Fh], Название: Момент фазы C, ТекстПУ: Момент C, Группа: Модель (ВИД) +(long)(&RotorObserver.Tr), //[5B04h.01h], Название: Пост. времени ротора, ТекстПУ: Tr, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.FluxCurrentRatio), //[5B04h.02h], Название: Соотношение тока возб. X к току Y, ТекстПУ: FluxCurrentRatio, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.FluxCurrentMin), //[5B04h.03h], Название: Минимальный ток возбуждения, ТекстПУ: FluxCurrentMin, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.id), //[5B04h.04h], Название: Ток статора по оси D, ТекстПУ: IsD, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.iq), //[5B04h.05h], Название: Ток статора по оси Q, ТекстПУ: IsQ, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.psi_d), //[5B04h.06h], Название: Поток ротора по оси D, ТекстПУ: PsiRD, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.psi_q), //[5B04h.07h], Название: Поток ротора по оси Q, ТекстПУ: PsiRQ, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.theta_psi_elec), //[5B04h.08h], Название: Угол потока ротора, ТекстПУ: psiRalpha, Группа: Наблюдатель ротора АД +(long)(&udControl.StateOn), //[5B05h.01h], Название: Текущее состояние реле, ТекстПУ: Relay_state, Группа: Плавный заряд ЗПТ +(long)(&udControl.Timeout_on), //[5B05h.02h], Название: Задежка включения реле, мс, ТекстПУ: relay on-delay, Группа: Плавный заряд ЗПТ +(long)(&udControl.U_on), //[5B05h.03h], Название: Напряжение включения, В, ТекстПУ: on-voltage, Группа: Плавный заряд ЗПТ +(long)(&udControl.U_off), //[5B05h.04h], Название: Напряжение выключения, В, ТекстПУ: off-voltage, Группа: Плавный заряд ЗПТ +(long)(&udControl.deriv_time_ZPT), //[5B05h.05h], Название: Производная напряжения ЗПТ, ТекстПУ: derivative_voltage, Группа: Плавный заряд ЗПТ +(long)(&udControl.deriv_const), //[5B05h.06h], Название: Уставка по производной ЗПТ, ТекстПУ: derivative_const, Группа: Плавный заряд ЗПТ +(long)(&FanControl.StateOn), //[5B06h.01h], Название: Текущее состояние вентилятора, ТекстПУ: fan_state, Группа: Система охлаждения +(long)(&FanControl.T_on), //[5B06h.02h], Название: Температура включения вентилятора, ТекстПУ: t_on, Группа: Система охлаждения +(long)(&FanControl.T_off), //[5B06h.03h], Название: Температура выключения вентилятора, ТекстПУ: t_off, Группа: Система охлаждения +(long)(&FanControl.T_alarm), //[5B06h.04h], Название: Температура вывода предупреждения о перегреве, ТекстПУ: t_alarm, Группа: Система охлаждения +}; +Uint16 const CO1_OD_TBL2[] = { +32045, 1, 0, +31021, 2, 1, +32041, 3, 2, +32013, 4, 3, + +28814, +5, +3, +64769, 5, 4, +(Uint16)(2000), (((Uint32)2000)>>16), +64257, 6, 5, +(Uint16)(1000), + +28801, +7, +1, +32013, 8, 6, +32013, 9, 7, +32013, 10, 8, +32013, 11, 9, + +19631, +12, +1, +31021, 13, 10, +31021, 14, 11, + +19632, +15, +1, +30765, 16, 12, +30765, 17, 13, +29741, 18, 14, + +18607, +19, +3, +64813, 20, 15, +(Uint16)(0x180), (((Uint32)0x180)>>16), +28973, 21, 16, +0, +0, + +18607, +22, +3, +64813, 23, 17, +(Uint16)(0x280), (((Uint32)0x280)>>16), +28973, 21, 18, +0, +0, + +18607, +24, +3, +64809, 25, 19, +(Uint16)(0x0401), (((Uint32)0x0401)>>16), +28969, 21, 20, +0, +0, + +18607, +26, +3, +64809, 27, 21, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28969, 21, 22, +0, +0, + +18607, +28, +3, +64813, 29, 23, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28973, 21, 24, +0, +0, + +18607, +30, +3, +64813, 31, 25, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28973, 21, 26, +0, +0, + +18607, +32, +3, +64801, 33, 27, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28961, 21, 28, +0, +0, + +18607, +34, +3, +64801, 35, 29, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28961, 21, 30, +0, +0, + +19633, +36, +3, +61741, 37, 31, +(Uint16)(0), (((Uint32)0)>>16), +61741, 38, 32, +(Uint16)(0), (((Uint32)0)>>16), +61741, 39, 33, +(Uint16)(0), (((Uint32)0)>>16), +61741, 40, 34, +(Uint16)(0), (((Uint32)0)>>16), + +19633, +41, +3, +61741, 42, 35, +(Uint16)(0), (((Uint32)0)>>16), +61741, 43, 36, +(Uint16)(0), (((Uint32)0)>>16), +61741, 44, 37, +(Uint16)(0), (((Uint32)0)>>16), +61741, 45, 38, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +46, +3, +61737, 47, 39, +(Uint16)(0), (((Uint32)0)>>16), +61737, 48, 40, +(Uint16)(0), (((Uint32)0)>>16), +61737, 49, 41, +(Uint16)(0), (((Uint32)0)>>16), +61737, 50, 42, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +51, +3, +61737, 52, 43, +(Uint16)(0), (((Uint32)0)>>16), +61737, 53, 44, +(Uint16)(0), (((Uint32)0)>>16), +61737, 54, 45, +(Uint16)(0), (((Uint32)0)>>16), +61737, 55, 46, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +56, +3, +61741, 57, 47, +(Uint16)(0), (((Uint32)0)>>16), +61741, 58, 48, +(Uint16)(0), (((Uint32)0)>>16), +61741, 59, 49, +(Uint16)(0), (((Uint32)0)>>16), +61741, 60, 50, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +61, +3, +61741, 62, 51, +(Uint16)(0), (((Uint32)0)>>16), +61741, 63, 52, +(Uint16)(0), (((Uint32)0)>>16), +61741, 64, 53, +(Uint16)(0), (((Uint32)0)>>16), +61741, 65, 54, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +66, +3, +61729, 67, 55, +(Uint16)(0), (((Uint32)0)>>16), +61729, 68, 56, +(Uint16)(0), (((Uint32)0)>>16), +61729, 69, 57, +(Uint16)(0), (((Uint32)0)>>16), +61729, 70, 58, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +71, +3, +61729, 72, 59, +(Uint16)(0), (((Uint32)0)>>16), +61729, 73, 60, +(Uint16)(0), (((Uint32)0)>>16), +61729, 74, 61, +(Uint16)(0), (((Uint32)0)>>16), +61729, 75, 62, +(Uint16)(0), (((Uint32)0)>>16), + +16562, +76, +2, +32045, 77, 63, +0, +31021, 21, 64, +0, +64301, 78, 65, +(Uint16)(100), +47405, 79, 66, +(Uint16)(0), +64301, 80, 67, +(Uint16)(100), + +16560, +81, +2, +32045, 82, 68, +0, +31021, 21, 69, +0, +64301, 83, 70, +(Uint16)(100), +47405, 79, 71, +(Uint16)(0), +64301, 84, 72, +(Uint16)(1000), + +16562, +85, +2, +32041, 86, 73, +0, +31017, 21, 74, +0, +64297, 87, 75, +(Uint16)(100), +47401, 79, 76, +(Uint16)(0), +64297, 88, 77, +(Uint16)(1000), + +16556, +89, +2, +32041, 90, 78, +0, +31017, 21, 79, +0, +64297, 91, 80, +(Uint16)(100), +47401, 79, 81, +(Uint16)(0), +64297, 92, 82, +(Uint16)(1000), + +16554, +93, +2, +32045, 94, 83, +0, +31021, 21, 84, +0, +64301, 95, 85, +(Uint16)(100), +47405, 79, 86, +(Uint16)(0), +64301, 96, 87, +(Uint16)(1000), + +16552, +97, +2, +32045, 98, 88, +0, +31021, 21, 89, +0, +64301, 99, 90, +(Uint16)(100), +47405, 79, 91, +(Uint16)(0), +64301, 100, 92, +(Uint16)(1000), + +16554, +101, +2, +32033, 102, 93, +0, +31009, 21, 94, +0, +64289, 103, 95, +(Uint16)(100), +47393, 79, 96, +(Uint16)(0), +64289, 104, 97, +(Uint16)(1000), + +16556, +105, +2, +32033, 106, 98, +0, +31009, 21, 99, +0, +64289, 107, 100, +(Uint16)(100), +47393, 79, 101, +(Uint16)(0), +64289, 108, 102, +(Uint16)(1000), + +19633, +109, +3, +63789, 110, 103, +(Uint16)(0), (((Uint32)0)>>16), +63789, 111, 104, +(Uint16)(0), (((Uint32)0)>>16), +63789, 112, 105, +(Uint16)(0), (((Uint32)0)>>16), +63789, 113, 106, +(Uint16)(0), (((Uint32)0)>>16), + +19633, +114, +3, +63789, 115, 107, +(Uint16)(0), (((Uint32)0)>>16), +63789, 116, 108, +(Uint16)(0), (((Uint32)0)>>16), +63789, 117, 109, +(Uint16)(0), (((Uint32)0)>>16), +63789, 118, 110, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +119, +3, +63785, 120, 111, +(Uint16)(0), (((Uint32)0)>>16), +63785, 121, 112, +(Uint16)(0), (((Uint32)0)>>16), +63785, 122, 113, +(Uint16)(0), (((Uint32)0)>>16), +63785, 123, 114, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +124, +3, +63785, 125, 115, +(Uint16)(0), (((Uint32)0)>>16), +63785, 126, 116, +(Uint16)(0), (((Uint32)0)>>16), +63785, 127, 117, +(Uint16)(0), (((Uint32)0)>>16), +63785, 128, 118, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +129, +3, +63789, 130, 119, +(Uint16)(0), (((Uint32)0)>>16), +63789, 131, 120, +(Uint16)(0), (((Uint32)0)>>16), +63789, 132, 121, +(Uint16)(0), (((Uint32)0)>>16), +63789, 133, 122, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +134, +3, +63789, 135, 123, +(Uint16)(0), (((Uint32)0)>>16), +63789, 136, 124, +(Uint16)(0), (((Uint32)0)>>16), +63789, 137, 125, +(Uint16)(0), (((Uint32)0)>>16), +63789, 138, 126, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +139, +3, +63777, 140, 127, +(Uint16)(0), (((Uint32)0)>>16), +63777, 141, 128, +(Uint16)(0), (((Uint32)0)>>16), +63777, 142, 129, +(Uint16)(0), (((Uint32)0)>>16), +63777, 143, 130, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +144, +3, +63777, 145, 131, +(Uint16)(0), (((Uint32)0)>>16), +63777, 146, 132, +(Uint16)(0), (((Uint32)0)>>16), +63777, 147, 133, +(Uint16)(0), (((Uint32)0)>>16), +63777, 148, 134, +(Uint16)(0), (((Uint32)0)>>16), +64173, 149, 135, +(Uint16)(1), +(Uint16)(1), (Uint16)(127), +53469, 150, 136, +(Uint16)(3), + +28845, +7, +1, +32041, 8, 137, +32041, 9, 138, +32041, 10, 139, +32041, 11, 140, + +28845, +151, +1, +31529, 152, 141, +31529, 153, 142, +31529, 154, 143, +31529, 155, 144, +64813, 156, 145, +(Uint16)(0), (((Uint32)0)>>16), +20669, 157, 146, + +28845, +158, +1, +32033, 159, 147, +32033, 160, 148, +32033, 161, 149, +32033, 162, 150, + +28849, +163, +1, +32013, 164, 151, +32013, 165, 152, +32013, 166, 153, +32013, 167, 154, + +28849, +168, +3, +64781, 169, 155, +(Uint16)(0), (((Uint32)0)>>16), +64781, 170, 156, +(Uint16)(0), (((Uint32)0)>>16), +64781, 171, 157, +(Uint16)(0), (((Uint32)0)>>16), +64781, 172, 158, +(Uint16)(0), (((Uint32)0)>>16), +53433, 173, 159, +(Uint16)(1), +53437, 174, 160, +(Uint16)(1), +30989, 175, 161, +31489, 176, 162, +32001, 177, 163, + +28859, +178, +2, +47661, 179, 164, +(Uint16)(0), +47661, 180, 165, +(Uint16)(0x2000), +47661, 181, 166, +(Uint16)(0), +31277, 182, 167, +0, +31277, 183, 168, +0, +31277, 184, 169, +0, +31277, 185, 170, +0, +31277, 186, 171, +0, +31277, 187, 172, +0, +31277, 188, 173, +0, +31277, 189, 174, +0, +31277, 190, 175, +0, +31277, 190, 176, +0, +31277, 191, 177, +0, +31277, 192, 178, + +28847, +193, +3, +48169, 194, 179, +(Uint16)(0x30000000), (((Uint32)0x30000000)>>16), +48169, 195, 180, +(Uint16)(0x30000000), (((Uint32)0x30000000)>>16), + +28857, +196, +2, +36905, 197, 181, +(Uint16)(0), +36913, 198, 182, +(Uint16)(0), +36905, 199, 183, +(Uint16)(0), +36913, 200, 184, +(Uint16)(0), +36905, 201, 185, +(Uint16)(0), +36913, 202, 186, +(Uint16)(0), +36905, 203, 187, +(Uint16)(0), +36913, 204, 188, +(Uint16)(0), +36905, 205, 189, +(Uint16)(0), +36913, 206, 190, +(Uint16)(0), +36905, 207, 191, +(Uint16)(0), +36913, 208, 192, +(Uint16)(0), +36905, 209, 193, +(Uint16)(0), +36913, 210, 194, +(Uint16)(0), +36905, 211, 195, +(Uint16)(0), +36913, 212, 196, +(Uint16)(0), + +28339, +213, +2, +31533, 214, 197, +0, +47917, 215, 198, +(Uint16)(32), +37117, 216, 199, +(Uint16)(0), +37074, 217, 200, +(Uint16)(1), +36580, 218, 201, +(Uint16)(0), +37143, 219, 202, +(Uint16)(0), + +28339, +220, +2, +31533, 221, 203, +0, +47917, 222, 204, +(Uint16)(4128), +37117, 216, 205, +(Uint16)(0), +37072, 217, 206, +(Uint16)(1), +36578, 218, 207, +(Uint16)(0), +37143, 219, 208, +(Uint16)(4), + +28339, +223, +2, +31529, 224, 209, +0, +47913, 225, 210, +(Uint16)(3136), +37113, 216, 211, +(Uint16)(0), +37074, 217, 212, +(Uint16)(2), +36576, 218, 213, +(Uint16)(0), +37143, 219, 214, +(Uint16)(3), + +28339, +226, +2, +31529, 227, 215, +0, +47913, 228, 216, +(Uint16)(2112), +37113, 216, 217, +(Uint16)(0), +37068, 217, 218, +(Uint16)(2), +36578, 218, 219, +(Uint16)(0), +37143, 219, 220, +(Uint16)(2), + +28331, +229, +2, +31533, 230, 221, +0, +47917, 231, 222, +(Uint16)(1056), +37117, 216, 223, +(Uint16)(0), +37066, 217, 224, +(Uint16)(1), +36580, 218, 225, +(Uint16)(0), +37143, 219, 226, +(Uint16)(1), + +28331, +232, +2, +31533, 233, 227, +0, +47917, 234, 228, +(Uint16)(1056), +37117, 216, 229, +(Uint16)(0), +37064, 217, 230, +(Uint16)(1), +36570, 218, 231, +(Uint16)(0), +37143, 219, 232, +(Uint16)(1), + +28331, +235, +2, +31521, 236, 233, +0, +47905, 237, 234, +(Uint16)(1088), +37105, 216, 235, +(Uint16)(0), +37066, 217, 236, +(Uint16)(2), +36568, 218, 237, +(Uint16)(0), +37143, 219, 238, +(Uint16)(1), + +28331, +238, +2, +31521, 239, 239, +0, +47905, 240, 240, +(Uint16)(2112), +37105, 216, 241, +(Uint16)(0), +37068, 217, 242, +(Uint16)(2), +36570, 218, 243, +(Uint16)(0), +37143, 219, 244, +(Uint16)(2), + +28323, +241, +2, +31533, 242, 245, +0, +47917, 243, 246, +(Uint16)(9286), +37117, 216, 247, +(Uint16)(6), +37058, 217, 248, +(Uint16)(2), +36564, 218, 249, +(Uint16)(0), +37127, 219, 250, +(Uint16)(9), + +28323, +244, +2, +31533, 245, 251, +0, +47917, 246, 252, +(Uint16)(5184), +37117, 216, 253, +(Uint16)(0), +37056, 217, 254, +(Uint16)(2), +36562, 218, 255, +(Uint16)(0), +37127, 219, 256, +(Uint16)(5), + +28323, +247, +2, +31529, 248, 257, +0, +47913, 249, 258, +(Uint16)(12320), +37113, 216, 259, +(Uint16)(0), +37058, 217, 260, +(Uint16)(1), +36560, 218, 261, +(Uint16)(0), +37127, 219, 262, +(Uint16)(12), + +28323, +250, +2, +31529, 251, 263, +0, +47913, 252, 264, +(Uint16)(6144), +37113, 216, 265, +(Uint16)(0), +37068, 217, 266, +(Uint16)(0), +36562, 218, 267, +(Uint16)(0), +37127, 219, 268, +(Uint16)(6), + +28331, +253, +2, +31533, 254, 269, +0, +47917, 255, 270, +(Uint16)(7168), +37117, 216, 271, +(Uint16)(0), +37066, 217, 272, +(Uint16)(0), +36564, 218, 273, +(Uint16)(0), +37127, 219, 274, +(Uint16)(7), + +28331, +256, +2, +31533, 257, 275, +0, +47917, 258, 276, +(Uint16)(2048), +37117, 216, 277, +(Uint16)(0), +37064, 217, 278, +(Uint16)(0), +36570, 218, 279, +(Uint16)(0), +37127, 219, 280, +(Uint16)(2), + +28331, +259, +2, +31505, 260, 281, +0, +47889, 261, 282, +(Uint16)(1024), +37089, 216, 283, +(Uint16)(0), +37066, 217, 284, +(Uint16)(0), +36568, 218, 285, +(Uint16)(0), +37127, 219, 286, +(Uint16)(1), + +28331, +262, +2, +31505, 263, 287, +0, +47889, 264, 288, +(Uint16)(96), +37089, 216, 289, +(Uint16)(0), +37068, 217, 290, +(Uint16)(3), +36570, 218, 291, +(Uint16)(0), +37127, 219, 292, +(Uint16)(0), + +28339, +265, +2, +31501, 266, 293, +0, +47885, 267, 294, +(Uint16)(3136), +37117, 216, 295, +(Uint16)(0), +37074, 217, 296, +(Uint16)(2), +36548, 218, 297, +(Uint16)(0), +37143, 219, 298, +(Uint16)(3), + +28339, +268, +2, +31501, 269, 299, +0, +47885, 270, 300, +(Uint16)(9408), +37117, 216, 301, +(Uint16)(0), +37072, 217, 302, +(Uint16)(2), +36546, 218, 303, +(Uint16)(1), +37143, 219, 304, +(Uint16)(9), + +28339, +271, +2, +31497, 272, 305, +0, +47881, 273, 306, +(Uint16)(9414), +37113, 216, 307, +(Uint16)(6), +37074, 217, 308, +(Uint16)(2), +36544, 218, 309, +(Uint16)(1), +37143, 219, 310, +(Uint16)(9), + +28339, +274, +2, +31497, 275, 311, +0, +47881, 276, 312, +(Uint16)(12352), +37113, 216, 313, +(Uint16)(0), +37036, 217, 314, +(Uint16)(2), +36546, 218, 315, +(Uint16)(0), +37143, 219, 316, +(Uint16)(12), + +28299, +277, +2, +31501, 278, 317, +0, +47885, 279, 318, +(Uint16)(13344), +37117, 216, 319, +(Uint16)(0), +37034, 217, 320, +(Uint16)(1), +36548, 218, 321, +(Uint16)(0), +37143, 219, 322, +(Uint16)(13), + +28299, +280, +2, +31501, 281, 323, +0, +47885, 282, 324, +(Uint16)(10240), +37117, 216, 325, +(Uint16)(0), +37032, 217, 326, +(Uint16)(0), +36570, 218, 327, +(Uint16)(0), +37143, 219, 328, +(Uint16)(10), + +28299, +283, +2, +31489, 284, 329, +0, +47873, 285, 330, +(Uint16)(14400), +37105, 216, 331, +(Uint16)(0), +37034, 217, 332, +(Uint16)(2), +36568, 218, 333, +(Uint16)(0), +37143, 219, 334, +(Uint16)(14), + +28299, +286, +2, +31489, 287, 335, +0, +47873, 288, 336, +(Uint16)(15430), +37105, 216, 337, +(Uint16)(6), +37036, 217, 338, +(Uint16)(2), +36570, 218, 339, +(Uint16)(0), +37143, 219, 340, +(Uint16)(15), + +28291, +289, +2, +31501, 290, 341, +0, +47885, 291, 342, +(Uint16)(16448), +37117, 216, 343, +(Uint16)(0), +37026, 217, 344, +(Uint16)(2), +36564, 218, 345, +(Uint16)(0), +36583, 219, 346, +(Uint16)(16), + +28291, +292, +2, +31501, 293, 347, +0, +47885, 294, 348, +(Uint16)(13312), +37117, 216, 349, +(Uint16)(0), +37024, 217, 350, +(Uint16)(0), +36562, 218, 351, +(Uint16)(0), +36583, 219, 352, +(Uint16)(13), + +28291, +295, +2, +31497, 296, 353, +0, +47881, 297, 354, +(Uint16)(14336), +37113, 216, 355, +(Uint16)(0), +37026, 217, 356, +(Uint16)(0), +36560, 218, 357, +(Uint16)(0), +36583, 219, 358, +(Uint16)(14), + +28291, +298, +2, +31497, 299, 359, +0, +47881, 300, 360, +(Uint16)(12384), +37113, 216, 361, +(Uint16)(0), +37036, 217, 362, +(Uint16)(3), +36562, 218, 363, +(Uint16)(0), +36583, 219, 364, +(Uint16)(12), + +28299, +301, +2, +31501, 302, 365, +0, +47885, 303, 366, +(Uint16)(0), +37117, 216, 367, +(Uint16)(0), +37034, 217, 368, +(Uint16)(0), +36564, 218, 369, +(Uint16)(0), +36583, 219, 370, +(Uint16)(0), + +28299, +304, +2, +31501, 305, 371, +0, +47885, 306, 372, +(Uint16)(0), +37117, 216, 373, +(Uint16)(0), +37032, 217, 374, +(Uint16)(0), +36570, 218, 375, +(Uint16)(0), +36583, 219, 376, +(Uint16)(0), + +28333, +307, +4, +36537, 308, 377, +(Uint16)(256), +0, +0, +36542, 309, 378, +(Uint16)(256), +0, +0, +36543, 310, 379, +(Uint16)(256), +0, +0, +45225, 307, 380, +(Uint16)(0), +(Uint16)(0), (Uint16)(1), + +28333, +756, +3, +48417, 581, 381, +(Uint16)(0), (((Uint32)0)>>16), +48417, 582, 382, +(Uint16)(0), (((Uint32)0)>>16), +48417, 754, 383, +(Uint16)(0), (((Uint32)0)>>16), +48417, 753, 384, +(Uint16)(0), (((Uint32)0)>>16), +48401, 311, 385, +(Uint16)(438392299), (((Uint32)438392299)>>16), + +28236, +312, +1, +20169, 313, 386, +18737, 314, 387, +20153, 312, 388, + +28238, +315, +2, +45261, 316, 389, +(Uint16)(15), + +27822, +577, +3, +45357, 577, 390, +(Uint16)(0x11111111), (((Uint32)0x11111111)>>16), +45869, 596, 391, +(Uint16)(0), + +28346, +597, +7, +45741, 598, 392, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 599, 393, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 600, 394, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 601, 395, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 602, 396, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 603, 397, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 604, 398, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 605, 399, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 606, 400, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 607, 401, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 608, 402, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 609, 403, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 610, 404, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 611, 405, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45357, 612, 406, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +20749, 317, 407, + +3762, +312, +2, +47917, 318, 408, +(Uint16)(58002), +47917, 319, 409, +(Uint16)(14349), +47917, 320, 410, +(Uint16)(64364), +47917, 321, 411, +(Uint16)(3745), +47917, 322, 412, +(Uint16)(1832), + +28848, +323, +7, +58853, 324, 413, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(_IQ(120.0)), (((Uint32)_IQ(120.0))>>16), +26437, 325, 414, +0, +0, +0, +0, +0, +0, +26437, 326, 415, +0, +0, +0, +0, +0, +0, + +20154, +327, +7, +25925, 328, 416, +0, +0, +0, +0, +0, +0, +25925, 329, 417, +0, +0, +0, +0, +0, +0, +9381, 330, 418, +(Uint16)(335544), (((Uint32)335544)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9509, 331, 419, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9509, 332, 420, +(Uint16)(-16777216), (((Uint32)-16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9381, 333, 421, +(Uint16)(2684354), (((Uint32)2684354)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 334, 422, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 335, 423, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +25925, 336, 424, +0, +0, +0, +0, +0, +0, +25893, 337, 425, +0, +0, +0, +0, +0, +0, +25893, 338, 426, +0, +0, +0, +0, +0, +0, +25893, 339, 427, +0, +0, +0, +0, +0, +0, +25893, 340, 428, +0, +0, +0, +0, +0, +0, + +20155, +341, +7, +26437, 342, 429, +0, +0, +0, +0, +0, +0, +26437, 343, 430, +0, +0, +0, +0, +0, +0, +9381, 330, 431, +(Uint16)(3355443), (((Uint32)3355443)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9541, 331, 432, +(Uint16)(13421772), (((Uint32)13421772)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9541, 332, 433, +(Uint16)(-13421772), (((Uint32)-13421772)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 333, 434, +(Uint16)(16777), (((Uint32)16777)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 344, 435, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 335, 436, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +26437, 336, 437, +0, +0, +0, +0, +0, +0, +25925, 345, 438, +0, +0, +0, +0, +0, +0, +25925, 338, 439, +0, +0, +0, +0, +0, +0, +25925, 339, 440, +0, +0, +0, +0, +0, +0, +25925, 340, 441, +0, +0, +0, +0, +0, +0, +25925, 346, 442, +0, +0, +0, +0, +0, +0, + +20154, +347, +7, +25921, 348, 443, +0, +0, +0, +0, +0, +0, +25921, 349, 444, +0, +0, +0, +0, +0, +0, +9377, 350, 445, +(Uint16)(335544), (((Uint32)335544)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9505, 351, 446, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9505, 352, 447, +(Uint16)(-16777216), (((Uint32)-16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9377, 353, 448, +(Uint16)(2684354), (((Uint32)2684354)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 354, 449, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 335, 450, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +25921, 336, 451, +0, +0, +0, +0, +0, +0, +25889, 355, 452, +0, +0, +0, +0, +0, +0, +25889, 338, 453, +0, +0, +0, +0, +0, +0, +25889, 339, 454, +0, +0, +0, +0, +0, +0, +25889, 340, 455, +0, +0, +0, +0, +0, +0, + +20157, +356, +7, +15401, 342, 456, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +10017, 342, 457, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +26401, 343, 458, +0, +0, +0, +0, +0, +0, +31785, 343, 459, +0, +0, +0, +0, +0, +0, +9377, 330, 460, +(Uint16)(1174405120), (((Uint32)1174405120)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10049, 331, 461, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10049, 332, 462, +(Uint16)(-100663296), (((Uint32)-100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 333, 463, +(Uint16)(83886), (((Uint32)83886)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 344, 464, +(Uint16)(167772160), (((Uint32)167772160)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15401, 357, 465, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +9377, 358, 466, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 335, 467, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10017, 359, 468, +(Uint16)(13981), (((Uint32)13981)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +26401, 336, 469, +0, +0, +0, +0, +0, +0, +25761, 346, 470, +0, +0, +0, +0, +0, +0, +26433, 345, 471, +0, +0, +0, +0, +0, +0, +26433, 338, 472, +0, +0, +0, +0, +0, +0, +26433, 339, 473, +0, +0, +0, +0, +0, +0, +26433, 340, 474, +0, +0, +0, +0, +0, +0, +26401, 360, 475, +0, +0, +0, +0, +0, +0, + +20156, +362, +7, +25893, 363, 476, +0, +0, +0, +0, +0, +0, +25893, 364, 477, +0, +0, +0, +0, +0, +0, +8901, 365, 478, +(Uint16)(14529069), (((Uint32)14529069)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0x01000000), (((Uint32)0x01000000)>>16), +31533, 366, 479, +0, +0, +0, +0, +0, +0, +31533, 367, 480, +0, +0, +0, +0, +0, +0, +31533, 368, 481, +0, +0, +0, +0, +0, +0, +31533, 369, 482, +0, +0, +0, +0, +0, +0, +11429, 370, 483, +(Uint16)(33554432), (((Uint32)33554432)>>16), +(Uint16)(_IQ(2.0)), (((Uint32)_IQ(2.0))>>16), (Uint16)(_IQ(10.0)), (((Uint32)_IQ(10.0))>>16), +11429, 371, 484, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(_IQ(10)), (((Uint32)_IQ(10))>>16), +8901, 372, 485, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +11965, 373, 486, +(Uint16)(1), +0, +0, +0, +0, +0, +15149, 374, 487, +(Uint16)(1), +0, +0, +0, +0, +0, +31661, 375, 488, +0, +0, +0, +0, +0, +0, +9367, 376, 489, +(Uint16)(20480), (((Uint32)20480)>>16), +(Uint16)(2048), (((Uint32)2048)>>16), (Uint16)(20480), (((Uint32)20480)>>16), +31277, 377, 490, +0, +0, +0, +0, +0, +0, +25893, 378, 491, +0, +0, +0, +0, +0, +0, +31533, 379, 492, +0, +0, +0, +0, +0, +0, + +20143, +380, +2, +31273, 381, 493, +0, +53545, 382, 494, +(Uint16)(1), + +20132, +383, +7, +15121, 384, 495, +(Uint16)(0), +0, +0, +0, +0, +0, +15121, 385, 496, +(Uint16)(0), +0, +0, +0, +0, +0, +53265, 386, 497, +(Uint16)(255), +0, +0, +0, +0, +0, +53289, 387, 498, +(Uint16)(255), +0, +0, +0, +0, +0, +53265, 388, 499, +(Uint16)(255), +0, +0, +0, +0, +0, +53289, 389, 500, +(Uint16)(255), +0, +0, +0, +0, +0, +9529, 390, 501, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9625, 391, 502, +(Uint16)(18454938), (((Uint32)18454938)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9625, 392, 503, +(Uint16)(6990506), (((Uint32)6990506)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10041, 393, 504, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9721, 639, 505, +(Uint16)(75497472), (((Uint32)75497472)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20146, +394, +7, +10017, 395, 506, +(Uint16)(67108), (((Uint32)67108)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9505, 396, 507, +(Uint16)(3355443), (((Uint32)3355443)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9505, 397, 508, +(Uint16)(3355443), (((Uint32)3355443)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9985, 398, 509, +(Uint16)(720992), (((Uint32)720992)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9601, 559, 510, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20144, +399, +7, +15241, 400, 511, +(Uint16)(2), +(Uint16)(1), (Uint16)(50), +0, +0, +0, +8265, 401, 512, +(Uint16)(5), +(Uint16)(0), (Uint16)(0), +0, +0, +0, +24617, 402, 513, +0, +0, +0, +0, +0, +0, +9129, 403, 514, +(Uint16)(500), +(Uint16)(0), (Uint16)(0), +0, +0, +0, +8233, 404, 515, +(Uint16)(36), +(Uint16)(0), (Uint16)(1000), +0, +0, +0, +10113, 405, 516, +(Uint16)(1048576), (((Uint32)1048576)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10145, 406, 517, +(Uint16)(16777), (((Uint32)16777)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +24713, 407, 518, +0, +0, +0, +0, +0, +0, +11993, 408, 519, +(Uint16)(1), +0, +0, +0, +0, +0, + +20107, +409, +4, +4365, 410, 520, +0, +0, +0, +15117, 411, 521, +(Uint16)(4), +0, +0, +15117, 412, 522, +(Uint16)(0), +0, +0, +15117, 413, 523, +(Uint16)(1), +0, +0, +14477, 414, 524, +(Uint16)(0), +(Uint16)(0), (Uint16)(1), +15117, 590, 525, +(Uint16)(0), +0, +0, + +20147, +415, +4, +8257, 416, 526, +(Uint16)(-81), +(Uint16)(0), (Uint16)(0), +16001, 417, 527, +(Uint16)(-14592), +(Uint16)(0), (Uint16)(0), +25913, 418, 528, +0, +0, +0, +8257, 419, 529, +(Uint16)(-81), +(Uint16)(0), (Uint16)(0), +16001, 420, 530, +(Uint16)(-14592), +(Uint16)(0), (Uint16)(0), +25913, 421, 531, +0, +0, +0, +8257, 422, 532, +(Uint16)(40), +(Uint16)(0), (Uint16)(0), +16001, 423, 533, +(Uint16)(62836), +(Uint16)(0), (Uint16)(0), +25913, 424, 534, +0, +0, +0, +8225, 425, 535, +(Uint16)(2050), +(Uint16)(0), (Uint16)(0), +16001, 426, 536, +(Uint16)(0), +(Uint16)(0), (Uint16)(0), +26009, 427, 537, +0, +0, +0, +9185, 633, 538, +(Uint16)(0), +(Uint16)(0), (Uint16)(0), +26105, 634, 539, +0, +0, +0, + +20096, +428, +7, +26417, 429, 540, +0, +0, +0, +0, +0, +0, +25873, 430, 541, +0, +0, +0, +0, +0, +0, +10033, 431, 542, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9489, 432, 543, +(Uint16)(419430), (((Uint32)419430)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10033, 433, 544, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9489, 434, 545, +(Uint16)(12582912), (((Uint32)12582912)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10033, 435, 546, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20037, +436, +1, +26421, 437, 547, +26037, 438, 548, +25909, 439, 549, +25813, 440, 550, +25813, 441, 551, +25909, 442, 552, +28141, 613, 553, +28141, 614, 554, + +20024, +443, +7, +14477, 444, 555, +(Uint16)(0), +0, +0, +0, +0, +0, +14989, 445, 556, +(Uint16)(192), (((Uint32)192)>>16), +0, +0, +0, +0, +14989, 446, 557, +(Uint16)(1359151123), (((Uint32)1359151123)>>16), +0, +0, +0, +0, +14989, 447, 558, +(Uint16)(1359085569), (((Uint32)1359085569)>>16), +0, +0, +0, +0, +14989, 448, 559, +(Uint16)(1359151122), (((Uint32)1359151122)>>16), +0, +0, +0, +0, +14989, 449, 560, +(Uint16)(1359020033), (((Uint32)1359020033)>>16), +0, +0, +0, +0, +53645, 450, 561, +(Uint16)(0), +0, +0, +0, +0, +0, +53685, 451, 562, +(Uint16)(1), +0, +0, +0, +0, +0, +11837, 452, 563, +(Uint16)(0), +0, +0, +0, +0, +0, +10949, 453, 564, +(Uint16)(6710886), (((Uint32)6710886)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31373, 644, 565, +0, +0, +0, +0, +0, +0, +15757, 454, 566, +(Uint16)(50461787), (((Uint32)50461787)>>16), + +20000, +455, +7, +14985, 456, 567, +(Uint16)(1000), (((Uint32)1000)>>16), +0, +0, +0, +0, +11839, 457, 568, +(Uint16)(2), +0, +0, +0, +0, +0, +14473, 458, 569, +(Uint16)(1), +0, +0, +0, +0, +0, +9345, 459, 570, +(Uint16)(9298387), (((Uint32)9298387)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31369, 460, 571, +0, +0, +0, +0, +0, +0, +30857, 460, 572, +0, +0, +0, +0, +0, +0, +25761, 461, 573, +0, +0, +0, +0, +0, +0, +25729, 462, 574, +0, +0, +0, +0, +0, +0, +25729, 463, 575, +0, +0, +0, +0, +0, +0, +53565, 464, 576, +(Uint16)(0), +0, +0, +0, +0, +0, +9217, 465, 577, +(Uint16)(838860), (((Uint32)838860)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(65535), (((Uint32)65535)>>16), +30857, 466, 578, +0, +0, +0, +0, +0, +0, +30857, 467, 579, +0, +0, +0, +0, +0, +0, +30857, 468, 580, +0, +0, +0, +0, +0, +0, +31369, 469, 581, +0, +0, +0, +0, +0, +0, +30857, 469, 582, +0, +0, +0, +0, +0, +0, +30857, 470, 583, +0, +0, +0, +0, +0, +0, +15241, 471, 584, +(Uint16)(0), +0, +0, +0, +0, +0, +15241, 472, 585, +(Uint16)(7), +0, +0, +0, +0, +0, +15241, 472, 586, +(Uint16)(7335), +0, +0, +0, +0, +0, +15753, 472, 587, +(Uint16)(1973415), (((Uint32)1973415)>>16), +0, +0, +0, +0, +25729, 473, 588, +0, +0, +0, +0, +0, +0, +25729, 474, 589, +0, +0, +0, +0, +0, +0, + +20024, +475, +7, +25733, 441, 590, +0, +0, +0, +0, +0, +0, +25765, 461, 591, +0, +0, +0, +0, +0, +0, +9381, 476, 592, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +25733, 477, 593, +0, +0, +0, +0, +0, +0, +11837, 478, 594, +(Uint16)(81), +0, +0, +0, +0, +0, +14989, 479, 595, +(Uint16)(500), (((Uint32)500)>>16), +0, +0, +0, +0, +25765, 480, 596, +0, +0, +0, +0, +0, +0, +30861, 481, 597, +0, +0, +0, +0, +0, +0, +4573, 482, 598, +0, +0, +0, +0, +0, +0, +9349, 459, 599, +(Uint16)(4869970), (((Uint32)4869970)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +30861, 483, 600, +0, +0, +0, +0, +0, +0, +30861, 484, 601, +0, +0, +0, +0, +0, +0, +30861, 485, 602, +0, +0, +0, +0, +0, +0, +30861, 486, 603, +0, +0, +0, +0, +0, +0, +53567, 487, 604, +(Uint16)(0), +0, +0, +0, +0, +0, +14477, 488, 605, +(Uint16)(10), +0, +0, +0, +0, +0, +30861, 489, 606, +0, +0, +0, +0, +0, +0, +30861, 490, 607, +0, +0, +0, +0, +0, +0, +30861, 491, 608, +0, +0, +0, +0, +0, +0, +30861, 492, 609, +0, +0, +0, +0, +0, +0, +30861, 493, 610, +0, +0, +0, +0, +0, +0, + +20019, +455, +7, +14977, 494, 611, +(Uint16)(4096), (((Uint32)4096)>>16), +0, +0, +0, +0, +9369, 459, 612, +(Uint16)(9298387), (((Uint32)9298387)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +30849, 460, 613, +0, +0, +0, +0, +0, +0, +25785, 461, 614, +0, +0, +0, +0, +0, +0, +25753, 462, 615, +0, +0, +0, +0, +0, +0, +25753, 463, 616, +0, +0, +0, +0, +0, +0, +25753, 495, 617, +0, +0, +0, +0, +0, +0, +9241, 496, 618, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15233, 471, 619, +(Uint16)(0), +0, +0, +0, +0, +0, +15745, 472, 620, +(Uint16)(1973415), (((Uint32)1973415)>>16), +0, +0, +0, +0, +15233, 472, 621, +(Uint16)(7), +0, +0, +0, +0, +0, +15233, 472, 622, +(Uint16)(7335), +0, +0, +0, +0, +0, +25753, 473, 623, +0, +0, +0, +0, +0, +0, +25753, 474, 624, +0, +0, +0, +0, +0, +0, + +20026, +497, +7, +25669, 498, 625, +0, +0, +0, +0, +0, +0, +32205, 498, 626, +0, +0, +0, +0, +0, +0, +25669, 499, 627, +0, +0, +0, +0, +0, +0, +32205, 499, 628, +0, +0, +0, +0, +0, +0, +30925, 500, 629, +0, +0, +0, +0, +0, +0, +31693, 500, 630, +0, +0, +0, +0, +0, +0, +30925, 501, 631, +0, +0, +0, +0, +0, +0, +31693, 501, 632, +0, +0, +0, +0, +0, +0, +9285, 502, 633, +(Uint16)(16777), (((Uint32)16777)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 502, 634, +(Uint16)(16777), (((Uint32)16777)>>16), +0, +0, +0, +0, +9285, 503, 635, +(Uint16)(-190048), (((Uint32)-190048)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 503, 636, +(Uint16)(-190048), (((Uint32)-190048)>>16), +0, +0, +0, +0, +9285, 504, 637, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 504, 638, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +9285, 505, 639, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 505, 640, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +50253, 506, 641, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50253, 507, 642, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50253, 508, 643, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50253, 509, 644, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +30925, 645, 645, +0, +0, +0, +0, +0, +0, + +20161, +510, +7, +11821, 511, 646, +(Uint16)(1), +0, +0, +0, +0, +0, +14381, 399, 647, +(Uint16)(1), +0, +0, +0, +0, +0, +50363, 512, 648, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49327, 427, 649, +(Uint16)(1103101952), (((Uint32)1103101952)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +1211, 513, 650, +0, +0, +0, +0, +0, +0, +1225, 514, 651, +0, +0, +0, +0, +0, +0, +1208, 514, 652, +0, +0, +0, +0, +0, +0, +173, 515, 653, +0, +0, +0, +0, +0, +0, +30765, 516, 654, +0, +0, +0, +0, +0, +0, +172, 517, 655, +0, +0, +0, +0, +0, +0, +172, 518, 656, +0, +0, +0, +0, +0, +0, +172, 519, 657, +0, +0, +0, +0, +0, +0, +172, 421, 658, +0, +0, +0, +0, +0, +0, +172, 520, 659, +0, +0, +0, +0, +0, +0, +172, 584, 660, +0, +0, +0, +0, +0, +0, +175, 521, 661, +0, +0, +0, +0, +0, +0, +175, 522, 662, +0, +0, +0, +0, +0, +0, +175, 523, 663, +0, +0, +0, +0, +0, +0, +244, 524, 664, +0, +0, +0, +0, +0, +0, +30765, 525, 665, +0, +0, +0, +0, +0, +0, + +20156, +510, +7, +51065, 526, 666, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 527, 667, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 528, 668, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50360, 529, 669, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50360, 530, 670, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 400, 671, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50345, 531, 672, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50363, 532, 673, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 533, 674, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49838, 592, 675, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49910, 591, 676, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57018, 403, 677, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31529, 535, 678, +0, +0, +0, +0, +0, +0, +1198, 517, 679, +0, +0, +0, +0, +0, +0, +1198, 518, 680, +0, +0, +0, +0, +0, +0, +1193, 536, 681, +0, +0, +0, +0, +0, +0, +1193, 537, 682, +0, +0, +0, +0, +0, +0, +1193, 538, 683, +0, +0, +0, +0, +0, +0, +1193, 539, 684, +0, +0, +0, +0, +0, +0, + +20152, +510, +7, +50345, 540, 685, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 541, 686, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 542, 687, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50362, 529, 688, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 400, 689, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50345, 531, 690, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50363, 532, 691, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 533, 692, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31529, 535, 693, +0, +0, +0, +0, +0, +0, +31529, 550, 694, +0, +0, +0, +0, +0, +0, +49832, 592, 695, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49904, 591, 696, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57012, 403, 697, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49832, 593, 698, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +175, 553, 699, +0, +0, +0, +0, +0, +0, +1192, 555, 700, +0, +0, +0, +0, +0, +0, +1193, 588, 701, +0, +0, +0, +0, +0, +0, + +20159, +510, +7, +51069, 543, 702, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51069, 544, 703, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50364, 545, 704, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50364, 546, 705, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50349, 531, 706, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50355, 532, 707, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57005, 533, 708, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49838, 594, 709, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49838, 593, 710, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31533, 549, 711, +0, +0, +0, +0, +0, +0, +31533, 550, 712, +0, +0, +0, +0, +0, +0, +49910, 591, 713, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57010, 403, 714, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50364, 551, 715, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +175, 552, 716, +0, +0, +0, +0, +0, +0, +175, 553, 717, +0, +0, +0, +0, +0, +0, +1198, 554, 718, +0, +0, +0, +0, +0, +0, +1198, 555, 719, +0, +0, +0, +0, +0, +0, + +20142, +556, +7, +9285, 557, 720, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9637, 558, 721, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9637, 559, 722, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20144, +510, +7, +50337, 531, 723, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50355, 532, 724, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50352, 529, 725, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +56993, 400, 726, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +56993, 533, 727, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31521, 535, 728, +0, +0, +0, +0, +0, +0, +49838, 592, 729, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +758, 591, 730, +0, +0, +0, +0, +0, +0, +7858, 403, 731, +0, +0, +0, +0, +0, +0, +1185, 560, 732, +0, +0, +0, +0, +0, +0, +1185, 561, 733, +0, +0, +0, +0, +0, +0, +1185, 562, 734, +0, +0, +0, +0, +0, +0, +1203, 563, 735, +0, +0, +0, +0, +0, +0, +1203, 564, 736, +0, +0, +0, +0, +0, +0, +1203, 565, 737, +0, +0, +0, +0, +0, +0, + +20149, +399, +7, +12453, 571, 738, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12453, 572, 739, +(Uint16)(5033165), (((Uint32)5033165)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12613, 573, 740, +(Uint16)(5033165), (((Uint32)5033165)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +28997, 574, 741, +0, +0, +0, +0, +0, +0, +28997, 575, 742, +0, +0, +0, +0, +0, +0, +28837, 536, 743, +0, +0, +0, +0, +0, +0, +28837, 537, 744, +0, +0, +0, +0, +0, +0, +30501, 576, 745, +0, +0, +0, +0, +0, +0, + +20139, +626, +7, +17709, 631, 746, +0, +0, +0, +0, +0, +0, +15149, 627, 747, +(Uint16)(2000), +0, +0, +0, +0, +0, +10661, 628, 748, +(Uint16)(15099494), (((Uint32)15099494)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10661, 629, 749, +(Uint16)(11744051), (((Uint32)11744051)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +28837, 630, 750, +0, +0, +0, +0, +0, +0, +12453, 632, 751, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20141, +635, +7, +31521, 636, 752, +0, +0, +0, +0, +0, +0, +12793, 637, 753, +(Uint16)(41943040), (((Uint32)41943040)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12793, 638, 754, +(Uint16)(25165824), (((Uint32)25165824)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12793, 640, 755, +(Uint16)(67108864), (((Uint32)67108864)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +}; + +int16 const CO1_OD_TBL1[] = { +4096, 0, +4097, 3, +4098, 6, +4116, 9, +4118, 12, +4119, 20, +4120, 24, +4608, 39, +4736, 48, +5120, 60, +5121, 73, +5122, 86, +5123, 99, +5124, 112, +5125, 125, +5126, 138, +5127, 151, +5632, 164, +5633, 187, +5634, 210, +5635, 233, +5636, 256, +5637, 279, +5638, 302, +5639, 325, +6144, 348, +6145, 371, +6146, 394, +6147, 417, +6148, 440, +6149, 463, +6150, 486, +6151, 509, +6656, 532, +6657, 555, +6658, 578, +6659, 601, +6660, 624, +6661, 647, +6662, 670, +6663, 693, +8192, 716, +8193, 722, +8194, 726, +8195, 741, +8196, 756, +8197, 761, +8199, 764, +8208, 779, +8209, 794, +8210, 817, +8212, 821, +8213, 825, +8214, 828, +8215, 831, +8320, 834, +8321, 893, +8322, 896, +8323, 909, +8448, 976, +8449, 1003, +8450, 1030, +8451, 1057, +8452, 1084, +8453, 1111, +8454, 1138, +8455, 1165, +8456, 1192, +8457, 1219, +8458, 1246, +8459, 1273, +8460, 1300, +8461, 1327, +8462, 1354, +8463, 1381, +8464, 1408, +8465, 1435, +8466, 1462, +8467, 1489, +8468, 1516, +8469, 1543, +8470, 1570, +8471, 1597, +8472, 1624, +8473, 1651, +8474, 1678, +8475, 1705, +8476, 1732, +8477, 1759, +9474, 1786, +9478, 1813, +9487, 1836, +9522, 1841, +9524, 1853, +9728, 1860, +9984, 1868, +9985, 1872, +12288, 2010, +12544, 2013, +20480, 2036, +20736, 2066, +20737, 2186, +20738, 2315, +20739, 2435, +20741, 2618, +20747, 2774, +20750, 2785, +20754, 2887, +20755, 2935, +20756, 3019, +20758, 3058, +20762, 3145, +20792, 3211, +20816, 3238, +20817, 3340, +20818, 3345, +20821, 3555, +20823, 3747, +20852, 3876, +20865, 4068, +20866, 4251, +20867, 4425, +20868, 4581, +20869, 4746, +20870, 4776, +23300, 4914, +23301, 4989, +23302, 5046, +}; +Uint16 const co1_SPIrange1rw = CO1_SPI_START_ADDR+0; +Uint16 const co1_SPIrange1rwCRC = CO1_SPI_START_ADDR+8; +Uint16 const co1_SPIrange1rwp = CO1_SPI_START_ADDR+10; +Uint16 const co1_SPIrange1rwpCRC = CO1_SPI_START_ADDR+336; +Uint16 const co1_SPIrange1rwps = CO1_SPI_START_ADDR+338; +Uint16 const co1_SPIrange1rwpsCRC = CO1_SPI_START_ADDR+338; +Uint16 const co1_SPIrange2rw = CO1_SPI_START_ADDR+340; +Uint16 const co1_SPIrange2rwCRC = CO1_SPI_START_ADDR+643; +Uint16 const co1_SPIrange2rwp = CO1_SPI_START_ADDR+645; +Uint16 const co1_SPIrange2rwpCRC = CO1_SPI_START_ADDR+670; +Uint16 const co1_SPIrange2rwps = CO1_SPI_START_ADDR+672; +Uint16 const co1_SPIrange2rwpsCRC = CO1_SPI_START_ADDR+672; +Uint16 const co1_SPIrange3rw = CO1_SPI_START_ADDR+674; +Uint16 const co1_SPIrange3rwCRC = CO1_SPI_START_ADDR+684; +Uint16 const co1_SPIrange3rwp = CO1_SPI_START_ADDR+686; +Uint16 const co1_SPIrange3rwpCRC = CO1_SPI_START_ADDR+686; +Uint16 const co1_SPIrange3rwps = CO1_SPI_START_ADDR+688; +Uint16 const co1_SPIrange3rwpsCRC = CO1_SPI_START_ADDR+688; +Uint16 const co1_SPIrange4rw = CO1_SPI_START_ADDR+690; +Uint16 const co1_SPIrange4rwCRC = CO1_SPI_START_ADDR+690; +Uint16 const co1_SPIrange4rwp = CO1_SPI_START_ADDR+692; +Uint16 const co1_SPIrange4rwpCRC = CO1_SPI_START_ADDR+692; +Uint16 const co1_SPIrange4rwps = CO1_SPI_START_ADDR+694; +Uint16 const co1_SPIrange4rwpsCRC = CO1_SPI_START_ADDR+694; +Uint16 const co1_SPIrange5rw = CO1_SPI_START_ADDR+696; +Uint16 const co1_SPIrange5rwCRC = CO1_SPI_START_ADDR+1323; +Uint16 const co1_SPIrange5rwp = CO1_SPI_START_ADDR+1325; +Uint16 const co1_SPIrange5rwpCRC = CO1_SPI_START_ADDR+1329; +Uint16 const co1_SPIrange5rwps = CO1_SPI_START_ADDR+1331; +Uint16 const co1_SPIrange5rwpsCRC = CO1_SPI_START_ADDR+1331; +Uint16 const co1_first1000 = 0; +Uint16 const co1_first2000 = 82; +Uint16 const co1_first3000 = 194; +Uint16 const co1_first4000 = 198; +Uint16 const co1_first5000 = 198; +// Таблица групп +Uint16 const CO1_TYPE_DEF_TABLE[] = { + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)5,\ + (Uint16)0,\ + (Uint16)-1,\ + (Uint16)10,\ + (Uint16)4,\ + (Uint16)0,\ + (Uint16)5,\ + (Uint16)5,\ + (Uint16)0,\ + (Uint16)40,\ + (Uint16)17,\ + (Uint16)6,\ + (Uint16)8,\ + (Uint16)7,\ + (Uint16)9,\ + (Uint16)15,\ + (Uint16)36,\ + (Uint16)16,\ + (Uint16)1,\ + (Uint16)13,\ + (Uint16)12,\ + (Uint16)14,\ + (Uint16)18,\ + (Uint16)-1,\ + (Uint16)28,\ + (Uint16)0,\ + (Uint16)24,\ + (Uint16)23,\ + (Uint16)25,\ + (Uint16)27,\ + (Uint16)47,\ + (Uint16)48,\ + (Uint16)49,\ + (Uint16)50,\ + (Uint16)19,\ + (Uint16)51,\ + (Uint16)20,\ + (Uint16)46,\ + (Uint16)45,\ +}; +// Таблица CALLBACK-функций +//************************************************************** +long const CO1_OD_CALLBACK_TBL[]={ +0, // 1000h.00h +0, // 1001h.00h +0, // 1002h.00h +0, // 1014h.00h +0, // 1016h.00h +0, // 1017h.00h +0, // 1018h.00h +0, // 1200h.00h +0, // 1280h.00h +0, // 1400h.00h +0, // 1401h.00h +0, // 1402h.00h +0, // 1403h.00h +0, // 1404h.00h +0, // 1405h.00h +0, // 1406h.00h +0, // 1407h.00h +0, // 1600h.00h +0, // 1601h.00h +0, // 1602h.00h +0, // 1603h.00h +0, // 1604h.00h +0, // 1605h.00h +0, // 1606h.00h +0, // 1607h.00h +0, // 1800h.00h +0, // 1801h.00h +0, // 1802h.00h +0, // 1803h.00h +0, // 1804h.00h +0, // 1805h.00h +0, // 1806h.00h +0, // 1807h.00h +0, // 1A00h.00h +0, // 1A01h.00h +0, // 1A02h.00h +0, // 1A03h.00h +0, // 1A04h.00h +0, // 1A05h.00h +0, // 1A06h.00h +0, // 1A07h.00h +0, // 2000h.00h +0, // 2001h.00h +0, // 2002h.00h +0, // 2003h.00h +0, // 2004h.00h +0, // 2005h.00h +0, // 2007h.00h +0, // 2010h.00h +0, // 2011h.00h +0, // 2012h.00h +0, // 2014h.00h +0, // 2015h.00h +0, // 2016h.00h +0, // 2017h.00h +0, // 2080h.00h +0, // 2081h.00h +0, // 2082h.00h +0, // 2083h.00h +0, // 2100h.00h +0, // 2101h.00h +0, // 2102h.00h +0, // 2103h.00h +0, // 2104h.00h +0, // 2105h.00h +0, // 2106h.00h +0, // 2107h.00h +0, // 2108h.00h +0, // 2109h.00h +0, // 210Ah.00h +0, // 210Bh.00h +0, // 210Ch.00h +0, // 210Dh.00h +0, // 210Eh.00h +0, // 210Fh.00h +0, // 2110h.00h +0, // 2111h.00h +0, // 2112h.00h +0, // 2113h.00h +0, // 2114h.00h +0, // 2115h.00h +0, // 2116h.00h +0, // 2117h.00h +0, // 2118h.00h +0, // 2119h.00h +0, // 211Ah.00h +0, // 211Bh.00h +0, // 211Ch.00h +0, // 211Dh.00h +0, // 2502h.00h +0, // 2506h.00h +(long)((void(*)(long))callback_RTC), // 250Fh.00h +0, // 2532h.00h +0, // 2534h.00h +0, // 2600h.00h +(long)((void(*)(long))callback_BTcmd), // 2700h.00h +0, // 2701h.00h +0, // 3000h.00h +0, // 3100h.00h +0, // 5000h.00h +0, // 5100h.00h +0, // 5101h.00h +0, // 5102h.00h +0, // 5103h.00h +0, // 5105h.00h +0, // 510Bh.00h +0, // 510Eh.00h +0, // 5112h.00h +0, // 5113h.00h +0, // 5114h.00h +0, // 5116h.00h +0, // 511Ah.00h +0, // 5138h.00h +0, // 5150h.00h +(long)((void(*)(long))callback_dlog), // 5151h.00h +0, // 5152h.00h +0, // 5155h.00h +0, // 5157h.00h +0, // 5174h.00h +0, // 5181h.00h +0, // 5182h.00h +0, // 5183h.00h +0, // 5184h.00h +0, // 5185h.00h +0, // 5186h.00h +0, // 5B04h.00h +0, // 5B05h.00h +0, // 5B06h.00h +}; + +// Массив ссылок для драйвера CANopen двухядерных процессоров +#ifdef COOD_LINKS__5000 +long const CO1_LINKS[]={(long)&co1_numOfInd, + (long)&CO1_OD_TBL1, + (long)&CO1_OD_TBL2, + (long)&CO1_OD_TBL3, + (long)&CO1_TYPE_DEF_TABLE, + (long)&CO1_OD_CALLBACK_TBL, + (long)&co1_SPIrange1rw, + (long)&co1_SPIrange1rwCRC, + (long)&co1_SPIrange1rwp, + (long)&co1_SPIrange1rwpCRC, + (long)&co1_SPIrange1rwps, + (long)&co1_SPIrange1rwpsCRC, + (long)&co1_SPIrange2rw, + (long)&co1_SPIrange2rwCRC, + (long)&co1_SPIrange2rwp, + (long)&co1_SPIrange2rwpCRC, + (long)&co1_SPIrange2rwps, + (long)&co1_SPIrange2rwpsCRC, + (long)&co1_SPIrange3rw, + (long)&co1_SPIrange3rwCRC, + (long)&co1_SPIrange3rwp, + (long)&co1_SPIrange3rwpCRC, + (long)&co1_SPIrange3rwps, + (long)&co1_SPIrange3rwpsCRC, + (long)&co1_SPIrange4rw, + (long)&co1_SPIrange4rwCRC, + (long)&co1_SPIrange4rwp, + (long)&co1_SPIrange4rwpCRC, + (long)&co1_SPIrange4rwps, + (long)&co1_SPIrange4rwpsCRC, + (long)&co1_SPIrange5rw, + (long)&co1_SPIrange5rwCRC, + (long)&co1_SPIrange5rwp, + (long)&co1_SPIrange5rwpCRC, + (long)&co1_SPIrange5rwps, + (long)&co1_SPIrange5rwpsCRC, + (long)&co1_first1000, + (long)&co1_first2000, + (long)&co1_first3000, + (long)&co1_first4000, + (long)&co1_first5000 +}; + +STATIC_ASSERT(((sizeof(CO1_LINKS)/sizeof(CO1_LINKS[0])) == (COOD_LINKS__5000 + 1)),m); +#endif diff --git a/Vsrc/cood2.c b/Vsrc/cood2.c new file mode 100644 index 0000000..c37000c --- /dev/null +++ b/Vsrc/cood2.c @@ -0,0 +1,4278 @@ +// Файл: +// Профиль: E:\VectorWork\motorcontroldemo_028\cood.xml +// Конфигурация: Базовый профиль +// Дата создания: 23.07.2019 12:58:27 +// Пользователь: default +// COODEdit Basic v.7.3.8 +#include "DSP.h" +#include "main.h" +#include "cood2.h" +#include "co_ODvars.h" + +// всего 128 индексов в словаре +// всего 865 элементов в словаре +Uint16 const co2_numOfInd = 128; +// Номер перечесления для групп +Uint16 const co2_groupEnum = 15; +// Хэш-сумма: +Uint32 const co2_odHash[4] = {0xF8B5F27F, 0x9B6F7CA3, 0x7802BC66, 0xD1B686E2}; +// Таблица с адресами переменных +long const CO2_OD_TBL3[] = { +(long)(&co2_vars.co_deviceType), //[1000h.00h], Название: Тип устройства, ТекстПУ: Device Type, Группа: CAN +(long)(&co2_vars.co_errorRegister), //[1001h.00h], Название: Регистр ошибок, ТекстПУ: ErrReg, Группа: CAN +(long)(&co2_vars.co_deviceState), //[1002h.00h], Название: Manufacturer Status Register, ТекстПУ: DevSta, Группа: CAN +(long)(&co2_vars.co_emcyCOBID), //[1014h.00h], Название: COB-ID Emergency Object, ТекстПУ: eCOBID, Группа: CAN +(long)(&co2_vars.co_CHBT), //[1016h.01h], Название: Время ожидания сообщения Heartbeat, ТекстПУ: CHBT, Группа: CAN +(long)(&co2_vars.co_PHBT), //[1017h.00h], Название: Период генерации сообщения Heartbeat, ТекстПУ: PHBT, Группа: CAN +(long)(&co2_vars.co_vendorID), //[1018h.01h], Название: Код производителя, ТекстПУ: VendID, Группа: CAN +(long)(&co2_vars.co_productCode), //[1018h.02h], Название: Код продукта, ТекстПУ: PrCode, Группа: CAN +(long)(&co2_vars.co_revisionNumber), //[1018h.03h], Название: Номер ревизии, ТекстПУ: RevNum, Группа: CAN +(long)(&co2_vars.co_serialNumber), //[1018h.04h], Название: Серийный номер, ТекстПУ: SerNum, Группа: CAN +(long)(&co2_vars.co_csrxCOBID), //[1200h.01h], Название: COB-ID Client->Server(rx), ТекстПУ: CSRXID, Группа: CAN +(long)(&co2_vars.co_sctxCOBID), //[1200h.02h], Название: COB-ID Server->Client(tx), ТекстПУ: SCTXID, Группа: CAN +(long)(&co2_vars.co_cstxCOBID), //[1280h.01h], Название: COB-ID Client->Server(tx), ТекстПУ: CSTXID, Группа: CAN +(long)(&co2_vars.co_scrxCOBID), //[1280h.02h], Название: COB-ID Server->Client(rx), ТекстПУ: SCRXID, Группа: CAN +(long)(&co2_vars.co_ssNODEID), //[1280h.03h], Название: NODE-ID on SDO server, ТекстПУ: SDOSID, Группа: CAN +(long)(&co2_vars.co_RPDO1COBID), //[1400h.01h], Название: COB-ID for RPDO1, ТекстПУ: IRPDO1, Группа: CAN +(long)(&co2_vars.co_transType), //[1400h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO2COBID), //[1401h.01h], Название: COB-ID for RPDO2, ТекстПУ: IRPDO2, Группа: CAN +(long)(&co2_vars.co_transType), //[1401h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO3COBID), //[1402h.01h], Название: COB-ID for RPDO3, ТекстПУ: IRPDO3, Группа: CAN +(long)(&co2_vars.co_transType), //[1402h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO4COBID), //[1403h.01h], Название: COB-ID for RPDO4, ТекстПУ: IRPDO4, Группа: CAN +(long)(&co2_vars.co_transType), //[1403h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO5COBID), //[1404h.01h], Название: COB-ID for RPDO5, ТекстПУ: IRPDO5, Группа: CAN +(long)(&co2_vars.co_transType), //[1404h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO6COBID), //[1405h.01h], Название: COB-ID for RPDO6, ТекстПУ: IRPDO6, Группа: CAN +(long)(&co2_vars.co_transType), //[1405h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO7COBID), //[1406h.01h], Название: COB-ID for RPDO7, ТекстПУ: IRPDO7, Группа: CAN +(long)(&co2_vars.co_transType), //[1406h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO8COBID), //[1407h.01h], Название: COB-ID for RPDO8, ТекстПУ: IRPDO8, Группа: CAN +(long)(&co2_vars.co_transType), //[1407h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_RPDO1_1Mapping), //[1600h.01h], Название: RPDO1-1 Mapping, ТекстПУ: RPM11, Группа: CAN +(long)(&co2_vars.co_RPDO1_2Mapping), //[1600h.02h], Название: RPDO1-2 Mapping, ТекстПУ: RPM12, Группа: CAN +(long)(&co2_vars.co_RPDO1_3Mapping), //[1600h.03h], Название: RPDO1-3 Mapping, ТекстПУ: RPM13, Группа: CAN +(long)(&co2_vars.co_RPDO1_4Mapping), //[1600h.04h], Название: RPDO1-4 Mapping, ТекстПУ: RPM14, Группа: CAN +(long)(&co2_vars.co_RPDO2_1Mapping), //[1601h.01h], Название: RPDO2-1 Mapping, ТекстПУ: RPM21, Группа: CAN +(long)(&co2_vars.co_RPDO2_2Mapping), //[1601h.02h], Название: RPDO2-2 Mapping, ТекстПУ: RPM22, Группа: CAN +(long)(&co2_vars.co_RPDO2_3Mapping), //[1601h.03h], Название: RPDO2-3 Mapping, ТекстПУ: RPM23, Группа: CAN +(long)(&co2_vars.co_RPDO2_4Mapping), //[1601h.04h], Название: RPDO2-4 Mapping, ТекстПУ: RPM24, Группа: CAN +(long)(&co2_vars.co_RPDO3_1Mapping), //[1602h.01h], Название: RPDO3-1 Mapping, ТекстПУ: RPM31, Группа: CAN +(long)(&co2_vars.co_RPDO3_2Mapping), //[1602h.02h], Название: RPDO3-2 Mapping, ТекстПУ: RPM32, Группа: CAN +(long)(&co2_vars.co_RPDO3_3Mapping), //[1602h.03h], Название: RPDO3-3 Mapping, ТекстПУ: RPM33, Группа: CAN +(long)(&co2_vars.co_RPDO3_4Mapping), //[1602h.04h], Название: RPDO3-4 Mapping, ТекстПУ: RPM34, Группа: CAN +(long)(&co2_vars.co_RPDO4_1Mapping), //[1603h.01h], Название: RPDO4-1 Mapping, ТекстПУ: RPM41, Группа: CAN +(long)(&co2_vars.co_RPDO4_2Mapping), //[1603h.02h], Название: RPDO4-2 Mapping, ТекстПУ: RPM42, Группа: CAN +(long)(&co2_vars.co_RPDO4_3Mapping), //[1603h.03h], Название: RPDO4-3 Mapping, ТекстПУ: RPM43, Группа: CAN +(long)(&co2_vars.co_RPDO4_4Mapping), //[1603h.04h], Название: RPDO4-4 Mapping, ТекстПУ: RPM44, Группа: CAN +(long)(&co2_vars.co_RPDO5_1Mapping), //[1604h.01h], Название: RPDO5-1 Mapping, ТекстПУ: RPM51, Группа: CAN +(long)(&co2_vars.co_RPDO5_2Mapping), //[1604h.02h], Название: RPDO5-2 Mapping, ТекстПУ: RPM52, Группа: CAN +(long)(&co2_vars.co_RPDO5_3Mapping), //[1604h.03h], Название: RPDO5-3 Mapping, ТекстПУ: RPM53, Группа: CAN +(long)(&co2_vars.co_RPDO5_4Mapping), //[1604h.04h], Название: RPDO5-4 Mapping, ТекстПУ: RPM54, Группа: CAN +(long)(&co2_vars.co_RPDO6_1Mapping), //[1605h.01h], Название: RPDO6-1 Mapping, ТекстПУ: RPM61, Группа: CAN +(long)(&co2_vars.co_RPDO6_2Mapping), //[1605h.02h], Название: RPDO6-2 Mapping, ТекстПУ: RPM62, Группа: CAN +(long)(&co2_vars.co_RPDO6_3Mapping), //[1605h.03h], Название: RPDO6-3 Mapping, ТекстПУ: RPM63, Группа: CAN +(long)(&co2_vars.co_RPDO6_4Mapping), //[1605h.04h], Название: RPDO6-4 Mapping, ТекстПУ: RPM64, Группа: CAN +(long)(&co2_vars.co_RPDO7_1Mapping), //[1606h.01h], Название: RPDO7-1 Mapping, ТекстПУ: RPM71, Группа: CAN +(long)(&co2_vars.co_RPDO7_2Mapping), //[1606h.02h], Название: RPDO7-2 Mapping, ТекстПУ: RPM72, Группа: CAN +(long)(&co2_vars.co_RPDO7_3Mapping), //[1606h.03h], Название: RPDO7-3 Mapping, ТекстПУ: RPM73, Группа: CAN +(long)(&co2_vars.co_RPDO7_4Mapping), //[1606h.04h], Название: RPDO7-4 Mapping, ТекстПУ: RPM74, Группа: CAN +(long)(&co2_vars.co_RPDO8_1Mapping), //[1607h.01h], Название: RPDO8-1 Mapping, ТекстПУ: RPM81, Группа: CAN +(long)(&co2_vars.co_RPDO8_2Mapping), //[1607h.02h], Название: RPDO8-2 Mapping, ТекстПУ: RPM82, Группа: CAN +(long)(&co2_vars.co_RPDO8_3Mapping), //[1607h.03h], Название: RPDO8-3 Mapping, ТекстПУ: RPM83, Группа: CAN +(long)(&co2_vars.co_RPDO8_4Mapping), //[1607h.04h], Название: RPDO8-4 Mapping, ТекстПУ: RPM84, Группа: CAN +(long)(&co2_vars.co_TPDO1COBID), //[1800h.01h], Название: COB-ID for TPDO1, ТекстПУ: ITPDO1, Группа: CAN +(long)(&co2_vars.co_transType), //[1800h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO1ITime), //[1800h.03h], Название: Inhibit Time 1, ТекстПУ: ITime1, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1800h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO1EventTimer), //[1800h.05h], Название: Event Timer 1, ТекстПУ: EvTmr1, Группа: CAN +(long)(&co2_vars.co_TPDO2COBID), //[1801h.01h], Название: COB-ID for TPDO2, ТекстПУ: ITPDO2, Группа: CAN +(long)(&co2_vars.co_transType), //[1801h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO2ITime), //[1801h.03h], Название: Inhibit Time 2, ТекстПУ: ITime2, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1801h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO2EventTimer), //[1801h.05h], Название: Event Timer 2, ТекстПУ: EvTmr2, Группа: CAN +(long)(&co2_vars.co_TPDO3COBID), //[1802h.01h], Название: COB-ID for TPDO3, ТекстПУ: ITPDO3, Группа: CAN +(long)(&co2_vars.co_transType), //[1802h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO3ITime), //[1802h.03h], Название: Inhibit Time 3, ТекстПУ: ITime3, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1802h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO3EventTimer), //[1802h.05h], Название: Event Timer 3, ТекстПУ: EvTmr3, Группа: CAN +(long)(&co2_vars.co_TPDO4COBID), //[1803h.01h], Название: COB-ID for TPDO4, ТекстПУ: ITPDO4, Группа: CAN +(long)(&co2_vars.co_transType), //[1803h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO4ITime), //[1803h.03h], Название: Inhibit Time 4, ТекстПУ: ITime4, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1803h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO4EventTimer), //[1803h.05h], Название: Event Timer 4, ТекстПУ: EvTmr4, Группа: CAN +(long)(&co2_vars.co_TPDO5COBID), //[1804h.01h], Название: COB-ID for TPDO5, ТекстПУ: ITPDO5, Группа: CAN +(long)(&co2_vars.co_transType), //[1804h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO5ITime), //[1804h.03h], Название: Inhibit Time 5, ТекстПУ: ITime5, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1804h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO5EventTimer), //[1804h.05h], Название: Event Timer 5, ТекстПУ: EvTmr5, Группа: CAN +(long)(&co2_vars.co_TPDO6COBID), //[1805h.01h], Название: COB-ID for TPDO6, ТекстПУ: ITPDO6, Группа: CAN +(long)(&co2_vars.co_transType), //[1805h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO6ITime), //[1805h.03h], Название: Inhibit Time 6, ТекстПУ: ITime6, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1805h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO6EventTimer), //[1805h.05h], Название: Event Timer 6, ТекстПУ: EvTmr6, Группа: CAN +(long)(&co2_vars.co_TPDO7COBID), //[1806h.01h], Название: COB-ID for TPDO7, ТекстПУ: ITPDO7, Группа: CAN +(long)(&co2_vars.co_transType), //[1806h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO7ITime), //[1806h.03h], Название: Inhibit Time 7, ТекстПУ: ITime7, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1806h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO7EventTimer), //[1806h.05h], Название: Event Timer 7, ТекстПУ: EvTmr7, Группа: CAN +(long)(&co2_vars.co_TPDO8COBID), //[1807h.01h], Название: COB-ID for TPDO8, ТекстПУ: ITPDO8, Группа: CAN +(long)(&co2_vars.co_transType), //[1807h.02h], Название: Тип передачи, ТекстПУ: TransT, Группа: CAN +(long)(&co2_vars.co_TPDO8ITime), //[1807h.03h], Название: Inhibit Time 8, ТекстПУ: ITime8, Группа: CAN +(long)(&co2_vars.co_compatEntry), //[1807h.04h], Название: Compatibility Entry, ТекстПУ: CompEn, Группа: CAN +(long)(&co2_vars.co_TPDO8EventTimer), //[1807h.05h], Название: Event Timer 8, ТекстПУ: EvTmr8, Группа: CAN +(long)(&co2_vars.co_TPDO1_1Mapping), //[1A00h.01h], Название: TPDO1-1 Mapping, ТекстПУ: TPM11, Группа: CAN +(long)(&co2_vars.co_TPDO1_2Mapping), //[1A00h.02h], Название: TPDO1-2 Mapping, ТекстПУ: TPM12, Группа: CAN +(long)(&co2_vars.co_TPDO1_3Mapping), //[1A00h.03h], Название: TPDO1-3 Mapping, ТекстПУ: TPM13, Группа: CAN +(long)(&co2_vars.co_TPDO1_4Mapping), //[1A00h.04h], Название: TPDO1-4 Mapping, ТекстПУ: TPM14, Группа: CAN +(long)(&co2_vars.co_TPDO2_1Mapping), //[1A01h.01h], Название: TPDO2-1 Mapping, ТекстПУ: TPM21, Группа: CAN +(long)(&co2_vars.co_TPDO2_2Mapping), //[1A01h.02h], Название: TPDO2-2 Mapping, ТекстПУ: TPM22, Группа: CAN +(long)(&co2_vars.co_TPDO2_3Mapping), //[1A01h.03h], Название: TPDO2-3 Mapping, ТекстПУ: TPM23, Группа: CAN +(long)(&co2_vars.co_TPDO2_4Mapping), //[1A01h.04h], Название: TPDO2-4 Mapping, ТекстПУ: TPM24, Группа: CAN +(long)(&co2_vars.co_TPDO3_1Mapping), //[1A02h.01h], Название: TPDO3-1 Mapping, ТекстПУ: TPM31, Группа: CAN +(long)(&co2_vars.co_TPDO3_2Mapping), //[1A02h.02h], Название: TPDO3-2 Mapping, ТекстПУ: TPM32, Группа: CAN +(long)(&co2_vars.co_TPDO3_3Mapping), //[1A02h.03h], Название: TPDO3-3 Mapping, ТекстПУ: TPM33, Группа: CAN +(long)(&co2_vars.co_TPDO3_4Mapping), //[1A02h.04h], Название: TPDO3-4 Mapping, ТекстПУ: TPM34, Группа: CAN +(long)(&co2_vars.co_TPDO4_1Mapping), //[1A03h.01h], Название: TPDO4-1 Mapping, ТекстПУ: TPM41, Группа: CAN +(long)(&co2_vars.co_TPDO4_2Mapping), //[1A03h.02h], Название: TPDO4-2 Mapping, ТекстПУ: TPM42, Группа: CAN +(long)(&co2_vars.co_TPDO4_3Mapping), //[1A03h.03h], Название: TPDO4-3 Mapping, ТекстПУ: TPM43, Группа: CAN +(long)(&co2_vars.co_TPDO4_4Mapping), //[1A03h.04h], Название: TPDO4-4 Mapping, ТекстПУ: TPM44, Группа: CAN +(long)(&co2_vars.co_TPDO5_1Mapping), //[1A04h.01h], Название: TPDO5-1 Mapping, ТекстПУ: TPM51, Группа: CAN +(long)(&co2_vars.co_TPDO5_2Mapping), //[1A04h.02h], Название: TPDO5-2 Mapping, ТекстПУ: TPM52, Группа: CAN +(long)(&co2_vars.co_TPDO5_3Mapping), //[1A04h.03h], Название: TPDO5-3 Mapping, ТекстПУ: TPM53, Группа: CAN +(long)(&co2_vars.co_TPDO5_4Mapping), //[1A04h.04h], Название: TPDO5-4 Mapping, ТекстПУ: TPM54, Группа: CAN +(long)(&co2_vars.co_TPDO6_1Mapping), //[1A05h.01h], Название: TPDO6-1 Mapping, ТекстПУ: TPM61, Группа: CAN +(long)(&co2_vars.co_TPDO6_2Mapping), //[1A05h.02h], Название: TPDO6-2 Mapping, ТекстПУ: TPM62, Группа: CAN +(long)(&co2_vars.co_TPDO6_3Mapping), //[1A05h.03h], Название: TPDO6-3 Mapping, ТекстПУ: TPM63, Группа: CAN +(long)(&co2_vars.co_TPDO6_4Mapping), //[1A05h.04h], Название: TPDO6-4 Mapping, ТекстПУ: TPM64, Группа: CAN +(long)(&co2_vars.co_TPDO7_1Mapping), //[1A06h.01h], Название: TPDO7-1 Mapping, ТекстПУ: TPM71, Группа: CAN +(long)(&co2_vars.co_TPDO7_2Mapping), //[1A06h.02h], Название: TPDO7-2 Mapping, ТекстПУ: TPM72, Группа: CAN +(long)(&co2_vars.co_TPDO7_3Mapping), //[1A06h.03h], Название: TPDO7-3 Mapping, ТекстПУ: TPM73, Группа: CAN +(long)(&co2_vars.co_TPDO7_4Mapping), //[1A06h.04h], Название: TPDO7-4 Mapping, ТекстПУ: TPM74, Группа: CAN +(long)(&co2_vars.co_TPDO8_1Mapping), //[1A07h.01h], Название: TPDO8-1 Mapping, ТекстПУ: TPM81, Группа: CAN +(long)(&co2_vars.co_TPDO8_2Mapping), //[1A07h.02h], Название: TPDO8-2 Mapping, ТекстПУ: TPM82, Группа: CAN +(long)(&co2_vars.co_TPDO8_3Mapping), //[1A07h.03h], Название: TPDO8-3 Mapping, ТекстПУ: TPM83, Группа: CAN +(long)(&co2_vars.co_TPDO8_4Mapping), //[1A07h.04h], Название: TPDO8-4 Mapping, ТекстПУ: TPM84, Группа: CAN +(long)(&co2_vars.co_nodeID), //[2000h.00h], Название: CAN NODE-ID, ТекстПУ: NodeID, Группа: CAN +(long)(&co2_vars.co_bitRate), //[2001h.00h], Название: CAN Bit Rate, ТекстПУ: CANBR, Группа: CAN, биты с 0 по 2: 0000000000000111b +(long)(&co2_vars.co_vendorID), //[2002h.01h], Название: Код производителя, ТекстПУ: VendID, Группа: CAN +(long)(&co2_vars.co_productCode), //[2002h.02h], Название: Код продукта, ТекстПУ: PrCode, Группа: CAN +(long)(&co2_vars.co_revisionNumber), //[2002h.03h], Название: Номер ревизии, ТекстПУ: RevNum, Группа: CAN +(long)(&co2_vars.co_serialNumber), //[2002h.04h], Название: Серийный номер, ТекстПУ: SerNum, Группа: CAN +(long)(&co2_vars.co_specialData1), //[2003h.01h], Название: Special Data 1, ТекстПУ: SpDat1, Группа: CAN +(long)(&co2_vars.co_specialData2), //[2003h.02h], Название: Special Data 2, ТекстПУ: SpDat2, Группа: CAN +(long)(&co2_vars.co_specialData3), //[2003h.03h], Название: Special Data 3, ТекстПУ: SpDat3, Группа: CAN +(long)(&co2_vars.co_specialData4), //[2003h.04h], Название: Special Data 4, ТекстПУ: SpDat4, Группа: CAN +(long)(&co2_vars.co_secretCode), //[2004h.00h], Название: Secret Code, ТекстПУ: Secret, Группа: CAN +(long)(&co2_vars.co_protectBit), //[2005h.00h], Название: Protect Bit, ТекстПУ: ProtBt, Группа: CAN, биты с 0 по 0: 0000000000000001b +(long)(&co2_odHash[0]), //[2007h.01h], Название: md5_hash_0, ТекстПУ: md5_hash_0, Группа: CAN +(long)(&co2_odHash[1]), //[2007h.02h], Название: md5_hash_1, ТекстПУ: md5_hash_1, Группа: CAN +(long)(&co2_odHash[2]), //[2007h.03h], Название: md5_hash_2, ТекстПУ: md5_hash_2, Группа: CAN +(long)(&co2_odHash[3]), //[2007h.04h], Название: md5_hash_3, ТекстПУ: md5_hash_3, Группа: CAN +(long)(&co2_vars.co_heartbeatFlag0), //[2010h.01h], Название: Heartbeat Flag 0-31, ТекстПУ: HFlag0, Группа: CAN +(long)(&co2_vars.co_heartbeatFlag1), //[2010h.02h], Название: Heartbeat Flag 32-63, ТекстПУ: HFlag1, Группа: CAN +(long)(&co2_vars.co_heartbeatFlag2), //[2010h.03h], Название: Heartbeat Flag 64-95, ТекстПУ: HFlag2, Группа: CAN +(long)(&co2_vars.co_heartbeatFlag3), //[2010h.04h], Название: Heartbeat Flag 96-127, ТекстПУ: HFlag3, Группа: CAN +(long)(&co2_vars.co_heartbeatMask0), //[2011h.01h], Название: Heartbeat Mask 0-31, ТекстПУ: HMask0, Группа: CAN +(long)(&co2_vars.co_heartbeatMask1), //[2011h.02h], Название: Heartbeat Mask 32-63, ТекстПУ: HMask1, Группа: CAN +(long)(&co2_vars.co_heartbeatMask2), //[2011h.03h], Название: Heartbeat Mask 64-95, ТекстПУ: HMask2, Группа: CAN +(long)(&co2_vars.co_heartbeatMask3), //[2011h.04h], Название: Heartbeat Mask 96-127, ТекстПУ: HMask3, Группа: CAN +(long)(&co2_vars.co_heartbeatAutoStart), //[2012h.00h], Название: Heartbeat Autostart, ТекстПУ: HBASta, Группа: CAN, биты с 0 по 0: 0000000000000001b +(long)(&co2_vars.co_heartbeatAutoRecovery), //[2014h.00h], Название: Heartbeat Autorecovery, ТекстПУ: HBARec, Группа: CAN, биты с 0 по 0: 0000000000000001b +(long)(&co2_vars.co_nodeState), //[2015h.00h], Название: Состояние драйвера CAN-Open, ТекстПУ: State, Группа: CAN +(long)(&co2_vars.co_emergencyErrorCode), //[2016h.00h], Название: Emergency Error Code, ТекстПУ: EmErCo, Группа: CAN +(long)(&co2_vars.co_deviceErrorState), //[2017h.00h], Название: Device Error State, ТекстПУ: DeErSt, Группа: CAN +(long)(&co2_vars.co_ODCommand), //[2080h.01h], Название: Object Dictionary Command, ТекстПУ: ODComm, Группа: CAN +(long)(&co2_vars.co_currentODIndex), //[2080h.02h], Название: Current OD Index, ТекстПУ: ODCInd, Группа: CAN +(long)(&co2_vars.co_currentODSubIndex), //[2080h.03h], Название: Current OD Sub-Index, ТекстПУ: ODCSub, Группа: CAN +(long)(&co2_vars.co_currentODEText), //[2080h.04h], Название: Current OD Element Text, ТекстПУ: ODCTxt, Группа: CAN +(long)(&co2_vars.co_currentODEFormat), //[2080h.05h], Название: Current OD Element Format, ТекстПУ: ODCFrm, Группа: CAN +(long)(&co2_vars.co_currentODEMin), //[2080h.06h], Название: Current OD Element Min, ТекстПУ: ODCMin, Группа: CAN +(long)(&co2_vars.co_currentODEMax), //[2080h.07h], Название: Current OD Element Max, ТекстПУ: ODCMax, Группа: CAN +(long)(&co2_vars.co_currentODEDefault), //[2080h.08h], Название: Current OD Element Default, ТекстПУ: ODCDef, Группа: CAN +(long)(&co2_vars.co_currentODEMinLow), //[2080h.09h], Название: Current OD Element MinLow, ТекстПУ: ODCMiL, Группа: CAN +(long)(&co2_vars.co_currentODEMaxLow), //[2080h.0Ah], Название: Current OD Element MaxLow, ТекстПУ: ODCMaL, Группа: CAN +(long)(&co2_vars.co_currentODEDefaultLow), //[2080h.0Bh], Название: Current OD Element Default Low, ТекстПУ: ODCDeL, Группа: CAN +(long)(&co2_vars.co_currentODEAddrLow), //[2080h.0Ch], Название: Current OD Element Address, ТекстПУ: ODCAdr, Группа: CAN +(long)(&co2_vars.co_currentODEAddrLow), //[2080h.0Dh], Название: Current OD Element Address, ТекстПУ: ODCAdr, Группа: CAN +(long)(&co2_vars.co_currentODEType), //[2080h.0Eh], Название: Группа параметров, ТекстПУ: Группа, Группа: CAN +(long)(&co2_vars.co_odIndexSize), //[2081h.00h], Название: Количество индексов, ТекстПУ: КолИнд, Группа: CAN +(long)(&co2_vars.co_defaultIndex1), //[2082h.01h], Название: Default Index 1, ТекстПУ: DfInd1, Группа: CAN +(long)(&co2_vars.co_defaultIndex2), //[2082h.02h], Название: Default Index 2, ТекстПУ: DfInd2, Группа: CAN +(long)(&co2_vars.co_maskElement01), //[2083h.01h], Название: Mask Element, ТекстПУ: MskEl0, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElement01), //[2083h.02h], Название: Mask Element, ТекстПУ: MskEl1, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElement23), //[2083h.03h], Название: Mask Element, ТекстПУ: MskEl2, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElement23), //[2083h.04h], Название: Mask Element, ТекстПУ: MskEl3, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElement45), //[2083h.05h], Название: Mask Element, ТекстПУ: MskEl4, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElement45), //[2083h.06h], Название: Mask Element, ТекстПУ: MskEl5, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElement67), //[2083h.07h], Название: Mask Element, ТекстПУ: MskEl6, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElement67), //[2083h.08h], Название: Mask Element, ТекстПУ: MskEl7, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElement89), //[2083h.09h], Название: Mask Element, ТекстПУ: MskEl8, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElement89), //[2083h.0Ah], Название: Mask Element, ТекстПУ: MskEl9, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElementAB), //[2083h.0Bh], Название: Mask Element, ТекстПУ: MskElA, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElementAB), //[2083h.0Ch], Название: Mask Element, ТекстПУ: MskElB, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElementCD), //[2083h.0Dh], Название: Mask Element, ТекстПУ: MskElC, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElementCD), //[2083h.0Eh], Название: Mask Element, ТекстПУ: MskElD, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_maskElementEF), //[2083h.0Fh], Название: Mask Element, ТекстПУ: MskElE, Группа: CAN, биты с 0 по 7: 0000000011111111b +(long)(&co2_vars.co_maskElementEF), //[2083h.10h], Название: Mask Element, ТекстПУ: MskElF, Группа: CAN, биты с 8 по 15: 1111111100000000b +(long)(&co2_vars.co_scaleNum0), //[2100h.01h], Название: Scale Number 0, ТекстПУ: SN0, Группа: CAN +(long)(&co2_vars.co_scaleNum0Format), //[2100h.02h], Название: Scale Number 0 Format, ТекстПУ: S0Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum0Format), //[2100h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum0Format), //[2100h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum0Format), //[2100h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum0Format), //[2100h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum1), //[2101h.01h], Название: Scale Number 1, ТекстПУ: SN1, Группа: CAN +(long)(&co2_vars.co_scaleNum1Format), //[2101h.02h], Название: Scale Number 1 Format, ТекстПУ: S1Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum1Format), //[2101h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum1Format), //[2101h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum1Format), //[2101h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum1Format), //[2101h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum2), //[2102h.01h], Название: Scale Number 2, ТекстПУ: SN2, Группа: CAN +(long)(&co2_vars.co_scaleNum2Format), //[2102h.02h], Название: Scale Number 2 Format, ТекстПУ: S2Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum2Format), //[2102h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum2Format), //[2102h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum2Format), //[2102h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum2Format), //[2102h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum3), //[2103h.01h], Название: Scale Number 3, ТекстПУ: SN3, Группа: CAN +(long)(&co2_vars.co_scaleNum3Format), //[2103h.02h], Название: Scale Number 3 Format, ТекстПУ: S3Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum3Format), //[2103h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum3Format), //[2103h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum3Format), //[2103h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum3Format), //[2103h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum4), //[2104h.01h], Название: Scale Number 4, ТекстПУ: SN4, Группа: CAN +(long)(&co2_vars.co_scaleNum4Format), //[2104h.02h], Название: Scale Number 4 Format, ТекстПУ: S4Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum4Format), //[2104h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum4Format), //[2104h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum4Format), //[2104h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum4Format), //[2104h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum5), //[2105h.01h], Название: Scale Number 5, ТекстПУ: SN5, Группа: CAN +(long)(&co2_vars.co_scaleNum5Format), //[2105h.02h], Название: Scale Number 5 Format, ТекстПУ: S5Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum5Format), //[2105h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum5Format), //[2105h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum5Format), //[2105h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum5Format), //[2105h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum6), //[2106h.01h], Название: Scale Number 6, ТекстПУ: SN6, Группа: CAN +(long)(&co2_vars.co_scaleNum6Format), //[2106h.02h], Название: Scale Number 6 Format, ТекстПУ: S6Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum6Format), //[2106h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum6Format), //[2106h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum6Format), //[2106h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum6Format), //[2106h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum7), //[2107h.01h], Название: Scale Number 7, ТекстПУ: SN7, Группа: CAN +(long)(&co2_vars.co_scaleNum7Format), //[2107h.02h], Название: Scale Number 7 Format, ТекстПУ: S7Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum7Format), //[2107h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum7Format), //[2107h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum7Format), //[2107h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum7Format), //[2107h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum8), //[2108h.01h], Название: Scale Number 8, ТекстПУ: SN8, Группа: CAN +(long)(&co2_vars.co_scaleNum8Format), //[2108h.02h], Название: Scale Number 8 Format, ТекстПУ: S8Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum8Format), //[2108h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum8Format), //[2108h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum8Format), //[2108h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum8Format), //[2108h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum9), //[2109h.01h], Название: Scale Number 9, ТекстПУ: SN9, Группа: CAN +(long)(&co2_vars.co_scaleNum9Format), //[2109h.02h], Название: Scale Number 9 Format, ТекстПУ: S9Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum9Format), //[2109h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum9Format), //[2109h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum9Format), //[2109h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum9Format), //[2109h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNumA), //[210Ah.01h], Название: Scale Number A, ТекстПУ: SNA, Группа: CAN +(long)(&co2_vars.co_scaleNumAFormat), //[210Ah.02h], Название: Scale Number A Format, ТекстПУ: SAFmt, Группа: CAN +(long)(&co2_vars.co_scaleNumAFormat), //[210Ah.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNumAFormat), //[210Ah.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNumAFormat), //[210Ah.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNumAFormat), //[210Ah.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNumB), //[210Bh.01h], Название: Scale Number B, ТекстПУ: SNB, Группа: CAN +(long)(&co2_vars.co_scaleNumBFormat), //[210Bh.02h], Название: Scale Number B Format, ТекстПУ: SBFmt, Группа: CAN +(long)(&co2_vars.co_scaleNumBFormat), //[210Bh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNumBFormat), //[210Bh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNumBFormat), //[210Bh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNumBFormat), //[210Bh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNumC), //[210Ch.01h], Название: Scale Number C, ТекстПУ: SNC, Группа: CAN +(long)(&co2_vars.co_scaleNumCFormat), //[210Ch.02h], Название: Scale Number C Format, ТекстПУ: SCFmt, Группа: CAN +(long)(&co2_vars.co_scaleNumCFormat), //[210Ch.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNumCFormat), //[210Ch.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNumCFormat), //[210Ch.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNumCFormat), //[210Ch.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNumD), //[210Dh.01h], Название: Scale Number D, ТекстПУ: SND, Группа: CAN +(long)(&co2_vars.co_scaleNumDFormat), //[210Dh.02h], Название: Scale Number D Format, ТекстПУ: SDFmt, Группа: CAN +(long)(&co2_vars.co_scaleNumDFormat), //[210Dh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNumDFormat), //[210Dh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNumDFormat), //[210Dh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNumDFormat), //[210Dh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNumE), //[210Eh.01h], Название: Scale Number E, ТекстПУ: SNE, Группа: CAN +(long)(&co2_vars.co_scaleNumEFormat), //[210Eh.02h], Название: Scale Number E Format, ТекстПУ: SEFmt, Группа: CAN +(long)(&co2_vars.co_scaleNumEFormat), //[210Eh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNumEFormat), //[210Eh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNumEFormat), //[210Eh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNumEFormat), //[210Eh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNumF), //[210Fh.01h], Название: Scale Number F, ТекстПУ: SNF, Группа: CAN +(long)(&co2_vars.co_scaleNumFFormat), //[210Fh.02h], Название: Scale Number F Format, ТекстПУ: SFFmt, Группа: CAN +(long)(&co2_vars.co_scaleNumFFormat), //[210Fh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNumFFormat), //[210Fh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNumFFormat), //[210Fh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNumFFormat), //[210Fh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum10), //[2110h.01h], Название: Scale Number 10, ТекстПУ: SN10, Группа: CAN +(long)(&co2_vars.co_scaleNum10Format), //[2110h.02h], Название: Scale Number 10 Format, ТекстПУ: S10Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum10Format), //[2110h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum10Format), //[2110h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum10Format), //[2110h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum10Format), //[2110h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum11), //[2111h.01h], Название: Scale Number 11, ТекстПУ: SN11, Группа: CAN +(long)(&co2_vars.co_scaleNum11Format), //[2111h.02h], Название: Scale Number 11 Format, ТекстПУ: S11Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum11Format), //[2111h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum11Format), //[2111h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum11Format), //[2111h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum11Format), //[2111h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum12), //[2112h.01h], Название: Scale Number 12, ТекстПУ: SN12, Группа: CAN +(long)(&co2_vars.co_scaleNum12Format), //[2112h.02h], Название: Scale Number 12 Format, ТекстПУ: S12Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum12Format), //[2112h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum12Format), //[2112h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum12Format), //[2112h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum12Format), //[2112h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum13), //[2113h.01h], Название: Scale Number 13, ТекстПУ: SN13, Группа: CAN +(long)(&co2_vars.co_scaleNum13Format), //[2113h.02h], Название: Scale Number 13 Format, ТекстПУ: S13Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum13Format), //[2113h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum13Format), //[2113h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum13Format), //[2113h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum13Format), //[2113h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum14), //[2114h.01h], Название: Scale Number 14, ТекстПУ: SN14, Группа: CAN +(long)(&co2_vars.co_scaleNum14Format), //[2114h.02h], Название: Scale Number 14 Format, ТекстПУ: S14Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum14Format), //[2114h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum14Format), //[2114h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum14Format), //[2114h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum14Format), //[2114h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum15), //[2115h.01h], Название: Scale Number 15, ТекстПУ: SN15, Группа: CAN +(long)(&co2_vars.co_scaleNum15Format), //[2115h.02h], Название: Scale Number 15Format, ТекстПУ: S15Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum15Format), //[2115h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum15Format), //[2115h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum15Format), //[2115h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum15Format), //[2115h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum16), //[2116h.01h], Название: Scale Number 16, ТекстПУ: SN16, Группа: CAN +(long)(&co2_vars.co_scaleNum16Format), //[2116h.02h], Название: Scale Number 16Format, ТекстПУ: S16Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum16Format), //[2116h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum16Format), //[2116h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum16Format), //[2116h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum16Format), //[2116h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum17), //[2117h.01h], Название: Scale Number 17, ТекстПУ: SN17, Группа: CAN +(long)(&co2_vars.co_scaleNum17Format), //[2117h.02h], Название: Scale Number 17Format, ТекстПУ: S17Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum17Format), //[2117h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum17Format), //[2117h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum17Format), //[2117h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum17Format), //[2117h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum18), //[2118h.01h], Название: Scale Number 18, ТекстПУ: SN18, Группа: CAN +(long)(&co2_vars.co_scaleNum18Format), //[2118h.02h], Название: Scale Number 18Format, ТекстПУ: S18Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum18Format), //[2118h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum18Format), //[2118h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum18Format), //[2118h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum18Format), //[2118h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum19), //[2119h.01h], Название: Scale Number 19, ТекстПУ: SN19, Группа: CAN +(long)(&co2_vars.co_scaleNum19Format), //[2119h.02h], Название: Scale Number 19Format, ТекстПУ: S19Fmt, Группа: CAN +(long)(&co2_vars.co_scaleNum19Format), //[2119h.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum19Format), //[2119h.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum19Format), //[2119h.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum19Format), //[2119h.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum1A), //[211Ah.01h], Название: Scale Number 1A, ТекстПУ: SN1A, Группа: CAN +(long)(&co2_vars.co_scaleNum1AFormat), //[211Ah.02h], Название: Scale Number 1AFormat, ТекстПУ: S1AFmt, Группа: CAN +(long)(&co2_vars.co_scaleNum1AFormat), //[211Ah.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum1AFormat), //[211Ah.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum1AFormat), //[211Ah.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum1AFormat), //[211Ah.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum1B), //[211Bh.01h], Название: Scale Number 1B, ТекстПУ: SN1B, Группа: CAN +(long)(&co2_vars.co_scaleNum1BFormat), //[211Bh.02h], Название: Scale Number 1BFormat, ТекстПУ: S1BFmt, Группа: CAN +(long)(&co2_vars.co_scaleNum1BFormat), //[211Bh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum1BFormat), //[211Bh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum1BFormat), //[211Bh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum1BFormat), //[211Bh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum1C), //[211Ch.01h], Название: Scale Number 1C, ТекстПУ: SN1C, Группа: CAN +(long)(&co2_vars.co_scaleNum1CFormat), //[211Ch.02h], Название: Scale Number 1C Format, ТекстПУ: S1CFmt, Группа: CAN +(long)(&co2_vars.co_scaleNum1CFormat), //[211Ch.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum1CFormat), //[211Ch.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum1CFormat), //[211Ch.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum1CFormat), //[211Ch.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&co2_vars.co_scaleNum1D), //[211Dh.01h], Название: Scale Number 1D, ТекстПУ: SN1D, Группа: CAN +(long)(&co2_vars.co_scaleNum1DFormat), //[211Dh.02h], Название: Scale Number 1D Format, ТекстПУ: S1DFmt, Группа: CAN +(long)(&co2_vars.co_scaleNum1DFormat), //[211Dh.03h], Название: Scale Number Format Q, ТекстПУ: Q-type, Группа: CAN, биты с 0 по 4: 0000000000011111b +(long)(&co2_vars.co_scaleNum1DFormat), //[211Dh.04h], Название: Scale Number Format NumOfFloat, ТекстПУ: NFloat, Группа: CAN, биты с 5 по 6: 0000000001100000b +(long)(&co2_vars.co_scaleNum1DFormat), //[211Dh.05h], Название: Scale Number Format Prefix, ТекстПУ: Prefix, Группа: CAN, биты с 7 по 9: 0000001110000000b +(long)(&co2_vars.co_scaleNum1DFormat), //[211Dh.06h], Название: Scale Number Format Units, ТекстПУ: Units, Группа: CAN, биты с 10 по 15: 1111110000000000b +(long)(&cmd.all), //[2502h.01h], Название: Пуск, ТекстПУ: Пуск, Группа: Слово управления, биты с 0 по 0: 0000000000000001b +(long)(&cmd.all), //[2502h.02h], Название: Стоп, ТекстПУ: Стоп, Группа: Слово управления, биты с 1 по 1: 0000000000000010b +(long)(&cmd.all), //[2502h.03h], Название: Сбросить состояние Аварии, ТекстПУ: СбрАвр, Группа: Слово управления, биты с 2 по 2: 0000000000000100b +(long)(&cmd.all), //[2502h.04h], Название: Слово управления CAN, ТекстПУ: КмдCAN, Группа: Слово управления +(long)(&drv_interface.req_data), //[2506h.01h], Название: Таймаут потери связи, ТекстПУ: OfflineCounterMax, Группа: ВНЕ ГРУПП +(long)(&drv_interface.ans_data), //[2506h.02h], Название: Счетчик потери связи, ТекстПУ: OfflineCounter, Группа: ВНЕ ГРУПП +(long)(&drv_interface.data_Low), //[2506h.03h], Название: data_Low, ТекстПУ: data_L, Группа: ВНЕ ГРУПП +(long)(&drv_interface.data_High), //[2506h.04h], Название: data_High, ТекстПУ: data_H, Группа: ВНЕ ГРУПП +(long)(&RTCclock.packed_time), //[250Fh.00h], Название: Часы реального времени, ТекстПУ: RTC, Группа: Наблюдаемые +(long)(&sm_prot.Main_ErrorCode), //[2532h.01h], Название: Код аварии ARM, ТекстПУ: Код аварии ARM, Группа: Рег. тока якоря, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.Main_ErrorCode), //[2532h.02h], Название: Расширение кода аварии, ТекстПУ: Авр+, Группа: Рег. тока якоря, биты с 8 по 15: 1111111100000000b +(long)(&sm_prot.Main_Flags), //[2532h.03h], Название: Системный объект, ТекстПУ: System, Группа: Рег. тока якоря, биты с 0 по 0: 0000000000000001b +(long)(&disp_group_number), //[2534h.01h], Название: Номер груп для пульта управления, ТекстПУ: № гр ПУ, Группа: CAN +(long)(&VendorToken), //[2600h.01h], Название: VendorToken, ТекстПУ: VendorToken, Группа: ВНЕ ГРУПП +(long)(&co2_vars.co_blockTransferCommand), //[2700h.00h], Название: Block Transfer Interpreter, ТекстПУ: BT Interpreter, Группа: Слово управления +(long)(&swu_vars), //[2701h.01h], Название: cmd, ТекстПУ: cmd, Группа: Слово управления +(long)(&swu_vars), //[2701h.02h], Название: status, ТекстПУ: status, Группа: Слово управления +(long)(&swu_vars), //[2701h.03h], Название: quest1, ТекстПУ: quest1, Группа: Слово управления +(long)(&swu_vars), //[2701h.04h], Название: quest2, ТекстПУ: quest2, Группа: Слово управления +(long)(&swu_vars), //[2701h.05h], Название: quest3, ТекстПУ: quest3, Группа: Слово управления +(long)(&swu_vars), //[2701h.06h], Название: quest4, ТекстПУ: quest4, Группа: Слово управления +(long)(&swu_vars), //[2701h.07h], Название: ans1, ТекстПУ: ans1, Группа: Слово управления +(long)(&swu_vars), //[2701h.08h], Название: ans2, ТекстПУ: ans2, Группа: Слово управления +(long)(&swu_vars), //[2701h.09h], Название: ans3, ТекстПУ: ans3, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Ah], Название: ans4, ТекстПУ: ans4, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Bh], Название: addr, ТекстПУ: addr, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Ch], Название: CPU_ID, ТекстПУ: CPU_ID, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Dh], Название: sector_mask, ТекстПУ: sector_mask, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Eh], Название: version, ТекстПУ: version, Группа: Слово управления +(long)(&swu_vars), //[2701h.0Fh], Название: CRC, ТекстПУ: CRC, Группа: Слово управления +(long)(&drv_status.all), //[3000h.00h], Название: Статус преобразователя, ТекстПУ: Статус, Группа: ВНЕ ГРУПП, биты с 0 по 5: 0000000000111111b +(long)(&msCounter), //[3100h.01h], Название: Счётчик прерываний 1 кГц, ТекстПУ: Сч.прерыв.1 кГц, Группа: Счетчики +(long)(&FastCounter), //[3100h.02h], Название: Счётчик прерываний 10 кГц, ТекстПУ: Сч.прерыв.10 кГц, Группа: Счетчики +(long)(&LoopCounter), //[3100h.03h], Название: BackgroundCounter, ТекстПУ: BackgroundCounter, Группа: Счетчики +(long)(&TIsr10), //[3100h.04h], Название: T_10кГц, ТекстПУ: T_10кГц, Группа: Счетчики +(long)(&TIsr1), //[3100h.05h], Название: T_1кГц, ТекстПУ: T_1кГц, Группа: Счетчики +(long)(&rmp.T), //[5000h.01h], Название: T разгона до номинала, ТекстПУ: rmpT, Группа: ЗИ +(long)(&rmp.input), //[5000h.02h], Название: Вход ЗИ, ТекстПУ: ВходЗИ, Группа: ЗИ +(long)(&rmp.output), //[5000h.03h], Название: Выход ЗИ, ТекстПУ: ВыходЗИ, Группа: ЗИ +(long)(&pid_id.pid_ref_reg3), //[5100h.01h], Название: Задание, ТекстПУ: Зад-е, Группа: Рег. тока Id +(long)(&pid_id.pid_fdb_reg3), //[5100h.02h], Название: Обратная связь, ТекстПУ: Обр.Св, Группа: Рег. тока Id +(long)(&pid_id.Kp_reg3), //[5100h.03h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. тока Id +(long)(&pid_id.pid_out_max), //[5100h.04h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. тока Id +(long)(&pid_id.pid_out_min), //[5100h.05h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. тока Id +(long)(&pid_id.Ki_reg3), //[5100h.06h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. тока Id +(long)(&pid_id.Kd_reg3), //[5100h.07h], Название: Дифф. коэфф. Kd, ТекстПУ: Kd, Группа: Рег. тока Id +(long)(&pid_id.Kc_reg3), //[5100h.08h], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. тока Id +(long)(&pid_id.e_reg3), //[5100h.09h], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. тока Id +(long)(&pid_id.pid_out_reg3), //[5100h.0Ah], Название: Выход регулятора, ТекстПУ: Выход, Группа: Рег. тока Id +(long)(&pid_id.up_reg3), //[5100h.0Bh], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. тока Id +(long)(&pid_id.ui_reg3), //[5100h.0Ch], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. тока Id +(long)(&pid_id.ud_reg3), //[5100h.0Dh], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. тока Id +(long)(&pid_spd.pid_ref_reg3), //[5101h.01h], Название: Задание, ТекстПУ: pisref, Группа: Рег. скорости +(long)(&pid_spd.pid_fdb_reg3), //[5101h.02h], Название: Обратная связь, ТекстПУ: pisfbd, Группа: Рег. скорости +(long)(&pid_spd.Kp_reg3), //[5101h.03h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. скорости +(long)(&pid_spd.pid_out_max), //[5101h.04h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. скорости +(long)(&pid_spd.pid_out_min), //[5101h.05h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. скорости +(long)(&pid_spd.Ki_reg3), //[5101h.06h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. скорости +(long)(&pid_spd.Kd_reg3), //[5101h.07h], Название: Дифф. коэфф. Kd, ТекстПУ: pisKd, Группа: Рег. скорости +(long)(&pid_spd.Kc_reg3), //[5101h.08h], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. скорости +(long)(&pid_spd.e_reg3), //[5101h.09h], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. скорости +(long)(&pid_spd.pid_out_reg3), //[5101h.0Ah], Название: Выход регулятора, ТекстПУ: pisout, Группа: Рег. скорости +(long)(&pid_spd.up_reg3), //[5101h.0Bh], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. скорости +(long)(&pid_spd.ui_reg3), //[5101h.0Ch], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. скорости +(long)(&pid_spd.ud_reg3), //[5101h.0Dh], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. скорости +(long)(&pid_spd.saterr_reg3), //[5101h.0Eh], Название: Превышение насыщения, ТекстПУ: Прев. насыщ, Группа: Рег. скорости +(long)(&pid_iq.pid_ref_reg3), //[5102h.01h], Название: Задание, ТекстПУ: Зад-ие, Группа: Рег. тока Iq +(long)(&pid_iq.pid_fdb_reg3), //[5102h.02h], Название: Обратная связь, ТекстПУ: Обр.Св, Группа: Рег. тока Iq +(long)(&pid_iq.Kp_reg3), //[5102h.03h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. тока Iq +(long)(&pid_iq.pid_out_max), //[5102h.04h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. тока Iq +(long)(&pid_iq.pid_out_min), //[5102h.05h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. тока Iq +(long)(&pid_iq.Ki_reg3), //[5102h.06h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. тока Iq +(long)(&pid_iq.Kd_reg3), //[5102h.07h], Название: Дифф. коэфф. Kd, ТекстПУ: Kd, Группа: Рег. тока Iq +(long)(&pid_iq.Kc_reg3), //[5102h.08h], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. тока Iq +(long)(&pid_iq.e_reg3), //[5102h.09h], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. тока Iq +(long)(&pid_iq.pid_out_reg3), //[5102h.0Ah], Название: Выход регулятора, ТекстПУ: Выход, Группа: Рег. тока Iq +(long)(&pid_iq.up_reg3), //[5102h.0Bh], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. тока Iq +(long)(&pid_iq.ui_reg3), //[5102h.0Ch], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. тока Iq +(long)(&pid_iq.ud_reg3), //[5102h.0Dh], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. тока Iq +(long)(&pid_pos.pid_ref_reg3), //[5103h.01h], Название: Задание, ТекстПУ: pisref, Группа: Рег. положения +(long)(&pid_pos.pid_ref_reg3), //[5103h.02h], Название: Задание, ТекстПУ: pisref, Группа: Рег. положения +(long)(&pid_pos.pid_fdb_reg3), //[5103h.03h], Название: Обратная связь, ТекстПУ: pisfbd, Группа: Рег. положения +(long)(&pid_pos.pid_fdb_reg3), //[5103h.04h], Название: Обратная связь, ТекстПУ: pisfbd, Группа: Рег. положения +(long)(&pid_pos.Kp_reg3), //[5103h.05h], Название: Пропорц. коэфф. Kp, ТекстПУ: Kp, Группа: Рег. положения +(long)(&pid_pos.pid_out_max), //[5103h.06h], Название: Максимум выхода, ТекстПУ: Max, Группа: Рег. положения +(long)(&pid_pos.pid_out_min), //[5103h.07h], Название: Минимум выхода, ТекстПУ: Min, Группа: Рег. положения +(long)(&pid_pos.Ki_reg3), //[5103h.08h], Название: Интегральный коэфф. Ki, ТекстПУ: Ki, Группа: Рег. положения +(long)(&pid_pos.Kd_reg3), //[5103h.09h], Название: Дифф. коэфф. Kd, ТекстПУ: pisKd, Группа: Рег. положения +(long)(&pid_pos.DiffDelim), //[5103h.0Ah], Название: Делит. дифф. части, ТекстПУ: Делит. дифф. части, Группа: Рег. положения +(long)(&pid_pos.Kf_d), //[5103h.0Bh], Название: Коэф. фильтра, ТекстПУ: Коэф. фильтра, Группа: Рег. положения +(long)(&pid_pos.Kc_reg3), //[5103h.0Ch], Название: Интегр.корректир.коэффициент, ТекстПУ: Kc, Группа: Рег. положения +(long)(&pid_pos.DeadZone), //[5103h.0Dh], Название: Мертвая зона, ТекстПУ: Мертвая зона, Группа: Рег. положения +(long)(&pid_pos.e_reg3), //[5103h.0Eh], Название: Ошибка рассогласования сигналов, ТекстПУ: Ошибка, Группа: Рег. положения +(long)(&pid_spd.saterr_reg3), //[5103h.0Fh], Название: Превышение насыщения, ТекстПУ: Прев. насыщ, Группа: Рег. положения +(long)(&pid_pos.pid_out_reg3), //[5103h.10h], Название: Выход регулятора, ТекстПУ: pisout, Группа: Рег. положения +(long)(&pid_pos.up_reg3), //[5103h.11h], Название: Вых.Пропорц., ТекстПУ: Вых.Пропорц., Группа: Рег. положения +(long)(&pid_pos.ui_reg3), //[5103h.12h], Название: Вых.Интегр., ТекстПУ: Вых.Интегр., Группа: Рег. положения +(long)(&pid_pos.ud_reg3), //[5103h.13h], Название: Вых.Диффер., ТекстПУ: Вых.Диффер., Группа: Рег. положения +(long)(&pid_pos.e_reg3_filterOut), //[5103h.14h], Название: Фильтр ошибки, ТекстПУ: Фильтр ошибки, Группа: Рег. положения +(long)(&pwm.UalphaRef), //[5105h.01h], Название: UaЗад, ТекстПУ: UaЗад, Группа: ШИМ +(long)(&pwm.UbetaRef), //[5105h.02h], Название: UbЗад, ТекстПУ: UbЗад, Группа: ШИМ +(long)(&pwm.U_lim), //[5105h.03h], Название: U_огр, ТекстПУ: U_огр, Группа: ШИМ +(long)(&pwm.GammaA), //[5105h.04h], Название: GammaA, ТекстПУ: GmA, Группа: ШИМ +(long)(&pwm.GammaB), //[5105h.05h], Название: GammaB, ТекстПУ: GmB, Группа: ШИМ +(long)(&pwm.GammaC), //[5105h.06h], Название: GammaC, ТекстПУ: GmC, Группа: ШИМ +(long)(&pwm.k_pwm), //[5105h.07h], Название: TPWM, ТекстПУ: TPWM, Группа: ШИМ +(long)(&pwm.DeadBand), //[5105h.08h], Название: Мертвое время (мкс), ТекстПУ: Мерт. время, Группа: ШИМ +(long)(&pwm.MinGammaLimit), //[5105h.09h], Название: Ограничение мин. скважн., ТекстПУ: GamLim, Группа: ШИМ +(long)(&pwm.UdCompK), //[5105h.0Ah], Название: Коэф. компенсации Ud, ТекстПУ: UdКомпK, Группа: ШИМ +(long)(&pwm.UdCompEnable), //[5105h.0Bh], Название: Компенсация Ud, ТекстПУ: UdКомп, Группа: ШИМ, биты с 0 по 0: 0000000000000001b +(long)(&pwm.PWM_type), //[5105h.0Ch], Название: Тип ШИМ, ТекстПУ: ТипШИМ, Группа: ШИМ +(long)(&pwm.ULimitation), //[5105h.0Dh], Название: ULimitation, ТекстПУ: ULimitation, Группа: ШИМ +(long)(&pwm.Frequency), //[5105h.0Eh], Название: Частота ШИМ, ТекстПУ: Fшим, Группа: ШИМ +(long)(&pwm.sector), //[5105h.0Fh], Название: Сектор, ТекстПУ: Сектор, Группа: ШИМ +(long)(&pwm.U_mag), //[5105h.10h], Название: U_ампл, ТекстПУ: U_ампл, Группа: ШИМ +(long)(&pwm.PDP_Fault), //[5105h.11h], Название: Флаги аварий, ТекстПУ: F_bits, Группа: ШИМ +(long)(&sm_ctrl.state), //[510Bh.01h], Название: sm_state, ТекстПУ: smstat, Группа: ДА sm_ctrl +(long)(&drv_status_code), //[510Bh.02h], Название: drv_status_code, ТекстПУ: stcode, Группа: ДА sm_ctrl, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.bit_fault1), //[510Eh.01h], Название: Флаги аварий 1, ТекстПУ: bitF_1, Группа: Защиты +(long)(&sm_prot.bit_fault2), //[510Eh.02h], Название: Флаги аварий 2, ТекстПУ: bitF_2, Группа: Защиты +(long)(&sm_prot.mask_fault1), //[510Eh.03h], Название: Маска аварий 1L, ТекстПУ: mask1L, Группа: Защиты, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.mask_fault1), //[510Eh.04h], Название: Маска аварий 1H, ТекстПУ: mask1H, Группа: Защиты, биты с 8 по 15: 1111111100000000b +(long)(&sm_prot.mask_fault2), //[510Eh.05h], Название: Маска аварий 2L, ТекстПУ: mask2L, Группа: Защиты, биты с 0 по 7: 0000000011111111b +(long)(&sm_prot.mask_fault2), //[510Eh.06h], Название: Маска аварий 2H, ТекстПУ: mask2H, Группа: Защиты, биты с 8 по 15: 1111111100000000b +(long)(&sm_prot.Imax_protect), //[510Eh.07h], Название: Максимальный ток, ТекстПУ: Макс.Ток, Группа: Защиты +(long)(&sm_prot.Umax_protect), //[510Eh.08h], Название: Максимальное напряжение, ТекстПУ: Ud_max, Группа: Защиты +(long)(&sm_prot.Umin_protect), //[510Eh.09h], Название: Минимальное напряжение, ТекстПУ: Ud_min, Группа: Защиты +(long)(&sm_prot.speed_max), //[510Eh.0Ah], Название: Максимальная скорость, ТекстПУ: speed_max, Группа: Защиты +(long)(&sm_prot.T_max), //[510Eh.0Bh], Название: Максимальная температура, ТекстПУ: t_max, Группа: Защиты +(long)(&refs.speed_ref), //[5112h.01h], Название: Скорость, ТекстПУ: Скор_з, Группа: Задания +(long)(&refs.Iq_ref), //[5112h.02h], Название: Макс. ток ВУ, ТекстПУ: ТокСТз, Группа: Задания +(long)(&refs.i_flux_ref), //[5112h.03h], Название: Ток удержания, ТекстПУ: ТокУПз, Группа: Задания +(long)(&refs.theta_elec), //[5112h.04h], Название: theta_elec, ТекстПУ: элекУг, Группа: Задания +(long)(&refs.uf_ref), //[5112h.05h], Название: Заданное напряжение ОВ, ТекстПУ: Uf_ref, Группа: Задания +(long)(&drv_params.p), //[5113h.01h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Базов. парам +(long)(&drv_params.I_nom), //[5113h.02h], Название: Номинальный ток, ТекстПУ: IпчНом, Группа: Базов. парам +(long)(&drv_params.U_nom), //[5113h.03h], Название: Номинальное напряжение фазн., ТекстПУ: Uф_ном, Группа: Базов. парам +(long)(&drv_params.speed_nom), //[5113h.04h], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Базов. парам +(long)(&drv_params.Udc_nom), //[5113h.05h], Название: Номинальное напряжение ЗПТ, ТекстПУ: UdcНом, Группа: Базов. парам +(long)(&drv_params.Rs), //[5113h.06h], Название: Rs, ТекстПУ: Rs, Группа: Базов. парам +(long)(&drv_params.Ls), //[5113h.07h], Название: Ls, ТекстПУ: Ls, Группа: Базов. парам +(long)(&drv_params.freq_nom), //[5113h.08h], Название: Номинальная частота, ТекстПУ: Ном.част., Группа: Базов. парам +(long)(&drv_params.sens_type), //[5113h.09h], Название: Тип датчика положения, ТекстПУ: Sens_type, Группа: Базов. парам, биты с 0 по 2: 0000000000000111b +(long)(&sw.HardwareType), //[5114h.01h], Название: Тип аппаратной части, ТекстПУ: HardwareType, Группа: Настройки СУ, биты с 0 по 7: 0000000011111111b +(long)(&sm_ctrl.run_mode), //[5114h.02h], Название: Режим работы, ТекстПУ: РежРаб, Группа: Настройки СУ +(long)(&sw.recuperation_ena), //[5114h.03h], Название: Рекуперация, ТекстПУ: Рекупр, Группа: Настройки СУ +(long)(&sw.AutoOffset), //[5114h.04h], Название: АЦП авто смещ., ТекстПУ: АЦПсмещ, Группа: Настройки СУ +(long)(&sw.Reboot), //[5114h.05h], Название: Перезагрузка, ТекстПУ: Перезагрузка, Группа: Настройки СУ +(long)(&sw.excitation_ena), //[5114h.06h], Название: Возбудитель, ТекстПУ: Возб, Группа: Настройки СУ +(long)(&adc.Imeas_a_gain), //[5116h.01h], Название: Коэффициент тока фазы А, ТекстПУ: IaУсил, Группа: АЦП +(long)(&adc.Imeas_a_offset), //[5116h.02h], Название: Смещение тока фазы А, ТекстПУ: IaСмещ, Группа: АЦП +(long)(&adc.Imeas_a), //[5116h.03h], Название: Ток фазы А, ТекстПУ: Ia_мгн, Группа: АЦП +(long)(&adc.Imeas_b_gain), //[5116h.04h], Название: Коэффициент тока фазы В, ТекстПУ: IbУсил, Группа: АЦП +(long)(&adc.Imeas_b_offset), //[5116h.05h], Название: Смещение тока фазы В, ТекстПУ: IbСмещ, Группа: АЦП +(long)(&adc.Imeas_b), //[5116h.06h], Название: Ток фазы В, ТекстПУ: Ib_мгн, Группа: АЦП +(long)(&adc.Imeas_c_gain), //[5116h.07h], Название: Коэффициент тока фазы C, ТекстПУ: IcУсил, Группа: АЦП +(long)(&adc.Imeas_c_offset), //[5116h.08h], Название: Смещение тока фазы C, ТекстПУ: IcСмещ, Группа: АЦП +(long)(&adc.Imeas_c), //[5116h.09h], Название: Ток фазы С, ТекстПУ: Ic_мгн, Группа: АЦП +(long)(&adc.Udc_meas_gain), //[5116h.0Ah], Название: Коэффициент напряжения ЗПТ, ТекстПУ: UdУсил, Группа: АЦП +(long)(&adc.Udc_meas_offset), //[5116h.0Bh], Название: Смещение напряж. ЗПТ, ТекстПУ: Udсмещ, Группа: АЦП +(long)(&adc.Udc_meas), //[5116h.0Ch], Название: Напряжение ЗПТ, ТекстПУ: Ud, Группа: АЦП +(long)(&adc.T_meas_gain), //[5116h.0Dh], Название: Коэффициент температуры, ТекстПУ: t_gain, Группа: АЦП +(long)(&adc.T_meas), //[5116h.0Eh], Название: Температура, ТекстПУ: t, Группа: АЦП +(long)(&vhz.freq), //[511Ah.01h], Название: Выходная частота, ТекстПУ: F_вых, Группа: Кривая U-f +(long)(&vhz.vout), //[511Ah.02h], Название: Выходное напряжение, ТекстПУ: U_вых, Группа: Кривая U-f +(long)(&vhz.FL), //[511Ah.03h], Название: Нулевая опроная частота, ТекстПУ: f [0], Группа: Кривая U-f +(long)(&vhz.Vmin), //[511Ah.04h], Название: Нулевое опорное напряжение, ТекстПУ: U [0], Группа: Кривая U-f +(long)(&vhz.FH), //[511Ah.05h], Название: Первая опорная частота, ТекстПУ: f [1], Группа: Кривая U-f +(long)(&vhz.Vmax), //[511Ah.06h], Название: Первое опорное напряжение, ТекстПУ: U [1], Группа: Кривая U-f +(long)(&vhz.Fmax), //[511Ah.07h], Название: Максимальная частота, ТекстПУ: f max, Группа: Кривая U-f +(long)(&cur_par.speed), //[5138h.01h], Название: Скорость, ТекстПУ: скор, Группа: Наблюдаемые +(long)(&cur_par.power), //[5138h.02h], Название: Акт. мощность, ТекстПУ: АктМощ, Группа: Наблюдаемые +(long)(&cur_par.Is), //[5138h.03h], Название: Ток статора, ТекстПУ: ТокСт, Группа: Наблюдаемые +(long)(&cur_par.ThetaRefCurr), //[5138h.04h], Название: ЭлУголЗад, ТекстПУ: ЭлУголЗад, Группа: Наблюдаемые +(long)(&cur_par.ThetaCurr), //[5138h.05h], Название: ЭлУгол, ТекстПУ: ЭлУгол, Группа: Наблюдаемые +(long)(&cur_par.IsRef), //[5138h.06h], Название: Ток статора зад, ТекстПУ: ТокСтЗад, Группа: Наблюдаемые +(long)(&global_time.PowerOn_time_min), //[5138h.07h], Название: Время запитанного состояния, мин, ТекстПУ: Power On Time, Группа: Наблюдаемые +(long)(&global_time.operational_time_min), //[5138h.08h], Название: Вреря работы привода, мин, ТекстПУ: Work Time, Группа: Наблюдаемые +(long)(&dlog.mode_reset), //[5150h.01h], Название: dlog.mode_reset, ТекстПУ: mode, Группа: dlog +(long)(&dlog.control), //[5150h.02h], Название: dlog.control, ТекстПУ: dlcont, Группа: dlog +(long)(&dlog.ind_subind1), //[5150h.03h], Название: dlog.ind_subind1, ТекстПУ: dlisi1, Группа: dlog +(long)(&dlog.ind_subind2), //[5150h.04h], Название: dlog.ind_subind2, ТекстПУ: dlisi2, Группа: dlog +(long)(&dlog.ind_subind3), //[5150h.05h], Название: dlog.ind_subind3, ТекстПУ: dlisi3, Группа: dlog +(long)(&dlog.ind_subind4), //[5150h.06h], Название: dlog.ind_subind4, ТекстПУ: dlisi4, Группа: dlog +(long)(&dlog.StartBits), //[5150h.07h], Название: StartBitL, ТекстПУ: StrtBL, Группа: dlog, биты с 0 по 7: 0000000011111111b +(long)(&dlog.StartBits), //[5150h.08h], Название: StartBitH, ТекстПУ: StrtBH, Группа: dlog, биты с 8 по 15: 1111111100000000b +(long)(&dlog.OneShotOperation), //[5150h.09h], Название: OneShotOperation, ТекстПУ: OneShotOp, Группа: dlog, биты с 0 по 0: 0000000000000001b +(long)(&dlog.trig_shift), //[5150h.0Ah], Название: Количество точек предыстории, ТекстПУ: N предыст., Группа: dlog +(long)(&dlog.update_sample_rate), //[5150h.0Bh], Название: Частота даталогера, ТекстПУ: dlogFreq, Группа: dlog +(long)(&dlog.next_value_var), //[5151h.00h], Название: dlog.next_value_var, ТекстПУ: dlnval, Группа: ВНЕ ГРУПП +(long)(&posspeedEqep.resol), //[5152h.01h], Название: Кол-во периодов, ТекстПУ: Кол-во периодов, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Posspeed_CTL.all), //[5152h.02h], Название: Наличие репера, ТекстПУ: Наличие репера, Группа: ДПР-Энкодер, биты с 2 по 2: 0000000000000100b +(long)(&posspeedEqep.SpeedCalcType), //[5152h.03h], Название: Рассчитывать скорость программно, ТекстПУ: SpeedCalcType, Группа: ДПР-Энкодер +(long)(&posspeedEqep.AngleOffset), //[5152h.04h], Название: СмещУгол, ТекстПУ: СмещУг, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_res), //[5152h.05h], Название: Механическ.угол в метках, ТекстПУ: Механическ.угол в ме, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_res16), //[5152h.06h], Название: Механическ.угол в метках, ТекстПУ: Механическ.угол в ме, Группа: ДПР-Энкодер +(long)(&posspeedEqep.speed_elec), //[5152h.07h], Название: Скорость , ТекстПУ: Скорость, Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_elec), //[5152h.08h], Название: Угол. электр., ТекстПУ: Угол. электр., Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_mech), //[5152h.09h], Название: Угол мех., ТекстПУ: Угол мех., Группа: ДПР-Энкодер +(long)(&posspeedEqep.Posspeed_CTL.all), //[5152h.0Ah], Название: Команда иниц., ТекстПУ: Команда иниц., Группа: ДПР-Энкодер, биты с 4 по 4: 0000000000010000b +(long)(&posspeedEqep.speed_filter.T), //[5152h.0Bh], Название: К быстродействия фильтра скорости, ТекстПУ: Кф. скорости, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Posspeed_FLG1.all), //[5152h.0Ch], Название: Posspeed_FLG1, ТекстПУ: Posspeed_FLG1, Группа: ДПР-Энкодер +(long)(&posspeedEqep.GPIOsValue), //[5152h.0Dh], Название: GPIOsValue, ТекстПУ: GPIOsValue, Группа: ДПР-Энкодер +(long)(&posspeedEqep.UPPS_forWatch), //[5152h.0Eh], Название: UPPS, ТекстПУ: UPPS, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Qcprdlat_tmp), //[5152h.0Fh], Название: QCPRD, ТекстПУ: QCPRD, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Qcprdlat16_tmp), //[5152h.10h], Название: QCPRD, ТекстПУ: QCPRD, Группа: ДПР-Энкодер +(long)(&posspeedEqep.QEPSTS), //[5152h.11h], Название: QEPSTS, ТекстПУ: QEPSTS, Группа: ДПР-Энкодер +(long)(&posspeedEqep.RevolutionCounter), //[5152h.12h], Название: Число оборотов, ТекстПУ: revolCounter, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_resContinouosInt8), //[5152h.13h], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_resContinouosInt), //[5152h.14h], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-Энкодер +(long)(&posspeedEqep.Poscnt_resContinouosLong), //[5152h.15h], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_mechContinouos), //[5152h.16h], Название: Угол механический не огранич., ТекстПУ: Уг.мех.не_огр, Группа: ДПР-Энкодер +(long)(&posspeedEqep.theta_elecContinouos), //[5152h.17h], Название: Угол электрический не огранич., ТекстПУ: Уг.эл.не_огр, Группа: ДПР-Энкодер +(long)(&DPReCAP.Angle), //[5155h.01h], Название: ЭлУгол, ТекстПУ: ЭлУгол, Группа: ДПР-Холл +(long)(&DPReCAP.speed), //[5155h.02h], Название: Скорость , ТекстПУ: Скорость, Группа: ДПР-Холл +(long)(&DPReCAP.speedMIN), //[5155h.03h], Название: Уставка Скорости, ТекстПУ: Уставка Скорости, Группа: ДПР-Холл +(long)(&DPReCAP.Angle6), //[5155h.04h], Название: ЭлУгол6, ТекстПУ: ЭлУгол6, Группа: ДПР-Холл +(long)(&DPReCAP.DPReCAP_FLG1.all), //[5155h.05h], Название: Инт-полятор вкл, ТекстПУ: Инт-полятор вкл, Группа: ДПР-Холл, биты с 0 по 0: 0000000000000001b +(long)(&DPReCAP.milsecREF), //[5155h.06h], Название: Уставка обнуления скорости, ТекстПУ: Уставка обнуления ск, Группа: ДПР-Холл +(long)(&DPReCAP.speedMinREF), //[5155h.07h], Название: Скорость Мин., ТекстПУ: Скорость Мин., Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt), //[5155h.08h], Название: Ложные фронты, ТекстПУ: Ложные фронты, Группа: ДПР-Холл +(long)(&DPReCAP.HallCode), //[5155h.09h], Название: Дискретные входы, ТекстПУ: Входы, Группа: ДПР-Холл, биты с 0 по 2: 0000000000000111b +(long)(&DPReCAP.AngleOffset), //[5155h.0Ah], Название: СмещУгол, ТекстПУ: СмещУг, Группа: ДПР-Холл +(long)(&DPReCAP.ErrorLevel), //[5155h.0Bh], Название: Уровень помех, ТекстПУ: Уровень помех, Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt1), //[5155h.0Ch], Название: Ошибка 1 канала, ТекстПУ: Ошиб_1_к., Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt2), //[5155h.0Dh], Название: Ошибка 2 канала, ТекстПУ: Ошиб_2_к., Группа: ДПР-Холл +(long)(&DPReCAP.CAP_WrongEdgeCnt3), //[5155h.0Eh], Название: Ошибка 3 канала, ТекстПУ: Ошиб_3_к., Группа: ДПР-Холл +(long)(&DPReCAP.UserDirection), //[5155h.0Fh], Название: Направление вращения, ТекстПУ: НапрВр, Группа: ДПР-Холл, биты с 2 по 2: 0000000000000100b +(long)(&DPReCAP.WrongCodeCounterLimitPerSec), //[5155h.10h], Название: Макс.число ошибок ДПР, ТекстПУ: Макс.ош.ДПР, Группа: ДПР-Холл +(long)(&DPReCAP.WrongCodeCounter), //[5155h.11h], Название: Кол-во ошибок неверной последовательности , ТекстПУ: Ошибки последоват., Группа: ДПР-Холл +(long)(&CounterCAP_isr), //[5155h.12h], Название: Счётчик прерываний по приему, ТекстПУ: Счёт.Rx.Int., Группа: ДПР-Холл +(long)(&cap0_counter), //[5155h.13h], Название: Счётчик прерываний CAP1, ТекстПУ: Сч.прерыв.CAP1, Группа: ДПР-Холл +(long)(&cap1_counter), //[5155h.14h], Название: Счётчик прерываний CAP2, ТекстПУ: Сч.прерыв.CAP2, Группа: ДПР-Холл +(long)(&cap2_counter), //[5155h.15h], Название: Счётчик прерываний CAP3, ТекстПУ: Сч.прерыв.CAP3, Группа: ДПР-Холл +(long)(&SSI_Encoder.resol), //[5157h.01h], Название: Количество импульсов на оборот, ТекстПУ: qepTik, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.AngleOffset), //[5157h.02h], Название: СмещУгол, ТекстПУ: СмещУг, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_res), //[5157h.03h], Название: Механическ.угол в метках, ТекстПУ: Механическ.угол в ме, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.speed_elec), //[5157h.04h], Название: Скорость , ТекстПУ: Скорость, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_elec), //[5157h.05h], Название: Угол. электр., ТекстПУ: Угол. электр., Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mech), //[5157h.06h], Название: Угол мех., ТекстПУ: Угол мех., Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mech_filtered), //[5157h.07h], Название: Угол мех. фильтрованный, ТекстПУ: theta_mech_filtered, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mech_filterK), //[5157h.08h], Название: К быстродействия фильтра угла, ТекстПУ: Кф. угла, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.RevolutionCounter), //[5157h.09h], Название: Число оборотов, ТекстПУ: revolCounter, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_resContinouosLong), //[5157h.0Ah], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_resContinouosInt8), //[5157h.0Bh], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.Poscnt_resContinouosInt), //[5157h.0Ch], Название: Абс. положение в метках, ТекстПУ: qcAbsPos, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_mechContinouos), //[5157h.0Dh], Название: Угол механический не огранич., ТекстПУ: Уг.мех.не_огр, Группа: ДПР-SSI энкодер +(long)(&SSI_Encoder.theta_elecContinouos), //[5157h.0Eh], Название: Угол электрический не огранич., ТекстПУ: Уг.эл.не_огр, Группа: ДПР-SSI энкодер +(long)(&Debug1), //[5174h.01h], Название: DebugL1, ТекстПУ: DebugL1, Группа: Для отладки +(long)(&Debug1), //[5174h.02h], Название: DebugL1, ТекстПУ: DebugL1, Группа: Для отладки +(long)(&Debug2), //[5174h.03h], Название: DebugL2, ТекстПУ: DebugL2, Группа: Для отладки +(long)(&Debug2), //[5174h.04h], Название: DebugL2, ТекстПУ: DebugL2, Группа: Для отладки +(long)(&Debug3), //[5174h.05h], Название: DebugI3, ТекстПУ: DebugI3, Группа: Для отладки +(long)(&Debug3), //[5174h.06h], Название: DebugI3, ТекстПУ: DebugI3, Группа: Для отладки +(long)(&Debug4), //[5174h.07h], Название: DebugI4, ТекстПУ: DebugI4, Группа: Для отладки +(long)(&Debug4), //[5174h.08h], Название: DebugI4, ТекстПУ: DebugI4, Группа: Для отладки +(long)(&DebugW1), //[5174h.09h], Название: DebugW1, ТекстПУ: DebugW1, Группа: Для отладки +(long)(&DebugW1), //[5174h.0Ah], Название: DebugW1, ТекстПУ: DebugW1, Группа: Для отладки +(long)(&DebugW2), //[5174h.0Bh], Название: DebugW2, ТекстПУ: DebugW2, Группа: Для отладки +(long)(&DebugW2), //[5174h.0Ch], Название: DebugW2, ТекстПУ: DebugW2, Группа: Для отладки +(long)(&DebugW3), //[5174h.0Dh], Название: DebugW3, ТекстПУ: DebugW3, Группа: Для отладки +(long)(&DebugW3), //[5174h.0Eh], Название: DebugW3, ТекстПУ: DebugW3, Группа: Для отладки +(long)(&DebugW4), //[5174h.0Fh], Название: DebugW4, ТекстПУ: DebugW4, Группа: Для отладки +(long)(&DebugW4), //[5174h.10h], Название: DebugW4, ТекстПУ: DebugW4, Группа: Для отладки +(long)(&DebugF1), //[5174h.11h], Название: DebugF1, ТекстПУ: DebugF1, Группа: Для отладки +(long)(&DebugF2), //[5174h.12h], Название: DebugF2, ТекстПУ: DebugF2, Группа: Для отладки +(long)(&DebugF3), //[5174h.13h], Название: DebugF3, ТекстПУ: DebugF3, Группа: Для отладки +(long)(&DebugF4), //[5174h.14h], Название: DebugF4, ТекстПУ: DebugF4, Группа: Для отладки +(long)(&UserMem.MemStartAddr), //[5174h.15h], Название: Адрес в EEPROM, ТекстПУ: (null), Группа: Для отладки +(long)(&model.MotorType), //[5181h.01h], Название: Тип двигателя модели, ТекстПУ: ModelMotorType, Группа: Модель общие данные, биты с 0 по 7: 0000000011111111b +(long)(&model.MotorParametersNum), //[5181h.02h], Название: Параметры двигателя, ТекстПУ: ПарДв, Группа: Модель общие данные +(long)(&model.load), //[5181h.03h], Название: Симулируемый момент нагрузки, ТекстПУ: Мнагр сим., Группа: Модель общие данные +(long)(&model.motorInternals.udc), //[5181h.04h], Название: Напряжение ЗПТ, ТекстПУ: Ud, Группа: Модель общие данные +(long)(&model.motorInternals.torque), //[5181h.05h], Название: Реализованный электрический момент, ТекстПУ: Реал.Эл.Мом, Группа: Модель общие данные +(long)(&model.motorInternals.omega), //[5181h.06h], Название: Скорость, ТекстПУ: qepspd, Группа: Модель общие данные +(long)(&model.motorInternals.omega_rpm), //[5181h.07h], Название: Скорость, ТекстПУ: qepspd, Группа: Модель общие данные +(long)(&model.motorInternals.tetaRM), //[5181h.08h], Название: Механический угол, ТекстПУ: qeptm, Группа: Модель общие данные +(long)(&model.qepCounter), //[5181h.09h], Название: EncoderIncrements, ТекстПУ: EncoderIncrements, Группа: Модель общие данные +(long)(&model.motorInternals.isa), //[5181h.0Ah], Название: Ток статора по оси Alpha, ТекстПУ: IsAlpha, Группа: Модель общие данные +(long)(&model.motorInternals.isb), //[5181h.0Bh], Название: Ток статора по оси Beta, ТекстПУ: IsBeta, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseA), //[5181h.0Ch], Название: Ток фазы А, ТекстПУ: Ia, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseB), //[5181h.0Dh], Название: Ток фазы В, ТекстПУ: Ib_мгн, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseC), //[5181h.0Eh], Название: Ток фазы C, ТекстПУ: Ic, Группа: Модель общие данные +(long)(&model.motorInternals.isPhaseD), //[5181h.0Fh], Название: Ток фазы D, ТекстПУ: Id, Группа: Модель общие данные +(long)(&model.motorInternals.ua), //[5181h.10h], Название: Напряжение фазы A, ТекстПУ: Ua, Группа: Модель общие данные +(long)(&model.motorInternals.ub), //[5181h.11h], Название: Напряжение фазы B, ТекстПУ: Ub, Группа: Модель общие данные +(long)(&model.motorInternals.uc), //[5181h.12h], Название: Напряжение фазы C, ТекстПУ: Uc, Группа: Модель общие данные +(long)(&model.motorInternals.power), //[5181h.13h], Название: Мощность, ТекстПУ: Мощ-ть, Группа: Модель общие данные +(long)(&model.fault), //[5181h.14h], Название: Код аварии, ТекстПУ: КодАвр, Группа: Модель общие данные +(long)(&model.motorInternals.lm), //[5182h.01h], Название: Взаимная индуктивность Lm, ТекстПУ: Lm, Группа: Модель (асинхронный) +(long)(&model.motorInternals.ls), //[5182h.02h], Название: Индуктивность статора Ls, ТекстПУ: Ls, Группа: Модель (асинхронный) +(long)(&model.motorInternals.lr), //[5182h.03h], Название: Индуктивность ротора Lr, ТекстПУ: Lr, Группа: Модель (асинхронный) +(long)(&model.motorInternals.rs), //[5182h.04h], Название: Сопротивление статора Rs, ТекстПУ: Rs, Группа: Модель (асинхронный) +(long)(&model.motorInternals.rr), //[5182h.05h], Название: Сопротивление ротора Rr, ТекстПУ: Rr, Группа: Модель (асинхронный) +(long)(&model.motorInternals.pp), //[5182h.06h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Модель (асинхронный) +(long)(&model.motorInternals.j), //[5182h.07h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (асинхронный) +(long)(&model.motorInternals.MechLoss), //[5182h.08h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (асинхронный) +(long)(&model.motorInternals.QEPResolution), //[5182h.09h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (асинхронный) +(long)(&model.motorInternals.RatedCurrent), //[5182h.0Ah], Название: Номинальный действующий ток, ТекстПУ: RatedCurrent, Группа: Модель (асинхронный) +(long)(&model.motorInternals.RatedPower), //[5182h.0Bh], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (асинхронный) +(long)(&model.motorInternals.RatedSpeed), //[5182h.0Ch], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (асинхронный) +(long)(&model.motorInternals.iADCk), //[5182h.0Dh], Название: Коэффициент АЦП тока фаз, ТекстПУ: Коэф. АЦП тока, Группа: Модель (асинхронный) +(long)(&model.motorInternals.isa), //[5182h.0Eh], Название: Ток статора по оси Alpha, ТекстПУ: IsAlpha, Группа: Модель (асинхронный) +(long)(&model.motorInternals.isb), //[5182h.0Fh], Название: Ток статора по оси Beta, ТекстПУ: IsBeta, Группа: Модель (асинхронный) +(long)(&model.motorInternals.prd), //[5182h.10h], Название: Поток ротора по оси D, ТекстПУ: PsiRD, Группа: Модель (асинхронный) +(long)(&model.motorInternals.prq), //[5182h.11h], Название: Поток ротора по оси Q, ТекстПУ: PsiRQ, Группа: Модель (асинхронный) +(long)(&model.motorInternals.pra), //[5182h.12h], Название: Поток ротора по оси Alpha, ТекстПУ: PsiRAlfa, Группа: Модель (асинхронный) +(long)(&model.motorInternals.prb), //[5182h.13h], Название: Поток ротора по оси Beta, ТекстПУ: PsiRBeta, Группа: Модель (асинхронный) +(long)(&model.motorInternals.m), //[5183h.01h], Название: Потокосцепление магнитов, ТекстПУ: m, Группа: Модель (синхронный) +(long)(&model.motorInternals.lsd), //[5183h.02h], Название: Индуктивность статора Lsd, ТекстПУ: Lsd, Группа: Модель (синхронный) +(long)(&model.motorInternals.lsq), //[5183h.03h], Название: Индуктивность статора Lsq, ТекстПУ: Lsq, Группа: Модель (синхронный) +(long)(&model.motorInternals.rs), //[5183h.04h], Название: Сопротивление статора Rs, ТекстПУ: Rs, Группа: Модель (синхронный) +(long)(&model.motorInternals.pp), //[5183h.05h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Модель (синхронный) +(long)(&model.motorInternals.j), //[5183h.06h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (синхронный) +(long)(&model.motorInternals.MechLoss), //[5183h.07h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (синхронный) +(long)(&model.motorInternals.QEPResolution), //[5183h.08h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (синхронный) +(long)(&model.motorInternals.iADCk), //[5183h.09h], Название: Коэффициент АЦП тока фаз, ТекстПУ: Коэф. АЦП тока, Группа: Модель (синхронный) +(long)(&model.motorInternals.ifADCk), //[5183h.0Ah], Название: Коэффициент АЦП тока ОВ, ТекстПУ: Коэф. АЦП ток ОВ, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedCurrent), //[5183h.0Bh], Название: Номинальный действующий ток, ТекстПУ: RatedCurrent, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedPower), //[5183h.0Ch], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedSpeed), //[5183h.0Dh], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (синхронный) +(long)(&model.motorInternals.RatedFluxCurrent), //[5183h.0Eh], Название: Номинальный ток ОВ, ТекстПУ: RatedFluxCurrent, Группа: Модель (синхронный) +(long)(&model.motorInternals.u_f), //[5183h.0Fh], Название: Разность потенциалов ОВ, ТекстПУ: Uf, Группа: Модель (синхронный) +(long)(&model.motorInternals.i_f), //[5183h.10h], Название: Ток ОВ, ТекстПУ: Ток ОВ, Группа: Модель (синхронный) +(long)(&model.motorInternals.m), //[5183h.11h], Название: Поток возбуждения, ТекстПУ: Psi возб, Группа: Модель (синхронный) +(long)(&model.motorInternals.l_a), //[5184h.01h], Название: Индуктивность якоря, ТекстПУ: La, Группа: Модель (ДПТ) +(long)(&model.motorInternals.l_f), //[5184h.02h], Название: Индуктивность ОВ, ТекстПУ: Lf, Группа: Модель (ДПТ) +(long)(&model.motorInternals.r_a), //[5184h.03h], Название: Сопротивление якоря, ТекстПУ: Ra, Группа: Модель (ДПТ) +(long)(&model.motorInternals.r_f), //[5184h.04h], Название: Сопротивление ОВ, ТекстПУ: Rf, Группа: Модель (ДПТ) +(long)(&model.motorInternals.j), //[5184h.05h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (ДПТ) +(long)(&model.motorInternals.MechLoss), //[5184h.06h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (ДПТ) +(long)(&model.motorInternals.QEPResolution), //[5184h.07h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedCurrent), //[5184h.08h], Название: Номинальный ток якоря, ТекстПУ: RatedCurrent, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedFluxCurrent), //[5184h.09h], Название: Номинальный ток ОВ, ТекстПУ: RatedFluxCurrent, Группа: Модель (ДПТ) +(long)(&model.motorInternals.iADCk), //[5184h.0Ah], Название: Коэффициент АЦП тока ОЯ, ТекстПУ: Коэф. АЦП ток ОЯ, Группа: Модель (ДПТ) +(long)(&model.motorInternals.ifADCk), //[5184h.0Bh], Название: Коэффициент АЦП тока ОВ, ТекстПУ: Коэф. АЦП ток ОВ, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedPower), //[5184h.0Ch], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (ДПТ) +(long)(&model.motorInternals.RatedSpeed), //[5184h.0Dh], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (ДПТ) +(long)(&model.motorInternals.r_ad), //[5184h.0Eh], Название: Добавочное сопротивление, Rad, ТекстПУ: Доб.сопротив., Группа: Модель (ДПТ) +(long)(&model.motorInternals.u_a), //[5184h.0Fh], Название: Разность потенциалов ОЯ, ТекстПУ: Ua, Группа: Модель (ДПТ) +(long)(&model.motorInternals.u_f), //[5184h.10h], Название: Разность потенциалов ОВ, ТекстПУ: Uf, Группа: Модель (ДПТ) +(long)(&model.motorInternals.i_a), //[5184h.11h], Название: Ток ОЯ, ТекстПУ: Ia, Группа: Модель (ДПТ) +(long)(&model.motorInternals.i_f), //[5184h.12h], Название: Ток ОВ, ТекстПУ: Ток ОВ, Группа: Модель (ДПТ) +(long)(&refs.DCMspeed_ref), //[5185h.01h], Название: Задание скорости (Подч. Рег.), ТекстПУ: Зад. Скор., Группа: ДПТ Сист. Упр. +(long)(&refs.ua_ref), //[5185h.02h], Название: Заданное напряжение якоря, ТекстПУ: Ua_ref, Группа: ДПТ Сист. Упр. +(long)(&refs.uf_ref), //[5185h.03h], Название: Заданное напряжение ОВ, ТекстПУ: Uf_ref, Группа: ДПТ Сист. Упр. +(long)(&model.motorInternals.j), //[5186h.01h], Название: Симулируемый момент инерции, ТекстПУ: Инерция сим., Группа: Модель (ВИД) +(long)(&model.motorInternals.MechLoss), //[5186h.02h], Название: Тормозной момент для выбега, ТекстПУ: Торм.Мом.Выбег, Группа: Модель (ВИД) +(long)(&model.motorInternals.rs), //[5186h.03h], Название: Сопротивление статора Rs, ТекстПУ: Rs, Группа: Модель (ВИД) +(long)(&model.motorInternals.pp), //[5186h.04h], Название: Число пар полюсов, ТекстПУ: ПарПол, Группа: Модель (ВИД) +(long)(&model.motorInternals.QEPResolution), //[5186h.05h], Название: Число периодов квадратурного датчика, ТекстПУ: QEPResolution, Группа: Модель (ВИД) +(long)(&model.motorInternals.iADCk), //[5186h.06h], Название: Коэффициент АЦП тока фаз, ТекстПУ: Коэф. АЦП тока, Группа: Модель (ВИД) +(long)(&model.motorInternals.RatedCurrent), //[5186h.07h], Название: Номинальный действующий ток, ТекстПУ: RatedCurrent, Группа: Модель (ВИД) +(long)(&model.motorInternals.RatedPower), //[5186h.08h], Название: Номинальная мощность, ТекстПУ: RatedPower, Группа: Модель (ВИД) +(long)(&model.motorInternals.RatedSpeed), //[5186h.09h], Название: Номинальная скорость, ТекстПУ: СкоростьНом, Группа: Модель (ВИД) +(long)(&model.motorInternals.psa), //[5186h.0Ah], Название: Поток статора фазы A, ТекстПУ: Поток A, Группа: Модель (ВИД) +(long)(&model.motorInternals.psb), //[5186h.0Bh], Название: Поток статора фазы B, ТекстПУ: Поток B, Группа: Модель (ВИД) +(long)(&model.motorInternals.psc), //[5186h.0Ch], Название: Поток статора фазы C, ТекстПУ: Поток C, Группа: Модель (ВИД) +(long)(&model.motorInternals.torque_a), //[5186h.0Dh], Название: Момент фазы A, ТекстПУ: Момент A, Группа: Модель (ВИД) +(long)(&model.motorInternals.torque_b), //[5186h.0Eh], Название: Момент фазы B, ТекстПУ: Момент B, Группа: Модель (ВИД) +(long)(&model.motorInternals.torque_c), //[5186h.0Fh], Название: Момент фазы C, ТекстПУ: Момент C, Группа: Модель (ВИД) +(long)(&RotorObserver.Tr), //[5B04h.01h], Название: Пост. времени ротора, ТекстПУ: Tr, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.FluxCurrentRatio), //[5B04h.02h], Название: Соотношение тока возб. X к току Y, ТекстПУ: FluxCurrentRatio, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.FluxCurrentMin), //[5B04h.03h], Название: Минимальный ток возбуждения, ТекстПУ: FluxCurrentMin, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.id), //[5B04h.04h], Название: Ток статора по оси D, ТекстПУ: IsD, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.iq), //[5B04h.05h], Название: Ток статора по оси Q, ТекстПУ: IsQ, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.psi_d), //[5B04h.06h], Название: Поток ротора по оси D, ТекстПУ: PsiRD, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.psi_q), //[5B04h.07h], Название: Поток ротора по оси Q, ТекстПУ: PsiRQ, Группа: Наблюдатель ротора АД +(long)(&RotorObserver.theta_psi_elec), //[5B04h.08h], Название: Угол потока ротора, ТекстПУ: psiRalpha, Группа: Наблюдатель ротора АД +(long)(&udControl.StateOn), //[5B05h.01h], Название: Текущее состояние реле, ТекстПУ: Relay_state, Группа: Плавный заряд ЗПТ +(long)(&udControl.Timeout_on), //[5B05h.02h], Название: Задежка включения реле, мс, ТекстПУ: relay on-delay, Группа: Плавный заряд ЗПТ +(long)(&udControl.U_on), //[5B05h.03h], Название: Напряжение включения, В, ТекстПУ: on-voltage, Группа: Плавный заряд ЗПТ +(long)(&udControl.U_off), //[5B05h.04h], Название: Напряжение выключения, В, ТекстПУ: off-voltage, Группа: Плавный заряд ЗПТ +(long)(&udControl.deriv_time_ZPT), //[5B05h.05h], Название: Производная напряжения ЗПТ, ТекстПУ: derivative_voltage, Группа: Плавный заряд ЗПТ +(long)(&udControl.deriv_const), //[5B05h.06h], Название: Уставка по производной ЗПТ, ТекстПУ: derivative_const, Группа: Плавный заряд ЗПТ +(long)(&FanControl.StateOn), //[5B06h.01h], Название: Текущее состояние вентилятора, ТекстПУ: fan_state, Группа: Система охлаждения +(long)(&FanControl.T_on), //[5B06h.02h], Название: Температура включения вентилятора, ТекстПУ: t_on, Группа: Система охлаждения +(long)(&FanControl.T_off), //[5B06h.03h], Название: Температура выключения вентилятора, ТекстПУ: t_off, Группа: Система охлаждения +(long)(&FanControl.T_alarm), //[5B06h.04h], Название: Температура вывода предупреждения о перегреве, ТекстПУ: t_alarm, Группа: Система охлаждения +}; +Uint16 const CO2_OD_TBL2[] = { +32045, 1, 0, +31021, 2, 1, +32041, 3, 2, +32013, 4, 3, + +28814, +5, +3, +64769, 5, 4, +(Uint16)(2000), (((Uint32)2000)>>16), +64257, 6, 5, +(Uint16)(1000), + +28801, +7, +1, +32013, 8, 6, +32013, 9, 7, +32013, 10, 8, +32013, 11, 9, + +19631, +12, +1, +31021, 13, 10, +31021, 14, 11, + +19632, +15, +1, +30765, 16, 12, +30765, 17, 13, +29741, 18, 14, + +18607, +19, +3, +64813, 20, 15, +(Uint16)(0x180), (((Uint32)0x180)>>16), +28973, 21, 16, +0, +0, + +18607, +22, +3, +64813, 23, 17, +(Uint16)(0x280), (((Uint32)0x280)>>16), +28973, 21, 18, +0, +0, + +18607, +24, +3, +64809, 25, 19, +(Uint16)(0x0401), (((Uint32)0x0401)>>16), +28969, 21, 20, +0, +0, + +18607, +26, +3, +64809, 27, 21, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28969, 21, 22, +0, +0, + +18607, +28, +3, +64813, 29, 23, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28973, 21, 24, +0, +0, + +18607, +30, +3, +64813, 31, 25, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28973, 21, 26, +0, +0, + +18607, +32, +3, +64801, 33, 27, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28961, 21, 28, +0, +0, + +18607, +34, +3, +64801, 35, 29, +(Uint16)(0x0501), (((Uint32)0x0501)>>16), +28961, 21, 30, +0, +0, + +19633, +36, +3, +61741, 37, 31, +(Uint16)(0), (((Uint32)0)>>16), +61741, 38, 32, +(Uint16)(0), (((Uint32)0)>>16), +61741, 39, 33, +(Uint16)(0), (((Uint32)0)>>16), +61741, 40, 34, +(Uint16)(0), (((Uint32)0)>>16), + +19633, +41, +3, +61741, 42, 35, +(Uint16)(0), (((Uint32)0)>>16), +61741, 43, 36, +(Uint16)(0), (((Uint32)0)>>16), +61741, 44, 37, +(Uint16)(0), (((Uint32)0)>>16), +61741, 45, 38, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +46, +3, +61737, 47, 39, +(Uint16)(0), (((Uint32)0)>>16), +61737, 48, 40, +(Uint16)(0), (((Uint32)0)>>16), +61737, 49, 41, +(Uint16)(0), (((Uint32)0)>>16), +61737, 50, 42, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +51, +3, +61737, 52, 43, +(Uint16)(0), (((Uint32)0)>>16), +61737, 53, 44, +(Uint16)(0), (((Uint32)0)>>16), +61737, 54, 45, +(Uint16)(0), (((Uint32)0)>>16), +61737, 55, 46, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +56, +3, +61741, 57, 47, +(Uint16)(0), (((Uint32)0)>>16), +61741, 58, 48, +(Uint16)(0), (((Uint32)0)>>16), +61741, 59, 49, +(Uint16)(0), (((Uint32)0)>>16), +61741, 60, 50, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +61, +3, +61741, 62, 51, +(Uint16)(0), (((Uint32)0)>>16), +61741, 63, 52, +(Uint16)(0), (((Uint32)0)>>16), +61741, 64, 53, +(Uint16)(0), (((Uint32)0)>>16), +61741, 65, 54, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +66, +3, +61729, 67, 55, +(Uint16)(0), (((Uint32)0)>>16), +61729, 68, 56, +(Uint16)(0), (((Uint32)0)>>16), +61729, 69, 57, +(Uint16)(0), (((Uint32)0)>>16), +61729, 70, 58, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +71, +3, +61729, 72, 59, +(Uint16)(0), (((Uint32)0)>>16), +61729, 73, 60, +(Uint16)(0), (((Uint32)0)>>16), +61729, 74, 61, +(Uint16)(0), (((Uint32)0)>>16), +61729, 75, 62, +(Uint16)(0), (((Uint32)0)>>16), + +16562, +76, +2, +32045, 77, 63, +0, +31021, 21, 64, +0, +64301, 78, 65, +(Uint16)(100), +47405, 79, 66, +(Uint16)(0), +64301, 80, 67, +(Uint16)(100), + +16560, +81, +2, +32045, 82, 68, +0, +31021, 21, 69, +0, +64301, 83, 70, +(Uint16)(100), +47405, 79, 71, +(Uint16)(0), +64301, 84, 72, +(Uint16)(1000), + +16562, +85, +2, +32041, 86, 73, +0, +31017, 21, 74, +0, +64297, 87, 75, +(Uint16)(100), +47401, 79, 76, +(Uint16)(0), +64297, 88, 77, +(Uint16)(1000), + +16556, +89, +2, +32041, 90, 78, +0, +31017, 21, 79, +0, +64297, 91, 80, +(Uint16)(100), +47401, 79, 81, +(Uint16)(0), +64297, 92, 82, +(Uint16)(1000), + +16554, +93, +2, +32045, 94, 83, +0, +31021, 21, 84, +0, +64301, 95, 85, +(Uint16)(100), +47405, 79, 86, +(Uint16)(0), +64301, 96, 87, +(Uint16)(1000), + +16552, +97, +2, +32045, 98, 88, +0, +31021, 21, 89, +0, +64301, 99, 90, +(Uint16)(100), +47405, 79, 91, +(Uint16)(0), +64301, 100, 92, +(Uint16)(1000), + +16554, +101, +2, +32033, 102, 93, +0, +31009, 21, 94, +0, +64289, 103, 95, +(Uint16)(100), +47393, 79, 96, +(Uint16)(0), +64289, 104, 97, +(Uint16)(1000), + +16556, +105, +2, +32033, 106, 98, +0, +31009, 21, 99, +0, +64289, 107, 100, +(Uint16)(100), +47393, 79, 101, +(Uint16)(0), +64289, 108, 102, +(Uint16)(1000), + +19633, +109, +3, +63789, 110, 103, +(Uint16)(0), (((Uint32)0)>>16), +63789, 111, 104, +(Uint16)(0), (((Uint32)0)>>16), +63789, 112, 105, +(Uint16)(0), (((Uint32)0)>>16), +63789, 113, 106, +(Uint16)(0), (((Uint32)0)>>16), + +19633, +114, +3, +63789, 115, 107, +(Uint16)(0), (((Uint32)0)>>16), +63789, 116, 108, +(Uint16)(0), (((Uint32)0)>>16), +63789, 117, 109, +(Uint16)(0), (((Uint32)0)>>16), +63789, 118, 110, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +119, +3, +63785, 120, 111, +(Uint16)(0), (((Uint32)0)>>16), +63785, 121, 112, +(Uint16)(0), (((Uint32)0)>>16), +63785, 122, 113, +(Uint16)(0), (((Uint32)0)>>16), +63785, 123, 114, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +124, +3, +63785, 125, 115, +(Uint16)(0), (((Uint32)0)>>16), +63785, 126, 116, +(Uint16)(0), (((Uint32)0)>>16), +63785, 127, 117, +(Uint16)(0), (((Uint32)0)>>16), +63785, 128, 118, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +129, +3, +63789, 130, 119, +(Uint16)(0), (((Uint32)0)>>16), +63789, 131, 120, +(Uint16)(0), (((Uint32)0)>>16), +63789, 132, 121, +(Uint16)(0), (((Uint32)0)>>16), +63789, 133, 122, +(Uint16)(0), (((Uint32)0)>>16), + +19625, +134, +3, +63789, 135, 123, +(Uint16)(0), (((Uint32)0)>>16), +63789, 136, 124, +(Uint16)(0), (((Uint32)0)>>16), +63789, 137, 125, +(Uint16)(0), (((Uint32)0)>>16), +63789, 138, 126, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +139, +3, +63777, 140, 127, +(Uint16)(0), (((Uint32)0)>>16), +63777, 141, 128, +(Uint16)(0), (((Uint32)0)>>16), +63777, 142, 129, +(Uint16)(0), (((Uint32)0)>>16), +63777, 143, 130, +(Uint16)(0), (((Uint32)0)>>16), + +19629, +144, +3, +63777, 145, 131, +(Uint16)(0), (((Uint32)0)>>16), +63777, 146, 132, +(Uint16)(0), (((Uint32)0)>>16), +63777, 147, 133, +(Uint16)(0), (((Uint32)0)>>16), +63777, 148, 134, +(Uint16)(0), (((Uint32)0)>>16), +64173, 149, 135, +(Uint16)(1), +(Uint16)(1), (Uint16)(127), +53469, 150, 136, +(Uint16)(3), + +28845, +7, +1, +32041, 8, 137, +32041, 9, 138, +32041, 10, 139, +32041, 11, 140, + +28845, +151, +1, +31529, 152, 141, +31529, 153, 142, +31529, 154, 143, +31529, 155, 144, +64813, 156, 145, +(Uint16)(0), (((Uint32)0)>>16), +20669, 157, 146, + +28845, +158, +1, +32033, 159, 147, +32033, 160, 148, +32033, 161, 149, +32033, 162, 150, + +28849, +163, +1, +32013, 164, 151, +32013, 165, 152, +32013, 166, 153, +32013, 167, 154, + +28849, +168, +3, +64781, 169, 155, +(Uint16)(0), (((Uint32)0)>>16), +64781, 170, 156, +(Uint16)(0), (((Uint32)0)>>16), +64781, 171, 157, +(Uint16)(0), (((Uint32)0)>>16), +64781, 172, 158, +(Uint16)(0), (((Uint32)0)>>16), +53433, 173, 159, +(Uint16)(1), +53437, 174, 160, +(Uint16)(1), +30989, 175, 161, +31489, 176, 162, +32001, 177, 163, + +28859, +178, +2, +47661, 179, 164, +(Uint16)(0), +47661, 180, 165, +(Uint16)(0x2000), +47661, 181, 166, +(Uint16)(0), +31277, 182, 167, +0, +31277, 183, 168, +0, +31277, 184, 169, +0, +31277, 185, 170, +0, +31277, 186, 171, +0, +31277, 187, 172, +0, +31277, 188, 173, +0, +31277, 189, 174, +0, +31277, 190, 175, +0, +31277, 190, 176, +0, +31277, 191, 177, +0, +31277, 192, 178, + +28847, +193, +3, +48169, 194, 179, +(Uint16)(0x30000000), (((Uint32)0x30000000)>>16), +48169, 195, 180, +(Uint16)(0x30000000), (((Uint32)0x30000000)>>16), + +28857, +196, +2, +36905, 197, 181, +(Uint16)(0), +36913, 198, 182, +(Uint16)(0), +36905, 199, 183, +(Uint16)(0), +36913, 200, 184, +(Uint16)(0), +36905, 201, 185, +(Uint16)(0), +36913, 202, 186, +(Uint16)(0), +36905, 203, 187, +(Uint16)(0), +36913, 204, 188, +(Uint16)(0), +36905, 205, 189, +(Uint16)(0), +36913, 206, 190, +(Uint16)(0), +36905, 207, 191, +(Uint16)(0), +36913, 208, 192, +(Uint16)(0), +36905, 209, 193, +(Uint16)(0), +36913, 210, 194, +(Uint16)(0), +36905, 211, 195, +(Uint16)(0), +36913, 212, 196, +(Uint16)(0), + +28339, +213, +2, +31533, 214, 197, +0, +47917, 215, 198, +(Uint16)(32), +37117, 216, 199, +(Uint16)(0), +37074, 217, 200, +(Uint16)(1), +36580, 218, 201, +(Uint16)(0), +37143, 219, 202, +(Uint16)(0), + +28339, +220, +2, +31533, 221, 203, +0, +47917, 222, 204, +(Uint16)(4128), +37117, 216, 205, +(Uint16)(0), +37072, 217, 206, +(Uint16)(1), +36578, 218, 207, +(Uint16)(0), +37143, 219, 208, +(Uint16)(4), + +28339, +223, +2, +31529, 224, 209, +0, +47913, 225, 210, +(Uint16)(3136), +37113, 216, 211, +(Uint16)(0), +37074, 217, 212, +(Uint16)(2), +36576, 218, 213, +(Uint16)(0), +37143, 219, 214, +(Uint16)(3), + +28339, +226, +2, +31529, 227, 215, +0, +47913, 228, 216, +(Uint16)(2112), +37113, 216, 217, +(Uint16)(0), +37068, 217, 218, +(Uint16)(2), +36578, 218, 219, +(Uint16)(0), +37143, 219, 220, +(Uint16)(2), + +28331, +229, +2, +31533, 230, 221, +0, +47917, 231, 222, +(Uint16)(1056), +37117, 216, 223, +(Uint16)(0), +37066, 217, 224, +(Uint16)(1), +36580, 218, 225, +(Uint16)(0), +37143, 219, 226, +(Uint16)(1), + +28331, +232, +2, +31533, 233, 227, +0, +47917, 234, 228, +(Uint16)(1056), +37117, 216, 229, +(Uint16)(0), +37064, 217, 230, +(Uint16)(1), +36570, 218, 231, +(Uint16)(0), +37143, 219, 232, +(Uint16)(1), + +28331, +235, +2, +31521, 236, 233, +0, +47905, 237, 234, +(Uint16)(1088), +37105, 216, 235, +(Uint16)(0), +37066, 217, 236, +(Uint16)(2), +36568, 218, 237, +(Uint16)(0), +37143, 219, 238, +(Uint16)(1), + +28331, +238, +2, +31521, 239, 239, +0, +47905, 240, 240, +(Uint16)(2112), +37105, 216, 241, +(Uint16)(0), +37068, 217, 242, +(Uint16)(2), +36570, 218, 243, +(Uint16)(0), +37143, 219, 244, +(Uint16)(2), + +28323, +241, +2, +31533, 242, 245, +0, +47917, 243, 246, +(Uint16)(9286), +37117, 216, 247, +(Uint16)(6), +37058, 217, 248, +(Uint16)(2), +36564, 218, 249, +(Uint16)(0), +37127, 219, 250, +(Uint16)(9), + +28323, +244, +2, +31533, 245, 251, +0, +47917, 246, 252, +(Uint16)(5184), +37117, 216, 253, +(Uint16)(0), +37056, 217, 254, +(Uint16)(2), +36562, 218, 255, +(Uint16)(0), +37127, 219, 256, +(Uint16)(5), + +28323, +247, +2, +31529, 248, 257, +0, +47913, 249, 258, +(Uint16)(12320), +37113, 216, 259, +(Uint16)(0), +37058, 217, 260, +(Uint16)(1), +36560, 218, 261, +(Uint16)(0), +37127, 219, 262, +(Uint16)(12), + +28323, +250, +2, +31529, 251, 263, +0, +47913, 252, 264, +(Uint16)(6144), +37113, 216, 265, +(Uint16)(0), +37068, 217, 266, +(Uint16)(0), +36562, 218, 267, +(Uint16)(0), +37127, 219, 268, +(Uint16)(6), + +28331, +253, +2, +31533, 254, 269, +0, +47917, 255, 270, +(Uint16)(7168), +37117, 216, 271, +(Uint16)(0), +37066, 217, 272, +(Uint16)(0), +36564, 218, 273, +(Uint16)(0), +37127, 219, 274, +(Uint16)(7), + +28331, +256, +2, +31533, 257, 275, +0, +47917, 258, 276, +(Uint16)(2048), +37117, 216, 277, +(Uint16)(0), +37064, 217, 278, +(Uint16)(0), +36570, 218, 279, +(Uint16)(0), +37127, 219, 280, +(Uint16)(2), + +28331, +259, +2, +31505, 260, 281, +0, +47889, 261, 282, +(Uint16)(1024), +37089, 216, 283, +(Uint16)(0), +37066, 217, 284, +(Uint16)(0), +36568, 218, 285, +(Uint16)(0), +37127, 219, 286, +(Uint16)(1), + +28331, +262, +2, +31505, 263, 287, +0, +47889, 264, 288, +(Uint16)(96), +37089, 216, 289, +(Uint16)(0), +37068, 217, 290, +(Uint16)(3), +36570, 218, 291, +(Uint16)(0), +37127, 219, 292, +(Uint16)(0), + +28339, +265, +2, +31501, 266, 293, +0, +47885, 267, 294, +(Uint16)(3136), +37117, 216, 295, +(Uint16)(0), +37074, 217, 296, +(Uint16)(2), +36548, 218, 297, +(Uint16)(0), +37143, 219, 298, +(Uint16)(3), + +28339, +268, +2, +31501, 269, 299, +0, +47885, 270, 300, +(Uint16)(9408), +37117, 216, 301, +(Uint16)(0), +37072, 217, 302, +(Uint16)(2), +36546, 218, 303, +(Uint16)(1), +37143, 219, 304, +(Uint16)(9), + +28339, +271, +2, +31497, 272, 305, +0, +47881, 273, 306, +(Uint16)(9414), +37113, 216, 307, +(Uint16)(6), +37074, 217, 308, +(Uint16)(2), +36544, 218, 309, +(Uint16)(1), +37143, 219, 310, +(Uint16)(9), + +28339, +274, +2, +31497, 275, 311, +0, +47881, 276, 312, +(Uint16)(12352), +37113, 216, 313, +(Uint16)(0), +37036, 217, 314, +(Uint16)(2), +36546, 218, 315, +(Uint16)(0), +37143, 219, 316, +(Uint16)(12), + +28299, +277, +2, +31501, 278, 317, +0, +47885, 279, 318, +(Uint16)(13344), +37117, 216, 319, +(Uint16)(0), +37034, 217, 320, +(Uint16)(1), +36548, 218, 321, +(Uint16)(0), +37143, 219, 322, +(Uint16)(13), + +28299, +280, +2, +31501, 281, 323, +0, +47885, 282, 324, +(Uint16)(10240), +37117, 216, 325, +(Uint16)(0), +37032, 217, 326, +(Uint16)(0), +36570, 218, 327, +(Uint16)(0), +37143, 219, 328, +(Uint16)(10), + +28299, +283, +2, +31489, 284, 329, +0, +47873, 285, 330, +(Uint16)(14400), +37105, 216, 331, +(Uint16)(0), +37034, 217, 332, +(Uint16)(2), +36568, 218, 333, +(Uint16)(0), +37143, 219, 334, +(Uint16)(14), + +28299, +286, +2, +31489, 287, 335, +0, +47873, 288, 336, +(Uint16)(15430), +37105, 216, 337, +(Uint16)(6), +37036, 217, 338, +(Uint16)(2), +36570, 218, 339, +(Uint16)(0), +37143, 219, 340, +(Uint16)(15), + +28291, +289, +2, +31501, 290, 341, +0, +47885, 291, 342, +(Uint16)(16448), +37117, 216, 343, +(Uint16)(0), +37026, 217, 344, +(Uint16)(2), +36564, 218, 345, +(Uint16)(0), +36583, 219, 346, +(Uint16)(16), + +28291, +292, +2, +31501, 293, 347, +0, +47885, 294, 348, +(Uint16)(13312), +37117, 216, 349, +(Uint16)(0), +37024, 217, 350, +(Uint16)(0), +36562, 218, 351, +(Uint16)(0), +36583, 219, 352, +(Uint16)(13), + +28291, +295, +2, +31497, 296, 353, +0, +47881, 297, 354, +(Uint16)(14336), +37113, 216, 355, +(Uint16)(0), +37026, 217, 356, +(Uint16)(0), +36560, 218, 357, +(Uint16)(0), +36583, 219, 358, +(Uint16)(14), + +28291, +298, +2, +31497, 299, 359, +0, +47881, 300, 360, +(Uint16)(12384), +37113, 216, 361, +(Uint16)(0), +37036, 217, 362, +(Uint16)(3), +36562, 218, 363, +(Uint16)(0), +36583, 219, 364, +(Uint16)(12), + +28299, +301, +2, +31501, 302, 365, +0, +47885, 303, 366, +(Uint16)(0), +37117, 216, 367, +(Uint16)(0), +37034, 217, 368, +(Uint16)(0), +36564, 218, 369, +(Uint16)(0), +36583, 219, 370, +(Uint16)(0), + +28299, +304, +2, +31501, 305, 371, +0, +47885, 306, 372, +(Uint16)(0), +37117, 216, 373, +(Uint16)(0), +37032, 217, 374, +(Uint16)(0), +36570, 218, 375, +(Uint16)(0), +36583, 219, 376, +(Uint16)(0), + +28333, +307, +4, +36537, 308, 377, +(Uint16)(256), +0, +0, +36542, 309, 378, +(Uint16)(256), +0, +0, +36543, 310, 379, +(Uint16)(256), +0, +0, +45225, 307, 380, +(Uint16)(0), +(Uint16)(0), (Uint16)(1), + +28333, +756, +3, +48417, 581, 381, +(Uint16)(0), (((Uint32)0)>>16), +48417, 582, 382, +(Uint16)(0), (((Uint32)0)>>16), +48417, 754, 383, +(Uint16)(0), (((Uint32)0)>>16), +48417, 753, 384, +(Uint16)(0), (((Uint32)0)>>16), +48401, 311, 385, +(Uint16)(438392299), (((Uint32)438392299)>>16), + +28236, +312, +1, +20169, 313, 386, +18737, 314, 387, +20153, 312, 388, + +28238, +315, +2, +45261, 316, 389, +(Uint16)(15), + +27822, +577, +3, +45357, 577, 390, +(Uint16)(0x11111111), (((Uint32)0x11111111)>>16), +45869, 596, 391, +(Uint16)(0), + +28346, +597, +7, +45741, 598, 392, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 599, 393, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 600, 394, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 601, 395, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 602, 396, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 603, 397, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 604, 398, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 605, 399, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 606, 400, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 607, 401, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 608, 402, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 609, 403, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 610, 404, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45741, 611, 405, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +45357, 612, 406, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +20749, 317, 407, + +3762, +312, +2, +47917, 318, 408, +(Uint16)(58002), +47917, 319, 409, +(Uint16)(14349), +47917, 320, 410, +(Uint16)(64364), +47917, 321, 411, +(Uint16)(3745), +47917, 322, 412, +(Uint16)(1832), + +28848, +323, +7, +58853, 324, 413, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(_IQ(120.0)), (((Uint32)_IQ(120.0))>>16), +26437, 325, 414, +0, +0, +0, +0, +0, +0, +26437, 326, 415, +0, +0, +0, +0, +0, +0, + +20154, +327, +7, +25925, 328, 416, +0, +0, +0, +0, +0, +0, +25925, 329, 417, +0, +0, +0, +0, +0, +0, +9381, 330, 418, +(Uint16)(335544), (((Uint32)335544)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9509, 331, 419, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9509, 332, 420, +(Uint16)(-16777216), (((Uint32)-16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9381, 333, 421, +(Uint16)(2684354), (((Uint32)2684354)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 334, 422, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 335, 423, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +25925, 336, 424, +0, +0, +0, +0, +0, +0, +25893, 337, 425, +0, +0, +0, +0, +0, +0, +25893, 338, 426, +0, +0, +0, +0, +0, +0, +25893, 339, 427, +0, +0, +0, +0, +0, +0, +25893, 340, 428, +0, +0, +0, +0, +0, +0, + +20155, +341, +7, +26437, 342, 429, +0, +0, +0, +0, +0, +0, +26437, 343, 430, +0, +0, +0, +0, +0, +0, +9381, 330, 431, +(Uint16)(3355443), (((Uint32)3355443)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9541, 331, 432, +(Uint16)(13421772), (((Uint32)13421772)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9541, 332, 433, +(Uint16)(-13421772), (((Uint32)-13421772)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 333, 434, +(Uint16)(16777), (((Uint32)16777)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 344, 435, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9381, 335, 436, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +26437, 336, 437, +0, +0, +0, +0, +0, +0, +25925, 345, 438, +0, +0, +0, +0, +0, +0, +25925, 338, 439, +0, +0, +0, +0, +0, +0, +25925, 339, 440, +0, +0, +0, +0, +0, +0, +25925, 340, 441, +0, +0, +0, +0, +0, +0, +25925, 346, 442, +0, +0, +0, +0, +0, +0, + +20154, +347, +7, +25921, 348, 443, +0, +0, +0, +0, +0, +0, +25921, 349, 444, +0, +0, +0, +0, +0, +0, +9377, 350, 445, +(Uint16)(335544), (((Uint32)335544)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9505, 351, 446, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9505, 352, 447, +(Uint16)(-16777216), (((Uint32)-16777216)>>16), +(Uint16)(_IQ(-1.0)), (((Uint32)_IQ(-1.0))>>16), (Uint16)(_IQ(1.0)), (((Uint32)_IQ(1.0))>>16), +9377, 353, 448, +(Uint16)(2684354), (((Uint32)2684354)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 354, 449, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 335, 450, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +25921, 336, 451, +0, +0, +0, +0, +0, +0, +25889, 355, 452, +0, +0, +0, +0, +0, +0, +25889, 338, 453, +0, +0, +0, +0, +0, +0, +25889, 339, 454, +0, +0, +0, +0, +0, +0, +25889, 340, 455, +0, +0, +0, +0, +0, +0, + +20157, +356, +7, +15401, 342, 456, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +10017, 342, 457, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +26401, 343, 458, +0, +0, +0, +0, +0, +0, +31785, 343, 459, +0, +0, +0, +0, +0, +0, +9377, 330, 460, +(Uint16)(1174405120), (((Uint32)1174405120)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10049, 331, 461, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10049, 332, 462, +(Uint16)(-100663296), (((Uint32)-100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 333, 463, +(Uint16)(83886), (((Uint32)83886)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 344, 464, +(Uint16)(167772160), (((Uint32)167772160)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15401, 357, 465, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +9377, 358, 466, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9377, 335, 467, +(Uint16)(8388608), (((Uint32)8388608)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10017, 359, 468, +(Uint16)(13981), (((Uint32)13981)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +26401, 336, 469, +0, +0, +0, +0, +0, +0, +25761, 346, 470, +0, +0, +0, +0, +0, +0, +26433, 345, 471, +0, +0, +0, +0, +0, +0, +26433, 338, 472, +0, +0, +0, +0, +0, +0, +26433, 339, 473, +0, +0, +0, +0, +0, +0, +26433, 340, 474, +0, +0, +0, +0, +0, +0, +26401, 360, 475, +0, +0, +0, +0, +0, +0, + +20156, +362, +7, +25893, 363, 476, +0, +0, +0, +0, +0, +0, +25893, 364, 477, +0, +0, +0, +0, +0, +0, +8901, 365, 478, +(Uint16)(14529069), (((Uint32)14529069)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0x01000000), (((Uint32)0x01000000)>>16), +31533, 366, 479, +0, +0, +0, +0, +0, +0, +31533, 367, 480, +0, +0, +0, +0, +0, +0, +31533, 368, 481, +0, +0, +0, +0, +0, +0, +31533, 369, 482, +0, +0, +0, +0, +0, +0, +11429, 370, 483, +(Uint16)(33554432), (((Uint32)33554432)>>16), +(Uint16)(_IQ(2.0)), (((Uint32)_IQ(2.0))>>16), (Uint16)(_IQ(10.0)), (((Uint32)_IQ(10.0))>>16), +11429, 371, 484, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(_IQ(10)), (((Uint32)_IQ(10))>>16), +8901, 372, 485, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +11965, 373, 486, +(Uint16)(1), +0, +0, +0, +0, +0, +15149, 374, 487, +(Uint16)(1), +0, +0, +0, +0, +0, +31661, 375, 488, +0, +0, +0, +0, +0, +0, +9367, 376, 489, +(Uint16)(20480), (((Uint32)20480)>>16), +(Uint16)(2048), (((Uint32)2048)>>16), (Uint16)(20480), (((Uint32)20480)>>16), +31277, 377, 490, +0, +0, +0, +0, +0, +0, +25893, 378, 491, +0, +0, +0, +0, +0, +0, +31533, 379, 492, +0, +0, +0, +0, +0, +0, + +20143, +380, +2, +31273, 381, 493, +0, +53545, 382, 494, +(Uint16)(1), + +20132, +383, +7, +15121, 384, 495, +(Uint16)(0), +0, +0, +0, +0, +0, +15121, 385, 496, +(Uint16)(0), +0, +0, +0, +0, +0, +53265, 386, 497, +(Uint16)(255), +0, +0, +0, +0, +0, +53289, 387, 498, +(Uint16)(255), +0, +0, +0, +0, +0, +53265, 388, 499, +(Uint16)(255), +0, +0, +0, +0, +0, +53289, 389, 500, +(Uint16)(255), +0, +0, +0, +0, +0, +9529, 390, 501, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9625, 391, 502, +(Uint16)(18454938), (((Uint32)18454938)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9625, 392, 503, +(Uint16)(6990506), (((Uint32)6990506)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10041, 393, 504, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9721, 639, 505, +(Uint16)(75497472), (((Uint32)75497472)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20146, +394, +7, +10017, 395, 506, +(Uint16)(67108), (((Uint32)67108)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9505, 396, 507, +(Uint16)(3355443), (((Uint32)3355443)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9505, 397, 508, +(Uint16)(3355443), (((Uint32)3355443)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9985, 398, 509, +(Uint16)(720992), (((Uint32)720992)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9601, 559, 510, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20144, +399, +7, +15241, 400, 511, +(Uint16)(2), +(Uint16)(1), (Uint16)(50), +0, +0, +0, +8265, 401, 512, +(Uint16)(5), +(Uint16)(0), (Uint16)(0), +0, +0, +0, +24617, 402, 513, +0, +0, +0, +0, +0, +0, +9129, 403, 514, +(Uint16)(500), +(Uint16)(0), (Uint16)(0), +0, +0, +0, +8233, 404, 515, +(Uint16)(36), +(Uint16)(0), (Uint16)(1000), +0, +0, +0, +10113, 405, 516, +(Uint16)(1048576), (((Uint32)1048576)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10145, 406, 517, +(Uint16)(16777), (((Uint32)16777)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +24713, 407, 518, +0, +0, +0, +0, +0, +0, +11993, 408, 519, +(Uint16)(1), +0, +0, +0, +0, +0, + +20107, +409, +4, +4365, 410, 520, +0, +0, +0, +15117, 411, 521, +(Uint16)(4), +0, +0, +15117, 412, 522, +(Uint16)(0), +0, +0, +15117, 413, 523, +(Uint16)(1), +0, +0, +14477, 414, 524, +(Uint16)(0), +(Uint16)(0), (Uint16)(1), +15117, 590, 525, +(Uint16)(0), +0, +0, + +20147, +415, +4, +8257, 416, 526, +(Uint16)(-81), +(Uint16)(0), (Uint16)(0), +16001, 417, 527, +(Uint16)(-14592), +(Uint16)(0), (Uint16)(0), +25913, 418, 528, +0, +0, +0, +8257, 419, 529, +(Uint16)(-81), +(Uint16)(0), (Uint16)(0), +16001, 420, 530, +(Uint16)(-14592), +(Uint16)(0), (Uint16)(0), +25913, 421, 531, +0, +0, +0, +8257, 422, 532, +(Uint16)(40), +(Uint16)(0), (Uint16)(0), +16001, 423, 533, +(Uint16)(62836), +(Uint16)(0), (Uint16)(0), +25913, 424, 534, +0, +0, +0, +8225, 425, 535, +(Uint16)(2050), +(Uint16)(0), (Uint16)(0), +16001, 426, 536, +(Uint16)(0), +(Uint16)(0), (Uint16)(0), +26009, 427, 537, +0, +0, +0, +9185, 633, 538, +(Uint16)(0), +(Uint16)(0), (Uint16)(0), +26105, 634, 539, +0, +0, +0, + +20096, +428, +7, +26417, 429, 540, +0, +0, +0, +0, +0, +0, +25873, 430, 541, +0, +0, +0, +0, +0, +0, +10033, 431, 542, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9489, 432, 543, +(Uint16)(419430), (((Uint32)419430)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10033, 433, 544, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9489, 434, 545, +(Uint16)(12582912), (((Uint32)12582912)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10033, 435, 546, +(Uint16)(100663296), (((Uint32)100663296)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20037, +436, +1, +26421, 437, 547, +26037, 438, 548, +25909, 439, 549, +25813, 440, 550, +25813, 441, 551, +25909, 442, 552, +28141, 613, 553, +28141, 614, 554, + +20024, +443, +7, +14477, 444, 555, +(Uint16)(0), +0, +0, +0, +0, +0, +14989, 445, 556, +(Uint16)(192), (((Uint32)192)>>16), +0, +0, +0, +0, +14989, 446, 557, +(Uint16)(1359151123), (((Uint32)1359151123)>>16), +0, +0, +0, +0, +14989, 447, 558, +(Uint16)(1359085569), (((Uint32)1359085569)>>16), +0, +0, +0, +0, +14989, 448, 559, +(Uint16)(1359151122), (((Uint32)1359151122)>>16), +0, +0, +0, +0, +14989, 449, 560, +(Uint16)(1359020033), (((Uint32)1359020033)>>16), +0, +0, +0, +0, +53645, 450, 561, +(Uint16)(0), +0, +0, +0, +0, +0, +53685, 451, 562, +(Uint16)(1), +0, +0, +0, +0, +0, +11837, 452, 563, +(Uint16)(0), +0, +0, +0, +0, +0, +10949, 453, 564, +(Uint16)(6710886), (((Uint32)6710886)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31373, 644, 565, +0, +0, +0, +0, +0, +0, +15757, 454, 566, +(Uint16)(50461787), (((Uint32)50461787)>>16), + +20000, +455, +7, +14985, 456, 567, +(Uint16)(1000), (((Uint32)1000)>>16), +0, +0, +0, +0, +11839, 457, 568, +(Uint16)(2), +0, +0, +0, +0, +0, +14473, 458, 569, +(Uint16)(1), +0, +0, +0, +0, +0, +9345, 459, 570, +(Uint16)(9298387), (((Uint32)9298387)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31369, 460, 571, +0, +0, +0, +0, +0, +0, +30857, 460, 572, +0, +0, +0, +0, +0, +0, +25761, 461, 573, +0, +0, +0, +0, +0, +0, +25729, 462, 574, +0, +0, +0, +0, +0, +0, +25729, 463, 575, +0, +0, +0, +0, +0, +0, +53565, 464, 576, +(Uint16)(0), +0, +0, +0, +0, +0, +9217, 465, 577, +(Uint16)(838860), (((Uint32)838860)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(65535), (((Uint32)65535)>>16), +30857, 466, 578, +0, +0, +0, +0, +0, +0, +30857, 467, 579, +0, +0, +0, +0, +0, +0, +30857, 468, 580, +0, +0, +0, +0, +0, +0, +31369, 469, 581, +0, +0, +0, +0, +0, +0, +30857, 469, 582, +0, +0, +0, +0, +0, +0, +30857, 470, 583, +0, +0, +0, +0, +0, +0, +15241, 471, 584, +(Uint16)(0), +0, +0, +0, +0, +0, +15241, 472, 585, +(Uint16)(7), +0, +0, +0, +0, +0, +15241, 472, 586, +(Uint16)(7335), +0, +0, +0, +0, +0, +15753, 472, 587, +(Uint16)(1973415), (((Uint32)1973415)>>16), +0, +0, +0, +0, +25729, 473, 588, +0, +0, +0, +0, +0, +0, +25729, 474, 589, +0, +0, +0, +0, +0, +0, + +20024, +475, +7, +25733, 441, 590, +0, +0, +0, +0, +0, +0, +25765, 461, 591, +0, +0, +0, +0, +0, +0, +9381, 476, 592, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +25733, 477, 593, +0, +0, +0, +0, +0, +0, +11837, 478, 594, +(Uint16)(81), +0, +0, +0, +0, +0, +14989, 479, 595, +(Uint16)(500), (((Uint32)500)>>16), +0, +0, +0, +0, +25765, 480, 596, +0, +0, +0, +0, +0, +0, +30861, 481, 597, +0, +0, +0, +0, +0, +0, +4573, 482, 598, +0, +0, +0, +0, +0, +0, +9349, 459, 599, +(Uint16)(4869970), (((Uint32)4869970)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +30861, 483, 600, +0, +0, +0, +0, +0, +0, +30861, 484, 601, +0, +0, +0, +0, +0, +0, +30861, 485, 602, +0, +0, +0, +0, +0, +0, +30861, 486, 603, +0, +0, +0, +0, +0, +0, +53567, 487, 604, +(Uint16)(0), +0, +0, +0, +0, +0, +14477, 488, 605, +(Uint16)(10), +0, +0, +0, +0, +0, +30861, 489, 606, +0, +0, +0, +0, +0, +0, +30861, 490, 607, +0, +0, +0, +0, +0, +0, +30861, 491, 608, +0, +0, +0, +0, +0, +0, +30861, 492, 609, +0, +0, +0, +0, +0, +0, +30861, 493, 610, +0, +0, +0, +0, +0, +0, + +20019, +455, +7, +14977, 494, 611, +(Uint16)(4096), (((Uint32)4096)>>16), +0, +0, +0, +0, +9369, 459, 612, +(Uint16)(9298387), (((Uint32)9298387)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +30849, 460, 613, +0, +0, +0, +0, +0, +0, +25785, 461, 614, +0, +0, +0, +0, +0, +0, +25753, 462, 615, +0, +0, +0, +0, +0, +0, +25753, 463, 616, +0, +0, +0, +0, +0, +0, +25753, 495, 617, +0, +0, +0, +0, +0, +0, +9241, 496, 618, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15233, 471, 619, +(Uint16)(0), +0, +0, +0, +0, +0, +15745, 472, 620, +(Uint16)(1973415), (((Uint32)1973415)>>16), +0, +0, +0, +0, +15233, 472, 621, +(Uint16)(7), +0, +0, +0, +0, +0, +15233, 472, 622, +(Uint16)(7335), +0, +0, +0, +0, +0, +25753, 473, 623, +0, +0, +0, +0, +0, +0, +25753, 474, 624, +0, +0, +0, +0, +0, +0, + +20026, +497, +7, +25669, 498, 625, +0, +0, +0, +0, +0, +0, +32205, 498, 626, +0, +0, +0, +0, +0, +0, +25669, 499, 627, +0, +0, +0, +0, +0, +0, +32205, 499, 628, +0, +0, +0, +0, +0, +0, +30925, 500, 629, +0, +0, +0, +0, +0, +0, +31693, 500, 630, +0, +0, +0, +0, +0, +0, +30925, 501, 631, +0, +0, +0, +0, +0, +0, +31693, 501, 632, +0, +0, +0, +0, +0, +0, +9285, 502, 633, +(Uint16)(16777), (((Uint32)16777)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 502, 634, +(Uint16)(16777), (((Uint32)16777)>>16), +0, +0, +0, +0, +9285, 503, 635, +(Uint16)(-190048), (((Uint32)-190048)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 503, 636, +(Uint16)(-190048), (((Uint32)-190048)>>16), +0, +0, +0, +0, +9285, 504, 637, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 504, 638, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +9285, 505, 639, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +15821, 505, 640, +(Uint16)(0), (((Uint32)0)>>16), +0, +0, +0, +0, +50253, 506, 641, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50253, 507, 642, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50253, 508, 643, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50253, 509, 644, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +30925, 645, 645, +0, +0, +0, +0, +0, +0, + +20161, +510, +7, +11821, 511, 646, +(Uint16)(1), +0, +0, +0, +0, +0, +14381, 399, 647, +(Uint16)(1), +0, +0, +0, +0, +0, +50363, 512, 648, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49327, 427, 649, +(Uint16)(1103101952), (((Uint32)1103101952)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +1211, 513, 650, +0, +0, +0, +0, +0, +0, +1225, 514, 651, +0, +0, +0, +0, +0, +0, +1208, 514, 652, +0, +0, +0, +0, +0, +0, +173, 515, 653, +0, +0, +0, +0, +0, +0, +30765, 516, 654, +0, +0, +0, +0, +0, +0, +172, 517, 655, +0, +0, +0, +0, +0, +0, +172, 518, 656, +0, +0, +0, +0, +0, +0, +172, 519, 657, +0, +0, +0, +0, +0, +0, +172, 421, 658, +0, +0, +0, +0, +0, +0, +172, 520, 659, +0, +0, +0, +0, +0, +0, +172, 584, 660, +0, +0, +0, +0, +0, +0, +175, 521, 661, +0, +0, +0, +0, +0, +0, +175, 522, 662, +0, +0, +0, +0, +0, +0, +175, 523, 663, +0, +0, +0, +0, +0, +0, +244, 524, 664, +0, +0, +0, +0, +0, +0, +30765, 525, 665, +0, +0, +0, +0, +0, +0, + +20156, +510, +7, +51065, 526, 666, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 527, 667, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 528, 668, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50360, 529, 669, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50360, 530, 670, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 400, 671, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50345, 531, 672, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50363, 532, 673, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 533, 674, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49838, 592, 675, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49910, 591, 676, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57018, 403, 677, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31529, 535, 678, +0, +0, +0, +0, +0, +0, +1198, 517, 679, +0, +0, +0, +0, +0, +0, +1198, 518, 680, +0, +0, +0, +0, +0, +0, +1193, 536, 681, +0, +0, +0, +0, +0, +0, +1193, 537, 682, +0, +0, +0, +0, +0, +0, +1193, 538, 683, +0, +0, +0, +0, +0, +0, +1193, 539, 684, +0, +0, +0, +0, +0, +0, + +20152, +510, +7, +50345, 540, 685, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 541, 686, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51065, 542, 687, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50362, 529, 688, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 400, 689, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50345, 531, 690, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50363, 532, 691, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57001, 533, 692, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31529, 535, 693, +0, +0, +0, +0, +0, +0, +31529, 550, 694, +0, +0, +0, +0, +0, +0, +49832, 592, 695, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49904, 591, 696, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57012, 403, 697, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49832, 593, 698, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +175, 553, 699, +0, +0, +0, +0, +0, +0, +1192, 555, 700, +0, +0, +0, +0, +0, +0, +1193, 588, 701, +0, +0, +0, +0, +0, +0, + +20159, +510, +7, +51069, 543, 702, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +51069, 544, 703, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50364, 545, 704, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50364, 546, 705, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50349, 531, 706, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50355, 532, 707, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57005, 533, 708, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49838, 594, 709, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +49838, 593, 710, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31533, 549, 711, +0, +0, +0, +0, +0, +0, +31533, 550, 712, +0, +0, +0, +0, +0, +0, +49910, 591, 713, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +57010, 403, 714, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50364, 551, 715, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +175, 552, 716, +0, +0, +0, +0, +0, +0, +175, 553, 717, +0, +0, +0, +0, +0, +0, +1198, 554, 718, +0, +0, +0, +0, +0, +0, +1198, 555, 719, +0, +0, +0, +0, +0, +0, + +20142, +556, +7, +9285, 557, 720, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9637, 558, 721, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +9637, 559, 722, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20144, +510, +7, +50337, 531, 723, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50355, 532, 724, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +50352, 529, 725, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +56993, 400, 726, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +56993, 533, 727, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +31521, 535, 728, +0, +0, +0, +0, +0, +0, +49838, 592, 729, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +758, 591, 730, +0, +0, +0, +0, +0, +0, +7858, 403, 731, +0, +0, +0, +0, +0, +0, +1185, 560, 732, +0, +0, +0, +0, +0, +0, +1185, 561, 733, +0, +0, +0, +0, +0, +0, +1185, 562, 734, +0, +0, +0, +0, +0, +0, +1203, 563, 735, +0, +0, +0, +0, +0, +0, +1203, 564, 736, +0, +0, +0, +0, +0, +0, +1203, 565, 737, +0, +0, +0, +0, +0, +0, + +20149, +399, +7, +12453, 571, 738, +(Uint16)(16777216), (((Uint32)16777216)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12453, 572, 739, +(Uint16)(5033165), (((Uint32)5033165)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12613, 573, 740, +(Uint16)(5033165), (((Uint32)5033165)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +28997, 574, 741, +0, +0, +0, +0, +0, +0, +28997, 575, 742, +0, +0, +0, +0, +0, +0, +28837, 536, 743, +0, +0, +0, +0, +0, +0, +28837, 537, 744, +0, +0, +0, +0, +0, +0, +30501, 576, 745, +0, +0, +0, +0, +0, +0, + +20139, +626, +7, +17709, 631, 746, +0, +0, +0, +0, +0, +0, +15149, 627, 747, +(Uint16)(2000), +0, +0, +0, +0, +0, +10661, 628, 748, +(Uint16)(15099494), (((Uint32)15099494)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +10661, 629, 749, +(Uint16)(11744051), (((Uint32)11744051)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +28837, 630, 750, +0, +0, +0, +0, +0, +0, +12453, 632, 751, +(Uint16)(0), (((Uint32)0)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), + +20141, +635, +7, +31521, 636, 752, +0, +0, +0, +0, +0, +0, +12793, 637, 753, +(Uint16)(41943040), (((Uint32)41943040)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12793, 638, 754, +(Uint16)(25165824), (((Uint32)25165824)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +12793, 640, 755, +(Uint16)(67108864), (((Uint32)67108864)>>16), +(Uint16)(0), (((Uint32)0)>>16), (Uint16)(0), (((Uint32)0)>>16), +}; + +int16 const CO2_OD_TBL1[] = { +4096, 0, +4097, 3, +4098, 6, +4116, 9, +4118, 12, +4119, 20, +4120, 24, +4608, 39, +4736, 48, +5120, 60, +5121, 73, +5122, 86, +5123, 99, +5124, 112, +5125, 125, +5126, 138, +5127, 151, +5632, 164, +5633, 187, +5634, 210, +5635, 233, +5636, 256, +5637, 279, +5638, 302, +5639, 325, +6144, 348, +6145, 371, +6146, 394, +6147, 417, +6148, 440, +6149, 463, +6150, 486, +6151, 509, +6656, 532, +6657, 555, +6658, 578, +6659, 601, +6660, 624, +6661, 647, +6662, 670, +6663, 693, +8192, 716, +8193, 722, +8194, 726, +8195, 741, +8196, 756, +8197, 761, +8199, 764, +8208, 779, +8209, 794, +8210, 817, +8212, 821, +8213, 825, +8214, 828, +8215, 831, +8320, 834, +8321, 893, +8322, 896, +8323, 909, +8448, 976, +8449, 1003, +8450, 1030, +8451, 1057, +8452, 1084, +8453, 1111, +8454, 1138, +8455, 1165, +8456, 1192, +8457, 1219, +8458, 1246, +8459, 1273, +8460, 1300, +8461, 1327, +8462, 1354, +8463, 1381, +8464, 1408, +8465, 1435, +8466, 1462, +8467, 1489, +8468, 1516, +8469, 1543, +8470, 1570, +8471, 1597, +8472, 1624, +8473, 1651, +8474, 1678, +8475, 1705, +8476, 1732, +8477, 1759, +9474, 1786, +9478, 1813, +9487, 1836, +9522, 1841, +9524, 1853, +9728, 1860, +9984, 1868, +9985, 1872, +12288, 2010, +12544, 2013, +20480, 2036, +20736, 2066, +20737, 2186, +20738, 2315, +20739, 2435, +20741, 2618, +20747, 2774, +20750, 2785, +20754, 2887, +20755, 2935, +20756, 3019, +20758, 3058, +20762, 3145, +20792, 3211, +20816, 3238, +20817, 3340, +20818, 3345, +20821, 3555, +20823, 3747, +20852, 3876, +20865, 4068, +20866, 4251, +20867, 4425, +20868, 4581, +20869, 4746, +20870, 4776, +23300, 4914, +23301, 4989, +23302, 5046, +}; +Uint16 const co2_SPIrange1rw = CO2_SPI_START_ADDR+0; +Uint16 const co2_SPIrange1rwCRC = CO2_SPI_START_ADDR+8; +Uint16 const co2_SPIrange1rwp = CO2_SPI_START_ADDR+10; +Uint16 const co2_SPIrange1rwpCRC = CO2_SPI_START_ADDR+336; +Uint16 const co2_SPIrange1rwps = CO2_SPI_START_ADDR+338; +Uint16 const co2_SPIrange1rwpsCRC = CO2_SPI_START_ADDR+338; +Uint16 const co2_SPIrange2rw = CO2_SPI_START_ADDR+340; +Uint16 const co2_SPIrange2rwCRC = CO2_SPI_START_ADDR+643; +Uint16 const co2_SPIrange2rwp = CO2_SPI_START_ADDR+645; +Uint16 const co2_SPIrange2rwpCRC = CO2_SPI_START_ADDR+670; +Uint16 const co2_SPIrange2rwps = CO2_SPI_START_ADDR+672; +Uint16 const co2_SPIrange2rwpsCRC = CO2_SPI_START_ADDR+672; +Uint16 const co2_SPIrange3rw = CO1_SPI_START_ADDR+674; +Uint16 const co2_SPIrange3rwCRC = CO1_SPI_START_ADDR+684; +Uint16 const co2_SPIrange3rwp = CO1_SPI_START_ADDR+686; +Uint16 const co2_SPIrange3rwpCRC = CO1_SPI_START_ADDR+686; +Uint16 const co2_SPIrange3rwps = CO1_SPI_START_ADDR+688; +Uint16 const co2_SPIrange3rwpsCRC = CO1_SPI_START_ADDR+688; +Uint16 const co2_SPIrange4rw = CO1_SPI_START_ADDR+690; +Uint16 const co2_SPIrange4rwCRC = CO1_SPI_START_ADDR+690; +Uint16 const co2_SPIrange4rwp = CO1_SPI_START_ADDR+692; +Uint16 const co2_SPIrange4rwpCRC = CO1_SPI_START_ADDR+692; +Uint16 const co2_SPIrange4rwps = CO1_SPI_START_ADDR+694; +Uint16 const co2_SPIrange4rwpsCRC = CO1_SPI_START_ADDR+694; +Uint16 const co2_SPIrange5rw = CO1_SPI_START_ADDR+696; +Uint16 const co2_SPIrange5rwCRC = CO1_SPI_START_ADDR+1323; +Uint16 const co2_SPIrange5rwp = CO1_SPI_START_ADDR+1325; +Uint16 const co2_SPIrange5rwpCRC = CO1_SPI_START_ADDR+1329; +Uint16 const co2_SPIrange5rwps = CO1_SPI_START_ADDR+1331; +Uint16 const co2_SPIrange5rwpsCRC = CO1_SPI_START_ADDR+1331; +Uint16 const co2_first1000 = 0; +Uint16 const co2_first2000 = 82; +Uint16 const co2_first3000 = 194; +Uint16 const co2_first4000 = 198; +Uint16 const co2_first5000 = 198; +// Таблица групп +Uint16 const CO2_TYPE_DEF_TABLE[] = { + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)4,\ + (Uint16)5,\ + (Uint16)0,\ + (Uint16)-1,\ + (Uint16)10,\ + (Uint16)4,\ + (Uint16)0,\ + (Uint16)5,\ + (Uint16)5,\ + (Uint16)0,\ + (Uint16)40,\ + (Uint16)17,\ + (Uint16)6,\ + (Uint16)8,\ + (Uint16)7,\ + (Uint16)9,\ + (Uint16)15,\ + (Uint16)36,\ + (Uint16)16,\ + (Uint16)1,\ + (Uint16)13,\ + (Uint16)12,\ + (Uint16)14,\ + (Uint16)18,\ + (Uint16)-1,\ + (Uint16)28,\ + (Uint16)0,\ + (Uint16)24,\ + (Uint16)23,\ + (Uint16)25,\ + (Uint16)27,\ + (Uint16)47,\ + (Uint16)48,\ + (Uint16)49,\ + (Uint16)50,\ + (Uint16)19,\ + (Uint16)51,\ + (Uint16)20,\ + (Uint16)46,\ + (Uint16)45,\ +}; +// Таблица CALLBACK-функций +//************************************************************** +long const CO2_OD_CALLBACK_TBL[]={ +0, // 1000h.00h +0, // 1001h.00h +0, // 1002h.00h +0, // 1014h.00h +0, // 1016h.00h +0, // 1017h.00h +0, // 1018h.00h +0, // 1200h.00h +0, // 1280h.00h +0, // 1400h.00h +0, // 1401h.00h +0, // 1402h.00h +0, // 1403h.00h +0, // 1404h.00h +0, // 1405h.00h +0, // 1406h.00h +0, // 1407h.00h +0, // 1600h.00h +0, // 1601h.00h +0, // 1602h.00h +0, // 1603h.00h +0, // 1604h.00h +0, // 1605h.00h +0, // 1606h.00h +0, // 1607h.00h +0, // 1800h.00h +0, // 1801h.00h +0, // 1802h.00h +0, // 1803h.00h +0, // 1804h.00h +0, // 1805h.00h +0, // 1806h.00h +0, // 1807h.00h +0, // 1A00h.00h +0, // 1A01h.00h +0, // 1A02h.00h +0, // 1A03h.00h +0, // 1A04h.00h +0, // 1A05h.00h +0, // 1A06h.00h +0, // 1A07h.00h +0, // 2000h.00h +0, // 2001h.00h +0, // 2002h.00h +0, // 2003h.00h +0, // 2004h.00h +0, // 2005h.00h +0, // 2007h.00h +0, // 2010h.00h +0, // 2011h.00h +0, // 2012h.00h +0, // 2014h.00h +0, // 2015h.00h +0, // 2016h.00h +0, // 2017h.00h +0, // 2080h.00h +0, // 2081h.00h +0, // 2082h.00h +0, // 2083h.00h +0, // 2100h.00h +0, // 2101h.00h +0, // 2102h.00h +0, // 2103h.00h +0, // 2104h.00h +0, // 2105h.00h +0, // 2106h.00h +0, // 2107h.00h +0, // 2108h.00h +0, // 2109h.00h +0, // 210Ah.00h +0, // 210Bh.00h +0, // 210Ch.00h +0, // 210Dh.00h +0, // 210Eh.00h +0, // 210Fh.00h +0, // 2110h.00h +0, // 2111h.00h +0, // 2112h.00h +0, // 2113h.00h +0, // 2114h.00h +0, // 2115h.00h +0, // 2116h.00h +0, // 2117h.00h +0, // 2118h.00h +0, // 2119h.00h +0, // 211Ah.00h +0, // 211Bh.00h +0, // 211Ch.00h +0, // 211Dh.00h +0, // 2502h.00h +0, // 2506h.00h +(long)((void(*)(long))callback_RTC), // 250Fh.00h +0, // 2532h.00h +0, // 2534h.00h +0, // 2600h.00h +(long)((void(*)(long))callback_BTcmd), // 2700h.00h +0, // 2701h.00h +0, // 3000h.00h +0, // 3100h.00h +0, // 5000h.00h +0, // 5100h.00h +0, // 5101h.00h +0, // 5102h.00h +0, // 5103h.00h +0, // 5105h.00h +0, // 510Bh.00h +0, // 510Eh.00h +0, // 5112h.00h +0, // 5113h.00h +0, // 5114h.00h +0, // 5116h.00h +0, // 511Ah.00h +0, // 5138h.00h +0, // 5150h.00h +(long)((void(*)(long))callback_dlog), // 5151h.00h +0, // 5152h.00h +0, // 5155h.00h +0, // 5157h.00h +0, // 5174h.00h +0, // 5181h.00h +0, // 5182h.00h +0, // 5183h.00h +0, // 5184h.00h +0, // 5185h.00h +0, // 5186h.00h +0, // 5B04h.00h +0, // 5B05h.00h +0, // 5B06h.00h +}; + +// Массив ссылок для драйвера CANopen двухядерных процессоров +#ifdef COOD_LINKS__5000 +long const CO2_LINKS[]={(long)&co2_numOfInd, + (long)&CO2_OD_TBL1, + (long)&CO2_OD_TBL2, + (long)&CO2_OD_TBL3, + (long)&CO2_TYPE_DEF_TABLE, + (long)&CO2_OD_CALLBACK_TBL, + (long)&co2_SPIrange1rw, + (long)&co2_SPIrange1rwCRC, + (long)&co2_SPIrange1rwp, + (long)&co2_SPIrange1rwpCRC, + (long)&co2_SPIrange1rwps, + (long)&co2_SPIrange1rwpsCRC, + (long)&co2_SPIrange2rw, + (long)&co2_SPIrange2rwCRC, + (long)&co2_SPIrange2rwp, + (long)&co2_SPIrange2rwpCRC, + (long)&co2_SPIrange2rwps, + (long)&co2_SPIrange2rwpsCRC, + (long)&co2_SPIrange3rw, + (long)&co2_SPIrange3rwCRC, + (long)&co2_SPIrange3rwp, + (long)&co2_SPIrange3rwpCRC, + (long)&co2_SPIrange3rwps, + (long)&co2_SPIrange3rwpsCRC, + (long)&co2_SPIrange4rw, + (long)&co2_SPIrange4rwCRC, + (long)&co2_SPIrange4rwp, + (long)&co2_SPIrange4rwpCRC, + (long)&co2_SPIrange4rwps, + (long)&co2_SPIrange4rwpsCRC, + (long)&co2_SPIrange5rw, + (long)&co2_SPIrange5rwCRC, + (long)&co2_SPIrange5rwp, + (long)&co2_SPIrange5rwpCRC, + (long)&co2_SPIrange5rwps, + (long)&co2_SPIrange5rwpsCRC, + (long)&co2_first1000, + (long)&co2_first2000, + (long)&co2_first3000, + (long)&co2_first4000, + (long)&co2_first5000 +}; + +STATIC_ASSERT(((sizeof(CO2_LINKS)/sizeof(CO2_LINKS[0])) == (COOD_LINKS__5000 + 1)),m); +#endif diff --git a/Vsrc/filter.c b/Vsrc/filter.c new file mode 100644 index 0000000..d3be38c --- /dev/null +++ b/Vsrc/filter.c @@ -0,0 +1,43 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file filter.c + \brief Инерционное звено в IQ математике (см. TFilter) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup filter */ +/*@{*/ + +#include "DSP.h" +#include "filter.h" +#include "V_IQmath.h" + +//! Инерционное звено 1/(Tp+1) +//! Используется как фильтр первого порядка + +//!Должна вызываться с заданной дискретизацией. Предварительно необходимо определить +//! переменную, связанную с постоянной времени: +//! T=Ts/Tfiltra где - Tfiltra постоянная времени фильтра, а +//! Ts - время дискретизации вызова фунции +//! \memberof TFilter +void TFilter_Calc(TFilter *p) { + p->output = _IQmpy(p->T,(p->input-p->output)) + p->output; +} + +/*@}*/ + diff --git a/Vsrc/ipark.c b/Vsrc/ipark.c new file mode 100644 index 0000000..76eb020 --- /dev/null +++ b/Vsrc/ipark.c @@ -0,0 +1,45 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file ipark.c + \brief Модуль инверсных координатных преобразований координат (см. TIPark) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup IPark + @{ + */ + +#include "V_IQmath.h" /* Include header for IQmath library */ +#include "ipark.h" + +//! Функция инверсных преобразований координат + +//!На входе угол ang, вектор (de,qe). +//!На выходе повернутый на заданный угол вектор (ds,qs) +//! \memberof TIPark +void ipark_calc(TIPark *v) { + + _iq cos_ang, sin_ang; + + sin_ang = _IQsinPU(v->ang); + cos_ang = _IQcosPU(v->ang); + + v->ds = _IQmpy(v->de,cos_ang) - _IQmpy(v->qe, sin_ang); + v->qs = _IQmpy(v->qe,cos_ang) + _IQmpy(v->de, sin_ang); +} + +/*@}*/ + diff --git a/Vsrc/main.c b/Vsrc/main.c new file mode 100644 index 0000000..acb50ed --- /dev/null +++ b/Vsrc/main.c @@ -0,0 +1,337 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file main.c + \brief Главный файл проекта. Содержит main(), а также обработчики прерываний. + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + */ + +/** \addtogroup MAIN */ +/*@{*/ +#include "main.h" +#include //для memcpy + +void InitCLK(void); + +TClarke clarke = CLARKE_DEFAULTS; //!<Фазные преобразования +#if defined (PARK_IPARK_IQMATH) +TPark park = PARK_DEFAULTS; //!<Координатные преобразования (программные) +TIPark ipark = IPARK_DEFAULTS; //!<Обратные координатные преобразования (программные) +#elif defined (PARK_IPARK_TMU) +TTMUPark park = TMUPARK_DEFAULTS; //!<Координатные преобразования (аппаратные через блок TMU) +TTMUIPark ipark = TMUIPARK_DEFAULTS; //!<Обратные координатные преобразования (аппаратные через блок TMU) +#endif +TPidReg3 pid_id = PIDREG3_DEFAULTS; //!<Рег. тока по оси d +TPidReg3 pid_iq = PIDREG3_DEFAULTS; //!<Рег. тока по оси q +TPidReg3 pid_ia = PIDREG3_DEFAULTS; //!<Рег. тока якоря ДПТ +TPidReg3 pid_spd = PIDREG3_DEFAULTS; //!<Рег. скорости +TPidReg3_pos pid_pos = PIDREG3_DEFAULTS_POS; //!<Рег. положения +TRelayReg i_a_reg = RELAY_REG_DEFAULTS; //!<регулятор тока фазы A (для модели SRM) +TRelayReg i_b_reg = RELAY_REG_DEFAULTS; //!<регулятор тока фазы A (для модели SRM) +TRelayReg i_c_reg = RELAY_REG_DEFAULTS; //!<регулятор тока фазы A (для модели SRM) +TVhzProf vhz = VHZPROF_DEFAULTS; //!< закон U/f=const +TSM_Sys sm_sys = SM_Sys_DEFAULTS; //!< Главная оболочка для вызова всех модулей +Uint16 disp_group_number = 0; //!< Необходимо для драйвера CANOpen и Unicon +TDataLog dlog = DATALOG_DEFAULTS; //!< Модуль осциллографирования переменных CANOpen +TSM_Protect sm_prot = SM_PROTECT_DEFAULTS; //!< Модуль защит +TBitsToEnumNums pult_faults_lister = BITS_TO_ENUM_NUMS_DEFAULTS; //!<Листалка аварий для Unicon +TSM_Ctrl sm_ctrl = SM_CTRL_DEFAULTS; //!< Главный дискретный автомат, реализует структуру управления +TSM_CmdLogic sm_cmd_logic = SM_CMD_LOGIC_DEFAULTS; //!< Обработка пользовательских команд управления +TSM_Net sm_net = SM_NET_DEFAULTS; //!< Оболочка для вызова сетевых драйверов +TRMPCtrl rmp = V_RMP_CTRL_DEFAULTS; //!< Задатчик интенсивности +TAdcDrv adc = ADC_DRV_DEFAULTS; //!< Модуль АЦП +TPWM_Module pwm = PWM_Module_DEFAULTS; //!< Модуль ШИМ +Texcitation pwm_ex = excitation_DEFAULTS; //!< Модуль возбудителя СД +TDPReCAP DPReCAP = DPRECAP_DEFAULTS; //!< Модуль ДПР на элементах Холла +TposspeedEqep posspeedEqep = POSSPEED_DEFAULTS; //!< Модуль ДПР типа энкодер +TCurPar cur_par = TCUR_PAR_DEFAULTS; //!< Модуль расчета и хранения текущих показателей привода - мощность, скорость +TUserMemory UserMem = USERMEMORY_DEFAULTS; //!< Модуль работы с энергонезависимой памятью. +Tled leds = LED_DEFAULTS; //!< модуль для красивого мигания светодиодами +Tdrv8301interface drv8301 = DRV8301_INTERFACE_DEFAULTS; //!< Модуль для настройки драйвера ключей drv8301 +TCanBTInterface Can1BTInterface = T_CANBT_INTERFACE_DEFAULTS;//!<Пакетная передача CANopen +TCanBTInterface Can2BTInterface = T_CANBT_INTERFACE_DEFAULTS;//!<Пакетная передача CANopen +TRTCClock RTCclock = RTC_CLOCK_DEFAULTS; //!< Модуль работы с часами реальноговремени. "spi" - по историческим причинам совместимости +TAutoOffset AutoOffset = AUTO_OFFSET_DEFAULTS; //!<Автоматическая подстройка смещения токов АЦП +TSSI_Encoder SSI_Encoder = SSI_ENCODER_DEFAULTS; //!<Драйвер обработки датчика положения с SSI интерфейсом +TMotorModel model = MOTOR_MODEL_DEFAULTS; //!< Модели электродвигателей для отладки "на столе" в режиме симулятора +TRotorObserver RotorObserver = ROTOR_OBSERVER_DEFAULTS; //!<Датчиковый наблюдатель потокосцепления ротора асинхронного двигателя +TCANtoRS CANtoRS = CAN_TO_RS_DEFAULTS; //!<Модуль для работы с драйвером CANopen через UART (RS). Посылки CAN запаковываются в UART +TModBus ModBus = MODBUS_DEFAULTS; //!<Драйвер для работы по протоколу MODBUS +TMBVarsConv MBVarsConv = MBVARSCONV_DEFAULTS;//!< Модуль преобразования данных из формата 16 разрядов Modbus в формат системы управления (IQ 24) +TDrvInterface drv_interface = DRV_INTERFACE_DEFAULTS; //!<Интерфейс длЯ работы с банками аварий, событий и т.п. +TLogger FaultLog = LOGGER_DEFAULTS; //!<Протоколирование аварий +TGlobalTime global_time = GLOBAL_TIME_DEFAULTS; //!<Работа с часами +TUdControl udControl = UD_CONTROL_DEFAULTS; //!<Плавная зарядка ЗПТ через термисторы +TFanControl FanControl = FAN_CONTROL_DEFAULTS; //!<Вентилятор +TTMU tmu = TMU_DEFAULTS; //!<Блок тригонометических преобразований +TRefs refs; //!< Структура с заданиями (токи, скорости) +TCmd cmd = { 0 }; //!< Структура с командами управления +TDrvStatus drv_status = { 0 }; //!< Текущий статус привода +TDrvParams drv_params; //!< Параметры двигателя +TSysSwitches sw; //!< Различные дискретные настройки системы управления + +Uint32 VendorToken=0x11111111;//!< Уникальный ключ производителя, нужный для программы UniCON и COODEdit для различных наборов текстов разных произхводителей +int drv_status_code; //!<Статус системы управления в виде константы (ГОТОВ, РАБОТА и т.п.) + +//Переменные для отладки - выведены в словарь CANOpen, +//В них можно присваивать любую другую переменную и наблюдать её +//в UniCon, а также использовать их напрямую в ПО для отладки и менять на ходу. +volatile long Debug1 = 0; +volatile long Debug2 = 0; +volatile Uint16 Debug3 = 0; +volatile Uint16 Debug4 = 0; +volatile long DebugW1 = 0; +volatile long DebugW2 = 0; +volatile long DebugW3 = 0; +volatile long DebugW4 = 0; +volatile float DebugF1 = 0; +volatile float DebugF2 = 0; +volatile float DebugF3 = 0; +volatile float DebugF4 = 0; + +//Счетчики прерываний модуля захвата +Uint16 CounterCAP_isr = 0; +Uint16 cap0_counter = 0; +Uint16 cap1_counter = 0; +Uint16 cap2_counter = 0; + +Uint16 LoopCounter = 0; //!< Счетчик итераций фонового цикла + +//!С этой функции начинается запуск программы +//! \memberof MAIN_C +int main(void) { + + /* Настройка тактирования, включение периферии */ + SystemInit(); // Настройка клоков + SystemCoreClockUpdate(); // Апдейти системных переменных настроенными клоками (чтобы прога знала, какая у неё частота) + // Копирование некоторых функций и всех прерываний в RAM +#if defined (__GNUC__) + memcpy(&__fastcode_ram_start, &__fastcode_flash_start, + ((Uint32) (&__fastcode_ram_end) - (Uint32) (&__fastcode_ram_start))); + + memcpy(&__isr_vector_ram_start, &__isr_vector_flash_start, + ((Uint32) (&__isr_vector_ram_end) + - (Uint32) (&__isr_vector_ram_start))); +#elif defined (__CMCPPARM__) + // Для CodeMaster непонятно, как разместить таблицу прерываний во флеше, а обращатся к ней в раме, + // так что пока так. +#endif + + pwm.Off(&pwm); //выключить ШИМ (на всякий случай) + + //Инициализация, собственно, всего. + sm_sys.init(&sm_sys); + EINT;//разрешение прерываний + + //тип и версия устройства для драйвера CANOpen + co1_vars.co_productCode = 51; + co1_vars.co_revisionNumber = 1; + + co2_vars.co_productCode = 51; + co2_vars.co_revisionNumber = 1; + + while (1) { //Фоновый цикл + LoopCounter++; + sm_sys.slow_calc(&sm_sys); //Фоновый расчет + } +} + +unsigned long CpuTimerIsr1 = 0; +Uint16 TIsr1 = 0; +Uint16 msCounter = 0; + +//! Прервыние, вызываемое по таймеру с частотой 1кГц +//! \memberof MAIN_C +void TMR1_IRQHandler(void) { + CpuTimerIsr1 = TMR2->VALUE; //Засекается время выполнения функции + sm_sys.ms_calc(&sm_sys); //миллисекундный расчет всего + + msCounter++; + TIsr1 = ((CpuTimerIsr1 - TMR2->VALUE) & 0xFFFFFF) << 1; //время выполнения функции сдвиг на 1 из-за вдвое более медленного тактирования таймера + if (TIsr1 > 195000) { + sm_prot.bit_fault1 |= F_PROGRAM_1K; //если расчет слишком долгий, ошибка + } + + TMR1->INTSTATUS_bit.INT = 1; //сброс прерывания +} + +Uint16 FastCounter = 0; +unsigned long CpuTimerIsr10 = 0; +Uint16 TIsr10 = 0; + +//! Прервыние, вызываемое по таймеру с частотой 10кГц +//! \memberof MAIN_C +void TMR0_IRQHandler(void) { + CpuTimerIsr10 = TMR2->VALUE; //Засекается время выполнения функции + sm_sys.fast_calc(&sm_sys); //расчет 10кГц всего + + FastCounter++; + TIsr10 = ((CpuTimerIsr10 - TMR2->VALUE) & 0xFFFFFF) << 1; //время выполнения функции, сдвиг на 1 из-за вдвое более медленного тактирования таймера + if (TIsr10 > 19500) { + sm_prot.bit_fault1 |= F_PROGRAM_10K; //если расчет слишком долгий, ошибка + } + TMR0->INTSTATUS_bit.INT = 1; //сброс прерывания +} + +Uint16 ePWM0_TZ_isr_counter = 0; +//!Прерывание, возникающее при аппаратной аварии +//! \memberof MAIN_C +#if defined (__GNUC__) +void EPWM_TZ_0_IRQHandler(void) +#elif defined (__CMCPPARM__) +void PWM0_TZ_IRQHandler(void) +#endif +{ + //Так как аппаратная авария возникает при включении ШИМ + //и удерживается пока заряжаются будстрепные конденсаторы, + //в прерывании на нее не реагируем + //Хотя в "настоящем" инверторе на высокое напряжение это, конечно, надо делать + //Здесь микросхема драйверов защитит всё сама, такого выхода у неё нет + ePWM0_TZ_isr_counter++; + /* + pwm12.Off(&pwm12); + + if (sm_ctrl.state!=CTRL_STOP) + { + sm_prot.bit_fault1|= F_PDPINT; + } + sm_ctrl.state=CTRL_STOP; + //сбрасываем флаги прерываний по этой ножке + */ +} + +//!Прерывание, возникающее по событиям захвата модуля CAP0 +//! \memberof MAIN_C +#if defined (__GNUC__) +void ECAP0_IRQHandler(void) +#elif defined (__CMCPPARM__) +void CAP0_IRQHandler(void) +#endif +{ + //Подтверждаем это прерывание для NVIC - иначе при выходе из функции оно возникнет опять + ECAP0->PEINT = 1; + + if (DPReCAP.CAPCalcEna1 == 0) { //если функция вызвалась повторно + DPReCAP.CAP_WrongEdgeCnt = (++DPReCAP.CAP_WrongEdgeCnt) & 0xFF; + DPReCAP.CAP_WrongEdgeCnt1++; + return; + } + DPReCAP.CAPCalcEna1 = 0;//расчет будет разрешен, когда тикнет прерывание 10кГц. Чаще считать нет смысла, это помехи + + CounterCAP_isr++;//общий счётчик всех прерываний модуля захвата + CounterCAP_isr = CounterCAP_isr & 0xF; + cap0_counter++;//счётчик прерываний именно этого канала + //исходя из состояния ног трех датчиков Холла высчитывает текущий угол с точностью 60 градусов. + //выходом функции является DPReCAP.Angle6 - угол с точностью 60 градусов. + DPReCAP.Angle6Calc(&DPReCAP); + //обработчик модуля захвата канала1 (0, если считать с нуля, но не переименовывать же какждый раз функции, в зависимости от версии заголовочных файлов...). + //Засекает время между этим импульсом и предыдущими для расчета интерполятора угла и частоты вращения (скорости) + DPReCAP.CAP1Calc(&DPReCAP); + + //Подтверждение прерываний + ECAP0->ECCLR_bit.CEVT0 = 1; + ECAP0->ECCLR_bit.CEVT1 = 1; + ECAP0->ECCLR_bit.INT = 1; + +} + +//!Прерывание, возникающее по событиям захвата модуля CAP1 +//! \memberof MAIN_C +#if defined (__GNUC__) +void ECAP1_IRQHandler(void) +#elif defined (__CMCPPARM__) +void CAP1_IRQHandler(void) +#endif +{ + //Подтверждаем это прерывание для NVIC - иначе при выходе из функции оно возникнет опять + ECAP1->PEINT = 1; + + if (DPReCAP.CAPCalcEna2 == 0) { //если функция вызвалась повторно + DPReCAP.CAP_WrongEdgeCnt = (++DPReCAP.CAP_WrongEdgeCnt) & 0xFF; + DPReCAP.CAP_WrongEdgeCnt2++; + return; + } + DPReCAP.CAPCalcEna2 = 0; + + CounterCAP_isr++; + CounterCAP_isr = CounterCAP_isr & 0xF; + cap1_counter++; + DPReCAP.Angle6Calc(&DPReCAP); + DPReCAP.CAP2Calc(&DPReCAP); + + //Подтверждение прерываний + ECAP1->ECCLR_bit.CEVT0 = 1; + ECAP1->ECCLR_bit.CEVT1 = 1; + ECAP1->ECCLR_bit.INT = 1; +} + + +//!Прерывание, возникающее по событиям захвата модуля CAP2 +//! \memberof MAIN_C +#if defined (__GNUC__) +void ECAP2_IRQHandler(void) +#elif defined (__CMCPPARM__) +void CAP2_IRQHandler(void) +#endif +{ + //Подтверждаем это прерывание для NVIC - иначе при выходе из функции оно возникнет опять + ECAP2->PEINT = 1; + + if (DPReCAP.CAPCalcEna3 == 0) { //если функция вызвалась повторно + DPReCAP.CAP_WrongEdgeCnt = (++DPReCAP.CAP_WrongEdgeCnt) & 0xFF; + DPReCAP.CAP_WrongEdgeCnt3++; + return; + } + DPReCAP.CAPCalcEna3 = 0; + + CounterCAP_isr++; + CounterCAP_isr = CounterCAP_isr & 0xF; + cap2_counter++; + DPReCAP.Angle6Calc(&DPReCAP); //если убрать, то в момент прихода метки на один период ШИМ косяк, так как прерывание посчиталось, а Angle6Calc нет + DPReCAP.CAP3Calc(&DPReCAP); + + //Подтверждение прерываний + ECAP2->ECCLR_bit.CEVT0 = 1; + ECAP2->ECCLR_bit.CEVT1 = 1; + ECAP2->ECCLR_bit.INT = 1; +} + +//!Прерывание, возникающее по событию реперной метки(индекса) модуля QEP +//! \memberof MAIN_C +//! Но - на двигателе ACM601V36-1000 нет индексной метки. +//Так что этого прерывания c таким двигателем не будет (или будет от помех, как повезет) +#if defined (__GNUC__) +void EQEP0_IRQHandler(void) +#elif defined (__CMCPPARM__) +void QEP1_IRQHandler(void) +#endif +{ + //Обработка репера + posspeedEqep.index(&posspeedEqep); + //Подтверждаем это прерывание для NVIC + QEP0->INTCLR = 1; + QEP0->QCLR_bit.IEL = 1; + QEP0->QCLR_bit.INT = 1; +} + +/*@}*/ + +//Прерывание вызывается один раз на периоде ШИМ и забирает 4 результата за период +void ADC_SEQ0_IRQHandler (void) { + adc.fast_calc(&adc); + ADC->IC_bit.SEQIC0 = 1; +} diff --git a/Vsrc/mbod.c b/Vsrc/mbod.c new file mode 100644 index 0000000..fa8b745 --- /dev/null +++ b/Vsrc/mbod.c @@ -0,0 +1,79 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file mbod.c + \brief Словарь объектов MODBUS + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2017 + +*/ + +/** \addtogroup MODBUS */ +/*@{*/ + +#include "mbod.h" +#include "main.h" + + +/* Тестовые посылки + * Формат байт в посылке: + * Номер узла 1 байт, функция 1 байт, адрес 2 байта, данные/кол-во переменных 2 байта, контрольная сумма CRC16(LH) + * Удобно тестировать, например, программой COMpump + * +01 06 07 D0 00 01 48 87 - запустить привод (запись в 2000 значения 1) +01 06 07 D1 00 64 D9 6C - задать частоту вращения (2001) равной 100 об/мин +01 06 A8 6C 00 64 68 5C - задать защиту по напряжению Udc равной 100В + +01 03 9C 42 00 01 0A 4E - запрос текущей частоты вращения +01 03 9C 76 00 01 4B 80 - запрос кодов аварий + + +В массивах: +mbodHR - переменные Holding Registers (на чтение и запись). Код функции 0x03(на чтение) 0x06(на запись) +mbodIR - переменные Input Registers (на чтение). Код функции 0x04 +mbodC - битовые переменные Coil (для записи). Код функции 0x05(на запись) +mbodDI - битовые переменные Discrete Inputs (для чтения). Код функции 0x02(на чтение) + +Первая цифра массива - адрес переменной в словаре ModBus. +Вторая - номер бита для битовых переменных в переменной контроллера. +Третья - адрес переменной. + + +*/ + +volatile MB_Record mbodHR[] = {\ + 2000, 0,(long)(&MBVarsConv.Vars.Command),/*Слово управления. 0й бит - пуск, 1й бит - стоп, 2й бит - сброс аварии */\ + 2001, 0,(long)(&MBVarsConv.Vars.speed_ref), /*Задание частоты вращения в об/мин*/\ + 40002, 0,(long)(&MBVarsConv.Vars.CurSpeed),/* Текущая частота вращения (об/мин) */\ + 40007, 0,(long)(&MBVarsConv.Vars.CurIs),/*Ток статора амплитудный (А)*/\ + 40054, 0,(long)(&MBVarsConv.Vars.Main_ErrorCode),/*Код аварии (сменяется, если аварий несколько)*/\ + 43116, 0,(long)(&MBVarsConv.Vars.Umax_protect),/*Уставка макс. напряж ЗПТ*/\ + 0,0,0 // конец массива, не удалять - по нулям определятеся размер словаря. +}; + +volatile MB_Record mbodIR[] = {\ + 0,0,0 // конец массива, не удалять - по нулям определятеся размер словаря. + }; + +volatile MB_Record mbodC[] = {\ + 0,0,0 // конец массива, не удалять - по нулям определятеся размер словаря. + }; + + + +volatile MB_Record mbodDI[] = {0,0,0 // конец массива, не удалять - по нулям определятеся размер словаря. + }; + +/*@}*/ diff --git a/Vsrc/park.c b/Vsrc/park.c new file mode 100644 index 0000000..5e8a067 --- /dev/null +++ b/Vsrc/park.c @@ -0,0 +1,47 @@ +/*! + Copyright 2017 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file park.c + \brief Модуль координатных преобразований координат (см. TPark) + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 2.0 25/03/2016 + + \addtogroup Park + @{ + */ + +#include "V_IQmath.h" /* Include header for IQmath library */ +#include "park.h" + +//! Функция преобразований координат + +//!На входе угол ang, вектор (ds,qs). +//!На выходе повернутый на заданный угол вектор (de,qe) +//! \memberof TPark +void park_calc(TPark *v) { + + _iq cos_ang, sin_ang; + + /* Using look-up IQ sine table */ + sin_ang = _IQsinPU(v->ang); + cos_ang = _IQcosPU(v->ang); + + v->de = _IQmpy(v->ds,cos_ang) + _IQmpy(v->qs, sin_ang); + v->qe = _IQmpy(v->qs,cos_ang) - _IQmpy(v->ds, sin_ang); + +} + +/*@}*/ + diff --git a/cmd/K1921VK028.ld b/cmd/K1921VK028.ld new file mode 100644 index 0000000..bef0887 --- /dev/null +++ b/cmd/K1921VK028.ld @@ -0,0 +1,190 @@ +MEMORY +{ + MFLASH (rx) : ORIGIN = 0x00000000, LENGTH = 2M + BFLASH (rx) : ORIGIN = 0x11000000, LENGTH = 512K + RAM0 (rwx) : ORIGIN = 0x13000000, LENGTH = 64K + RAM1 (rwx) : ORIGIN = 0x20000000, LENGTH = 512K + RAM2 (rwx) : ORIGIN = 0x20080000, LENGTH = 128K +} + +/* Aliases */ +REGION_ALIAS("CODE_FLASH", MFLASH); /* Replace this with BFLASH for bootloader */ +REGION_ALIAS("DATA_RAM", RAM1); +REGION_ALIAS("HEAP_RAM", RAM1); +REGION_ALIAS("STACK_RAM", RAM1); +REGION_ALIAS("BSS_RAM", RAM1); + +ENTRY(Reset_Handler) + +SECTIONS +{ + . = ORIGIN(DATA_RAM); + .isr_vector ALIGN(0x80): + { + __isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */ + __isr_vector_ram_start = .; + KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */ + . = ALIGN(4); + __isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */ + } >DATA_RAM AT>CODE_FLASH + + .fastcode ALIGN(4): { + __fastcode_flash_start = LOADADDR (.fastcode); /* Берем адрес, где на флеше лежит код. */ + /* Точка - это курсор текущего размещения в памяти. Т.е. в + * __fastcode_ram_start будет лежать адрес оперативки, где будет исполняться скопированный код.*/ + __fastcode_ram_start = .; + *(.glue_7t) *(.glue_7) + *(.fastcode) + *(.fastcode*) + . = ALIGN (4); + __fastcode_ram_end = .; /* конец оперативки, куда будет скопирован код */ + } >DATA_RAM AT>CODE_FLASH + + .text : + { + *(.text*) + + KEEP(*(.init)) + KEEP(*(.fini)) + + /* .ctors */ + *crtbegin.o(.ctors) + *crtbegin?.o(.ctors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) + *(SORT(.ctors.*)) + *(.ctors) + + /* .dtors */ + *crtbegin.o(.dtors) + *crtbegin?.o(.dtors) + *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) + *(SORT(.dtors.*)) + *(.dtors) + + *(.rodata*) + + KEEP(*(.eh_frame*)) + } > CODE_FLASH + + .ARM.extab : + { + *(.ARM.extab* .gnu.linkonce.armextab.*) + } > CODE_FLASH + + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + } > CODE_FLASH + __exidx_end = .; + + + + .copy.table : + { + . = ALIGN(4); + __copy_table_start__ = .; + + + __textdata_start__ = LOADADDR(.data); + + LONG (__textdata_start__) + LONG (__data_start__) + LONG (__data_end__ - __data_start__) + __copy_table_end__ = .; + PROVIDE(_sidata = __data_start__); + } > CODE_FLASH + + .zero.table : + { + . = ALIGN(4); + __zero_table_start__ = .; + LONG (__bss_start__) + LONG (__bss_end__ - __bss_start__) + __zero_table_end__ = .; + } > CODE_FLASH + + + .data : + { + __data_start__ = .; + PROVIDE(_sdata = __data_start__); + *(.data*) + *(.ramfunc*) + + . = ALIGN(4); + /* preinit data */ + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP(*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + + . = ALIGN(4); + /* init data */ + PROVIDE_HIDDEN (__init_array_start = .); + KEEP(*(SORT(.init_array.*))) + KEEP(*(.init_array)) + PROVIDE_HIDDEN (__init_array_end = .); + + + . = ALIGN(4); + /* finit data */ + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP(*(SORT(.fini_array.*))) + KEEP(*(.fini_array)) + PROVIDE_HIDDEN (__fini_array_end = .); + + KEEP(*(.jcr*)) + . = ALIGN(4); + /* All data end */ + __data_end__ = .; + PROVIDE(_edata = __data_end__); + + } > DATA_RAM AT > CODE_FLASH + + .bss : + { + . = ALIGN(4); + __bss_start__ = .; + PROVIDE(_sbss = __bss_start__); + *(.bss*) + *(COMMON) + . = ALIGN(4); + __bss_end__ = .; + PROVIDE(_ebss = __bss_end__); + } > BSS_RAM + + .heap (COPY): + { + __end__ = .; + PROVIDE(end = .); + *(.heap*) + __HeapLimit = .; + } > HEAP_RAM + + /* .stack_dummy section doesn't contains any symbols. It is only + * used for linker to calculate size of stack sections, and assign + * values to stack symbols later */ + .stack_dummy (COPY): + { + *(.stack*) + } > STACK_RAM + + /* Set stack top to end of STACK_RAM, and stack limit move down by + * size of stack_dummy section */ + __StackTop = ORIGIN(STACK_RAM) + LENGTH(STACK_RAM); + __StackLimit = __StackTop - SIZEOF(.stack_dummy); + PROVIDE(__stack = __StackTop); + PROVIDE(_estack = __StackTop); + + /* Check if data + heap + stack exceeds STACK_RAM limit */ + ASSERT(__StackLimit >= __HeapLimit, "region STACK_RAM overflowed with stack") + + /DISCARD/ : + { + libc.a ( * ) + libm.a ( * ) + libgcc.a ( * ) + } + +} + diff --git a/cood.xml b/cood.xml new file mode 100644 index 0000000..1c292ec --- /dev/null +++ b/cood.xml @@ -0,0 +1,5294 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/include/K1921VK028.h b/include/K1921VK028.h new file mode 100644 index 0000000..e03728c --- /dev/null +++ b/include/K1921VK028.h @@ -0,0 +1,18654 @@ +/***************************************************************************** + * @file: K1921VK028.h + * @author NIIET + * @version: V2.14 + * @date: 26.02.2019 + * @brief: K1921VK028 header file + ***************************************************************************** + *

+ * + * 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, NIIET 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. + * + *

© COPYRIGHT 2019 NIIET

+ ***************************************************************************** + * FILE K1921VK028.h + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __K1921VK028_H +#define __K1921VK028_H + +#define __I volatile const /*!< defines 'read only' permissions */ +#define __O volatile /*!< defines 'write only' permissions */ +#define __IO volatile /*!< defines 'read / write' permissions */ + +/* Start of section using anonymous unions */ +#if defined (__CC_ARM) + #pragma push + #pragma anon_unions +#elif defined (__ICCARM__) + #pragma language=extended +#elif defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wc11-extensions" + #pragma clang diagnostic ignored "-Wreserved-id-macro" +#elif defined (__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined (__TMS470__) + /* anonymous unions are enabled by default */ +#elif defined (__TASKING__) + #pragma warning 586 +#elif defined (__CSMC__) + /* anonymous unions are enabled by default */ +#elif defined (__CMCPPARM__) + /* anonymous unions are enabled by default */ +#else + #warning Not supported compiler type +#endif + +/* Configuration of the Cortex-M4F Processor and Core Peripherals */ +#define __CM4_REV 0x0001 /*!< Cortex-M4F Core Revision r0p1 */ +#define __MPU_PRESENT 1 /*!< MPU present or not */ +#define __NVIC_PRIO_BITS 4 /*!< Number of Bits used for Priority Levels */ +#define __Vendor_SysTickConfig 0 /*!< Set to 1 if different SysTick Config is used */ +#define __FPU_PRESENT 1 /*!< FPU present or not */ + +#include "stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/******************************************************************************/ +/* Interrupt Number Definition */ +/******************************************************************************/ + +typedef enum IRQn +{ +/*-- Cortex-M4F Processor Exceptions Numbers ---------------------------------*/ + NonMaskableInt_IRQn = -14, /*!< 2 Non Maskable Interrupt */ + HardFault_IRQn = -13, /*!< 3 Hard Fault Interrupt */ + SVCall_IRQn = -5, /*!< 11 SV Call Interrupt */ + PendSV_IRQn = -2, /*!< 14 Pend SV Interrupt */ + SysTick_IRQn = -1, /*!< 15 System Tick Timer Interrupt */ +/*-- Device specific Interrupt Numbers ---------------------------------------*/ + WDT_IRQn = 0, /*!< Watchdog timer interrupt */ + RCU_IRQn = 1, /*!< Reset and clock unit interrupt */ + RTC_IRQn = 2, /*!< RTC interrupt */ + MFLASH_IRQn = 3, /*!< MFLASH interrupt */ + BFLASH_IRQn = 4, /*!< BFLASH interrupt */ + GPIOA_IRQn = 5, /*!< GPIO A interrupt */ + GPIOB_IRQn = 6, /*!< GPIO B interrupt */ + GPIOC_IRQn = 7, /*!< GPIO C interrupt */ + GPIOD_IRQn = 8, /*!< GPIO D interrupt */ + GPIOE_IRQn = 9, /*!< GPIO E interrupt */ + GPIOF_IRQn = 10, /*!< GPIO F interrupt */ + GPIOG_IRQn = 11, /*!< GPIO G interrupt */ + GPIOH_IRQn = 12, /*!< GPIO H interrupt */ + GPIOJ_IRQn = 13, /*!< GPIO J interrupt */ + GPIOK_IRQn = 14, /*!< GPIO K interrupt */ + GPIOL_IRQn = 15, /*!< GPIO L interrupt */ + GPIOM_IRQn = 16, /*!< GPIO M interrupt */ + DMA_CH0_IRQn = 17, /*!< DMA channel 0 interrupt */ + DMA_CH1_IRQn = 18, /*!< DMA channel 1 interrupt */ + DMA_CH2_IRQn = 19, /*!< DMA channel 2 interrupt */ + DMA_CH3_IRQn = 20, /*!< DMA channel 3 interrupt */ + DMA_CH4_IRQn = 21, /*!< DMA channel 4 interrupt */ + DMA_CH5_IRQn = 22, /*!< DMA channel 5 interrupt */ + DMA_CH6_IRQn = 23, /*!< DMA channel 6 interrupt */ + DMA_CH7_IRQn = 24, /*!< DMA channel 7 interrupt */ + DMA_CH8_IRQn = 25, /*!< DMA channel 8 interrupt */ + DMA_CH9_IRQn = 26, /*!< DMA channel 9 interrupt */ + DMA_CH10_IRQn = 27, /*!< DMA channel 10 interrupt */ + DMA_CH11_IRQn = 28, /*!< DMA channel 11 interrupt */ + DMA_CH12_IRQn = 29, /*!< DMA channel 12 interrupt */ + DMA_CH13_IRQn = 30, /*!< DMA channel 13 interrupt */ + DMA_CH14_IRQn = 31, /*!< DMA channel 14 interrupt */ + DMA_CH15_IRQn = 32, /*!< DMA channel 15 interrupt */ + DMA_CH16_IRQn = 33, /*!< DMA channel 16 interrupt */ + DMA_CH17_IRQn = 34, /*!< DMA channel 17 interrupt */ + DMA_CH18_IRQn = 35, /*!< DMA channel 18 interrupt */ + DMA_CH19_IRQn = 36, /*!< DMA channel 19 interrupt */ + DMA_CH20_IRQn = 37, /*!< DMA channel 20 interrupt */ + DMA_CH21_IRQn = 38, /*!< DMA channel 21 interrupt */ + DMA_CH22_IRQn = 39, /*!< DMA channel 22 interrupt */ + DMA_CH23_IRQn = 40, /*!< DMA channel 23 interrupt */ + DMA_CH24_IRQn = 41, /*!< DMA channel 24 interrupt */ + DMA_CH25_IRQn = 42, /*!< DMA channel 25 interrupt */ + DMA_CH26_IRQn = 43, /*!< DMA channel 26 interrupt */ + DMA_CH27_IRQn = 44, /*!< DMA channel 27 interrupt */ + DMA_CH28_IRQn = 45, /*!< DMA channel 28 interrupt */ + DMA_CH29_IRQn = 46, /*!< DMA channel 29 interrupt */ + DMA_CH30_IRQn = 47, /*!< DMA channel 30 interrupt */ + DMA_CH31_IRQn = 48, /*!< DMA channel 31 interrupt */ + TMR0_IRQn = 49, /*!< Timer 0 interrupt */ + TMR1_IRQn = 50, /*!< Timer 1 interrupt */ + TMR2_IRQn = 51, /*!< Timer 2 interrupt */ + TMR3_IRQn = 52, /*!< Timer 3 interrupt */ + ETMR0_IRQn = 53, /*!< Enhanced Timer 0 interrupt */ + ETMR1_IRQn = 54, /*!< Enhanced Timer 1 interrupt */ + ETMR2_IRQn = 55, /*!< Enhanced Timer 2 interrupt */ + ETMR3_IRQn = 56, /*!< Enhanced Timer 3 interrupt */ + UART0_TD_IRQn = 57, /*!< UART0 Transmit Done interrupt */ + UART0_MS_IRQn = 58, /*!< UART0 Modem interrupt */ + UART0_RX_IRQn = 59, /*!< UART0 Recieve interrupt */ + UART0_TX_IRQn = 60, /*!< UART0 Transmit interrupt */ + UART0_RT_IRQn = 61, /*!< UART0 Recieve interrupt */ + UART0_E_IRQn = 62, /*!< UART0 Error interrupt */ + UART0_IRQn = 63, /*!< UART0 interrupt */ + UART1_TD_IRQn = 64, /*!< UART1 Transmit Done interrupt */ + UART1_MS_IRQn = 65, /*!< UART1 Modem interrupt */ + UART1_RX_IRQn = 66, /*!< UART1 Recieve interrupt */ + UART1_TX_IRQn = 67, /*!< UART1 Transmit interrupt */ + UART1_RT_IRQn = 68, /*!< UART1 Recieve interrupt */ + UART1_E_IRQn = 69, /*!< UART1 Error interrupt */ + UART1_IRQn = 70, /*!< UART1 interrupt */ + UART2_TD_IRQn = 71, /*!< UART2 Transmit Done interrupt */ + UART2_MS_IRQn = 72, /*!< UART2 Modem interrupt */ + UART2_RX_IRQn = 73, /*!< UART2 Recieve interrupt */ + UART2_TX_IRQn = 74, /*!< UART2 Transmit interrupt */ + UART2_RT_IRQn = 75, /*!< UART2 Recieve interrupt */ + UART2_E_IRQn = 76, /*!< UART2 Error interrupt */ + UART2_IRQn = 77, /*!< UART2 interrupt */ + UART3_TD_IRQn = 78, /*!< UART3 Transmit Done interrupt */ + UART3_MS_IRQn = 79, /*!< UART3 Modem interrupt */ + UART3_RX_IRQn = 80, /*!< UART3 Recieve interrupt */ + UART3_TX_IRQn = 81, /*!< UART3 Transmit interrupt */ + UART3_RT_IRQn = 82, /*!< UART3 Recieve interrupt */ + UART3_E_IRQn = 83, /*!< UART3 Error interrupt */ + UART3_IRQn = 84, /*!< UART3 interrupt */ + TUART0_RX_IRQn = 85, /*!< Tiny UART0 Receive interrupt */ + TUART0_TX_IRQn = 86, /*!< Tiny UART0 Transmit interrupt */ + TUART0_RO_IRQn = 87, /*!< Tiny UART0 Receive Overrun interrupt*/ + TUART0_TO_IRQn = 88, /*!< Tiny UART0 Transmit Overrun interrupt*/ + TUART0_IRQn = 89, /*!< Tiny UART0 interrupt */ + TUART1_RX_IRQn = 90, /*!< Tiny UART1 Receive interrupt */ + TUART1_TX_IRQn = 91, /*!< Tiny UART1 Transmit interrupt */ + TUART1_RO_IRQn = 92, /*!< Tiny UART1 Receive Overrun interrupt*/ + TUART1_TO_IRQn = 93, /*!< Tiny UART1 Transmit Overrun interrupt*/ + TUART1_IRQn = 94, /*!< Tiny UART1 interrupt */ + SPI0_IRQn = 95, /*!< SPI0 interrupt */ + SPI0_RX_IRQn = 96, /*!< SPI0 Receive interrupt */ + SPI0_TX_IRQn = 97, /*!< SPI0 Transmit interrupt */ + SPI0_RO_IRQn = 98, /*!< SPI0 Receive Overrun interrupt */ + SPI0_RT_IRQn = 99, /*!< SPI0 Receive Timeout interrupt */ + SPI1_IRQn = 100, /*!< SPI1 interrupt */ + SPI1_RX_IRQn = 101, /*!< SPI1 Receive interrupt */ + SPI1_TX_IRQn = 102, /*!< SPI1 Transmit interrupt */ + SPI1_RO_IRQn = 103, /*!< SPI1 Receive Overrun interrupt */ + SPI1_RT_IRQn = 104, /*!< SPI1 Receive Timeout interrupt */ + SPI2_IRQn = 105, /*!< SPI2 interrupt */ + SPI2_RX_IRQn = 106, /*!< SPI2 Receive interrupt */ + SPI2_TX_IRQn = 107, /*!< SPI2 Transmit interrupt */ + SPI2_RO_IRQn = 108, /*!< SPI2 Receive Overrun interrupt */ + SPI2_RT_IRQn = 109, /*!< SPI2 Receive Timeout interrupt */ + SPI3_IRQn = 110, /*!< SPI3 interrupt */ + SPI3_RX_IRQn = 111, /*!< SPI3 Receive interrupt */ + SPI3_TX_IRQn = 112, /*!< SPI3 Transmit interrupt */ + SPI3_RO_IRQn = 113, /*!< SPI3 Receive Overrun interrupt */ + SPI3_RT_IRQn = 114, /*!< SPI3 Receive Timeout interrupt */ + I2C0_IRQn = 115, /*!< I2C0 interrupt */ + I2C1_IRQn = 116, /*!< I2C1 interrupt */ + SPWR0_IRQn = 117, /*!< SpaceWire0 interrupt */ + SPWR1_IRQn = 118, /*!< SpaceWire1 interrupt */ + MILSTD0_IRQn = 119, /*!< MIL-STD 1553 0 interrupt */ + MILSTD1_IRQn = 120, /*!< MIL-STD 1553 1 interrupt */ + ECAP0_IRQn = 121, /*!< Capture Unit 0 interrupt */ + ECAP1_IRQn = 122, /*!< Capture Unit 1 interrupt */ + ECAP2_IRQn = 123, /*!< Capture Unit 2 interrupt */ + ECAP3_IRQn = 124, /*!< Capture Unit 3 interrupt */ + ECAP4_IRQn = 125, /*!< Capture Unit 4 interrupt */ + ECAP5_IRQn = 126, /*!< Capture Unit 5 interrupt */ + PWM0_IRQn = 127, /*!< PWM0 interrupt */ + PWM0_HD_IRQn = 128, /*!< PWM0 HD interrupt */ + PWM0_TZ_IRQn = 129, /*!< PWM0 TZ interrupt */ + PWM1_IRQn = 130, /*!< PWM1 interrupt */ + PWM1_HD_IRQn = 131, /*!< PWM1 HD interrupt */ + PWM1_TZ_IRQn = 132, /*!< PWM1 TZ interrupt */ + PWM2_IRQn = 133, /*!< PWM2 interrupt */ + PWM2_HD_IRQn = 134, /*!< PWM2 HD interrupt */ + PWM2_TZ_IRQn = 135, /*!< PWM2 TZ interrupt */ + PWM3_IRQn = 136, /*!< PWM3 interrupt */ + PWM3_HD_IRQn = 137, /*!< PWM3 HD interrupt */ + PWM3_TZ_IRQn = 138, /*!< PWM3 TZ interrupt */ + PWM4_IRQn = 139, /*!< PWM4 interrupt */ + PWM4_HD_IRQn = 140, /*!< PWM4 HD interrupt */ + PWM4_TZ_IRQn = 141, /*!< PWM4 TZ interrupt */ + PWM5_IRQn = 142, /*!< PWM5 interrupt */ + PWM5_HD_IRQn = 143, /*!< PWM5 HD interrupt */ + PWM5_TZ_IRQn = 144, /*!< PWM5 TZ interrupt */ + PWM6_IRQn = 145, /*!< PWM6 interrupt */ + PWM6_HD_IRQn = 146, /*!< PWM6 HD interrupt */ + PWM6_TZ_IRQn = 147, /*!< PWM6 TZ interrupt */ + PWM7_IRQn = 148, /*!< PWM7 interrupt */ + PWM7_HD_IRQn = 149, /*!< PWM7 HD interrupt */ + PWM7_TZ_IRQn = 150, /*!< PWM7 TZ interrupt */ + PWM8_IRQn = 151, /*!< PWM8 interrupt */ + PWM8_HD_IRQn = 152, /*!< PWM8 HD interrupt */ + PWM8_TZ_IRQn = 153, /*!< PWM8 TZ interrupt */ + PWM9_IRQn = 154, /*!< PWM9 interrupt */ + PWM9_HD_IRQn = 155, /*!< PWM9 HD interrupt */ + PWM9_TZ_IRQn = 156, /*!< PWM9 TZ interrupt */ + QEP0_IRQn = 157, /*!< QEP0 interrupt */ + QEP1_IRQn = 158, /*!< QEP1 interrupt */ + QEP2_IRQn = 159, /*!< QEP2 interrupt */ + QEP3_IRQn = 160, /*!< QEP3 interrupt */ + ADC_SEQ0_IRQn = 161, /*!< ADC Sequencer 0 interrupt */ + ADC_SEQ1_IRQn = 162, /*!< ADC Sequencer 1 interrupt */ + ADC_SEQ2_IRQn = 163, /*!< ADC Sequencer 2 interrupt */ + ADC_SEQ3_IRQn = 164, /*!< ADC Sequencer 3 interrupt */ + ADC_SEQ4_IRQn = 165, /*!< ADC Sequencer 4 interrupt */ + ADC_SEQ5_IRQn = 166, /*!< ADC Sequencer 5 interrupt */ + ADC_SEQ6_IRQn = 167, /*!< ADC Sequencer 6 interrupt */ + ADC_SEQ7_IRQn = 168, /*!< ADC Sequencer 7 interrupt */ + ADC_DC_IRQn = 169, /*!< ADC Digital Comparator interrupt */ + ETH_IRQn = 170, /*!< Ethernet interrupt */ + CAN0_IRQn = 171, /*!< CAN0 interrupt */ + CAN1_IRQn = 172, /*!< CAN1 interrupt */ + CAN2_IRQn = 173, /*!< CAN2 interrupt */ + CAN3_IRQn = 174, /*!< CAN3 interrupt */ + CAN4_IRQn = 175, /*!< CAN4 interrupt */ + CAN5_IRQn = 176, /*!< CAN5 interrupt */ + CAN6_IRQn = 177, /*!< CAN6 interrupt */ + CAN7_IRQn = 178, /*!< CAN7 interrupt */ + CAN8_IRQn = 179, /*!< CAN8 interrupt */ + CAN9_IRQn = 180, /*!< CAN9 interrupt */ + CAN10_IRQn = 181, /*!< CAN10 interrupt */ + CAN11_IRQn = 182, /*!< CAN11 interrupt */ + CAN12_IRQn = 183, /*!< CAN12 interrupt */ + CAN13_IRQn = 184, /*!< CAN13 interrupt */ + CAN14_IRQn = 185, /*!< CAN14 interrupt */ + CAN15_IRQn = 186, /*!< CAN15 interrupt */ + FPU_IRQn = 187, /*!< FPU exception interrupt */ + TMU_IRQn = 188, /*!< TMU interrupt */ + LAU_IRQn = 189, /*!< LAU interrupt */ + SDFM_IRQn = 190, /*!< SDFM interrupt */ + OWI0_IRQn = 191, /*!< OWI0 interrupt */ + OWI1_IRQn = 192, /*!< OWI1 interrupt */ +} IRQn_Type; + +#include /* Cortex-M4 processor and core peripherals */ +#include /* System initialization */ + +/******************************************************************************/ +/* System Specific Defenitions */ +/******************************************************************************/ +/*-- System memory ----------------------------------------------------------*/ +#define MEM_MFLASH_BASE 0x10000000UL +#define MEM_MFLASH_BUS_WIDTH_WORDS 16UL +#define MEM_MFLASH_PAGE_SIZE 16384UL +#define MEM_MFLASH_PAGE_SIZE_LOG2 14UL +#define MEM_MFLASH_PAGE_TOTAL 128UL +#define MEM_MFLASH_SIZE (MEM_MFLASH_PAGE_TOTAL*MEM_MFLASH_PAGE_SIZE) +#define MEM_MFLASH_NVR_PAGE_SIZE (MEM_MFLASH_PAGE_SIZE) +#define MEM_MFLASH_NVR_PAGE_SIZE_LOG2 (MEM_MFLASH_PAGE_SIZE_LOG2) +#define MEM_MFLASH_NVR_PAGE_TOTAL 4UL +#define MEM_MFLASH_NVR_SIZE (MEM_MFLASH_NVR_PAGE_TOTAL*MEM_MFLASH_NVR_PAGE_SIZE) +#define MEM_BFLASH_BASE 0x11000000UL +#define MEM_BFLASH_BUS_WIDTH_WORDS 4UL +#define MEM_BFLASH_PAGE_SIZE 4096UL +#define MEM_BFLASH_PAGE_SIZE_LOG2 12UL +#define MEM_BFLASH_PAGE_TOTAL 128UL +#define MEM_BFLASH_SIZE (MEM_BFLASH_PAGE_TOTAL*MEM_BFLASH_PAGE_SIZE) +#define MEM_BFLASH_NVR_PAGE_SIZE (MEM_BFLASH_PAGE_SIZE) +#define MEM_BFLASH_NVR_PAGE_SIZE_LOG2 (MEM_BFLASH_PAGE_SIZE_LOG2) +#define MEM_BFLASH_NVR_PAGE_TOTAL 4UL +#define MEM_BFLASH_NVR_SIZE (MEM_BFLASH_NVR_PAGE_TOTAL*MEM_BFLASH_NVR_PAGE_SIZE) +#define MEM_RAM0_BASE 0x13000000UL +#define MEM_RAM0_SIZE 0x10000UL +#define MEM_RAM1_BASE 0x20000000UL +#define MEM_RAM1_SIZE 0x80000UL +#define MEM_RAM2_BASE 0x20080000UL +#define MEM_RAM2_SIZE 0x20000UL +#define MEM_EXT0_BASE 0x80000000UL +#define MEM_EXT1_BASE 0x81000000UL +#define MEM_EXT2_BASE 0x82000000UL +#define MEM_EXT3_BASE 0x83000000UL +#define MEM_EXT4_BASE 0x84000000UL +#define MEM_EXT5_BASE 0x85000000UL +#define MEM_EXT6_BASE 0x86000000UL +#define MEM_EXT7_BASE 0x87000000UL +#define MEM_EXT_SIZE 0x1000000UL + +/*-- CFGWORD: System configure word -----------------------------------------*/ +#define CFGWORD0_BASE 0x00000FF0UL + +typedef struct { + uint32_t RDC : 4; /*!< External memory read cycle length (default 0xF - 16 cycles) */ + uint32_t WRC : 4; /*!< External memory write cycle length (default 0xF - 16 cycles) */ + uint32_t MASK : 24; /*!< External memory address mask (default 0xFFFFF - all bits masked) */ +} CFGWORD0_bits; + +/* Bit field positions: */ +#define CFGWORD0_RDC_Pos 0 /*!< External memory read cycle length (default 0xF - 16 cycles) */ +#define CFGWORD0_WRC_Pos 4 /*!< External memory write cycle length (default 0xF - 16 cycles) */ +#define CFGWORD0_MASK_Pos 8 /*!< External memory address mask (default 0xFFFFF - all bits masked) */ + +/* Bit field masks: */ +#define CFGWORD0_RDC_Msk 0x0000000FUL /*!< External memory read cycle length (default 0xF - 16 cycles) */ +#define CFGWORD0_WRC_Msk 0x000000F0UL /*!< External memory write cycle length (default 0xF - 16 cycles) */ +#define CFGWORD0_MASK_Msk 0xFFFFFF00UL /*!< External memory address mask (default 0xFFFFF - all bits masked) */ + +#define CFGWORD1_BASE 0x00000FF4UL + +typedef struct { + uint32_t TAC : 4; /*!< External memory turnaround cycle length (default 0xF - 16 cycles) */ + uint32_t MODE : 1; /*!< External memory bit mode (default 1 - 16 bit; 0 - 8 bit) */ + uint32_t AF : 1; /*!< External memory GPIO alternative function (default 1 - AF1; 0 - AF0) */ + uint32_t MFLASHWE : 1; /*!< Main MFLASH region write enable (default 1 - enabled) */ + uint32_t MNVRWE : 1; /*!< NVR MFLASH region write enable (default 1 - enabled) */ + uint32_t BFLASHWE : 1; /*!< Main BFLASH region write enable (default 1 - enabled) */ + uint32_t BNVRWE : 1; /*!< NVR BFLASH region write enable (default 1 - enabled) */ + uint32_t JTAGEN : 1; /*!< Enable JTAG pins (default 1 - enabled) */ + uint32_t DEBUGEN : 1; /*!< Enable core debug (default 1 - enabled) */ +} CFGWORD1_bits; + +/* Bit field positions: */ +#define CFGWORD1_TAC_Pos 0 /*!< External memory turnaround cycle length (default 0xF - 16 cycles) */ +#define CFGWORD1_MODE_Pos 4 /*!< External memory bit mode (default 1 - 16 bit; 0 - 8 bit) */ +#define CFGWORD1_AF_Pos 5 /*!< External memory GPIO alternative function (default 1 - AF1; 0 - AF0) */ +#define CFGWORD1_MFLASHWE_Pos 6 /*!< Main flash region write enable (default 1 - enabled) */ +#define CFGWORD1_MNVRWE_Pos 7 /*!< NVR flash region write enable (default 1 - enabled) */ +#define CFGWORD1_BFLASHWE_Pos 8 /*!< Main flash region write enable (default 1 - enabled) */ +#define CFGWORD1_BNVRWE_Pos 9 /*!< NVR flash region write enable (default 1 - enabled) */ +#define CFGWORD1_JTAGEN_Pos 10 /*!< Enable JTAG pins (default 1 - enabled) */ +#define CFGWORD1_DEBUGEN_Pos 11 /*!< Enable core debug (default 1 - enabled) */ + +/* Bit field masks: */ +#define CFGWORD1_TAC_Msk 0x0000000FUL /*!< External memory turnaround cycle length (default 0xF - 16 cycles) */ +#define CFGWORD1_MODE_Msk 0x00000010UL /*!< External memory bit mode (default 1 - 16 bit; 0 - 8 bit) */ +#define CFGWORD1_AF_Msk 0x00000020UL /*!< External memory GPIO alternative function (default 1 - AF1; 0 - AF0) */ +#define CFGWORD1_MFLASHWE_Msk 0x00000040UL /*!< Main flash region write enable (default 1 - enabled) */ +#define CFGWORD1_MNVRWE_Msk 0x00000080UL /*!< NVR flash region write enable (default 1 - enabled) */ +#define CFGWORD1_BFLASHWE_Msk 0x00000100UL /*!< Main flash region write enable (default 1 - enabled) */ +#define CFGWORD1_BNVRWE_Msk 0x00000200UL /*!< NVR flash region write enable (default 1 - enabled) */ +#define CFGWORD1_JTAGEN_Msk 0x00000400UL /*!< Enable JTAG pins (default 1 - enabled) */ +#define CFGWORD1_DEBUGEN_Msk 0x00000800UL /*!< Enable core debug (default 1 - enabled) */ + +/*-- CHANNEL_CFG: DMA channel configure word --------------------------------*/ +typedef struct { + uint32_t CYCLE_CTRL : 3; /*!< The operating mode of the DMA cycle */ + uint32_t NEXT_USEBURST : 1; /*!< Controls if the DMA->USEBURSTSET bit is set to a 1 */ + uint32_t N_MINUS_1 : 10; /*!< The total number of DMA transfers that the DMA cycle contains */ + uint32_t R_POWER : 4; /*!< Control how many DMA transfers can occur before the controller rearbitrates (2^R_POWER, 1024 max) */ + uint32_t SRC_PROT_PRIV : 1; /*!< Bus protection when the controller reads the source data: privileged access */ + uint32_t SRC_PROT_BUFF : 1; /*!< Bus protection when the controller reads the source data: bufferable access */ + uint32_t SRC_PROT_CACHE : 1; /*!< Bus protection when the controller reads the source data: cacheable access */ + uint32_t DST_PROT_PRIV : 1; /*!< Bus protection when the controller writes the destination data: privileged access */ + uint32_t DST_PROT_BUFF : 1; /*!< Bus protection when the controller writes the destination data: bufferable access */ + uint32_t DST_PROT_CACHE : 1; /*!< Bus protection when the controller writes the destination data: cacheable access */ + uint32_t SRC_SIZE : 2; /*!< Size of the source data */ + uint32_t SRC_INC : 2; /*!< Source address increment */ + uint32_t DST_SIZE : 2; /*!< Destination data size */ + uint32_t DST_INC : 2; /*!< Destination address increment */ +} _CHANNEL_CFG_bits; + +/* Bit field positions: */ +#define DMA_CHANNEL_CFG_CYCLE_CTRL_Pos 0 /*!< The operating mode of the DMA cycle */ +#define DMA_CHANNEL_CFG_NEXT_USEBURST_Pos 3 /*!< Controls if the DMA->USEBURSTSET bit is set to a 1 */ +#define DMA_CHANNEL_CFG_N_MINUS_1_Pos 4 /*!< The total number of DMA transfers that the DMA cycle contains */ +#define DMA_CHANNEL_CFG_R_POWER_Pos 14 /*!< Control how many DMA transfers can occur before the controller rearbitrates */ +#define DMA_CHANNEL_CFG_SRC_PROT_PRIV_Pos 18 /*!< Bus protection when the controller reads the source data: privileged access */ +#define DMA_CHANNEL_CFG_SRC_PROT_BUFF_Pos 19 /*!< Bus protection when the controller reads the source data: bufferable access */ +#define DMA_CHANNEL_CFG_SRC_PROT_CACHE_Pos 20 /*!< Bus protection when the controller reads the source data: cacheable access */ +#define DMA_CHANNEL_CFG_DST_PROT_PRIV_Pos 21 /*!< Bus protection when the controller writes the destination data: privileged access */ +#define DMA_CHANNEL_CFG_DST_PROT_BUFF_Pos 22 /*!< Bus protection when the controller writes the destination data: bufferable access */ +#define DMA_CHANNEL_CFG_DST_PROT_CACHE_Pos 23 /*!< Bus protection when the controller writes the destination data: cacheable access */ +#define DMA_CHANNEL_CFG_SRC_SIZE_Pos 24 /*!< Size of the source data */ +#define DMA_CHANNEL_CFG_SRC_INC_Pos 26 /*!< Source address increment */ +#define DMA_CHANNEL_CFG_DST_SIZE_Pos 28 /*!< Destination data size */ +#define DMA_CHANNEL_CFG_DST_INC_Pos 30 /*!< Destination address increment */ + +/* Bit field masks: */ +#define DMA_CHANNEL_CFG_CYCLE_CTRL_Msk 0x00000007UL /*!< The operating mode of the DMA cycle */ +#define DMA_CHANNEL_CFG_NEXT_USEBURST_Msk 0x00000008UL /*!< Controls if the DMA->USEBURSTSET bit is set to a 1 */ +#define DMA_CHANNEL_CFG_N_MINUS_1_Msk 0x00003FF0UL /*!< The total number of DMA transfers that the DMA cycle contains */ +#define DMA_CHANNEL_CFG_R_POWER_Msk 0x0003C000UL /*!< Control how many DMA transfers can occur before the controller rearbitrates */ +#define DMA_CHANNEL_CFG_SRC_PROT_PRIV_Msk 0x00040000UL /*!< Bus protection when the controller reads the source data: privileged access */ +#define DMA_CHANNEL_CFG_SRC_PROT_BUFF_Msk 0x00080000UL /*!< Bus protection when the controller reads the source data: bufferable access */ +#define DMA_CHANNEL_CFG_SRC_PROT_CACHE_Msk 0x00100000UL /*!< Bus protection when the controller reads the source data: cacheable access */ +#define DMA_CHANNEL_CFG_DST_PROT_PRIV_Msk 0x00200000UL /*!< Bus protection when the controller writes the destination data: privileged access */ +#define DMA_CHANNEL_CFG_DST_PROT_BUFF_Msk 0x00400000UL /*!< Bus protection when the controller writes the destination data: bufferable access */ +#define DMA_CHANNEL_CFG_DST_PROT_CACHE_Msk 0x00800000UL /*!< Bus protection when the controller writes the destination data: cacheable access */ +#define DMA_CHANNEL_CFG_SRC_SIZE_Msk 0x03000000UL /*!< Size of the source data */ +#define DMA_CHANNEL_CFG_SRC_INC_Msk 0x0C000000UL /*!< Source address increment */ +#define DMA_CHANNEL_CFG_DST_SIZE_Msk 0x30000000UL /*!< Destination data size */ +#define DMA_CHANNEL_CFG_DST_INC_Msk 0xC0000000UL /*!< Destination address increment */ + +/* Bit field enums: */ +typedef enum { + DMA_CHANNEL_CFG_CYCLE_CTRL_Stop = 0x0UL, /*!< Stop */ + DMA_CHANNEL_CFG_CYCLE_CTRL_Basic = 0x1UL, /*!< Basic */ + DMA_CHANNEL_CFG_CYCLE_CTRL_AutoReq = 0x2UL, /*!< Auto-request */ + DMA_CHANNEL_CFG_CYCLE_CTRL_PingPong = 0x3UL, /*!< Ping-pong */ + DMA_CHANNEL_CFG_CYCLE_CTRL_MemScatGathPrim = 0x4UL, /*!< Memory scatter-gather for primary structure */ + DMA_CHANNEL_CFG_CYCLE_CTRL_MemScatGathAlt = 0x5UL, /*!< Memory scatter-gather for alternative structure */ + DMA_CHANNEL_CFG_CYCLE_CTRL_PeriphScatGathPrim = 0x6UL, /*!< Peripheral scatter-gather for primary structure */ + DMA_CHANNEL_CFG_CYCLE_CTRL_PeriphScatGathAlt = 0x7UL, /*!< Peripheral scatter-gather for alternative structure */ +} DMA_CHANNEL_CFG_CYCLE_CTRL_Enum; + +typedef enum { + DMA_CHANNEL_CFG_SRC_SIZE_Byte = 0x0UL, /*!< 8 bit */ + DMA_CHANNEL_CFG_SRC_SIZE_Halfword = 0x1UL, /*!< 16 bit */ + DMA_CHANNEL_CFG_SRC_SIZE_Word = 0x2UL, /*!< 32 bit */ +} DMA_CHANNEL_CFG_SRC_SIZE_Enum; + +typedef enum { + DMA_CHANNEL_CFG_SRC_INC_Byte = 0x0UL, /*!< 8 bit */ + DMA_CHANNEL_CFG_SRC_INC_Halfword = 0x1UL, /*!< 16 bit */ + DMA_CHANNEL_CFG_SRC_INC_Word = 0x2UL, /*!< 32 bit */ + DMA_CHANNEL_CFG_SRC_INC_None = 0x3UL, /*!< No increment */ +} DMA_CHANNEL_CFG_SRC_INC_Enum; + +typedef enum { + DMA_CHANNEL_CFG_DST_SIZE_Byte = 0x0UL, /*!< 8 bit */ + DMA_CHANNEL_CFG_DST_SIZE_Halfword = 0x1UL, /*!< 16 bit */ + DMA_CHANNEL_CFG_DST_SIZE_Word = 0x2UL, /*!< 32 bit */ +} DMA_CHANNEL_CFG_DST_SIZE_Enum; + +typedef enum { + DMA_CHANNEL_CFG_DST_INC_Byte = 0x0UL, /*!< 8 bit */ + DMA_CHANNEL_CFG_DST_INC_Halfword = 0x1UL, /*!< 16 bit */ + DMA_CHANNEL_CFG_DST_INC_Word = 0x2UL, /*!< 32 bit */ + DMA_CHANNEL_CFG_DST_INC_None = 0x3UL, /*!< No increment */ +} DMA_CHANNEL_CFG_DST_INC_Enum; + +/*-- DMA channel structure --------------------------------------------------*/ +typedef struct +{ + __IO uint32_t SRC_DATA_END_PTR; /*!< Source data end pointer */ + __IO uint32_t DST_DATA_END_PTR; /*!< Destination data end pointer */ + union { + __IO uint32_t CHANNEL_CFG; /*!< Channel configure word */ + __IO _CHANNEL_CFG_bits CHANNEL_CFG_bit; /*!< channel configure word: bit access */ + }; + __IO uint32_t RESERVED; +} DMA_Channel_TypeDef; + +/*-- DMA control structure --------------------------------------------------*/ +typedef struct +{ + DMA_Channel_TypeDef CH[32]; /*!< Control structure channels */ +} DMA_CtrlStruct_TypeDef; + +#define DMA_CH_UART0TX 0 /*!< UART0 TX DMA channel */ +#define DMA_CH_UART1TX 1 /*!< UART1 TX DMA channel */ +#define DMA_CH_UART2TX 2 /*!< UART2 TX DMA channel */ +#define DMA_CH_UART3TX 3 /*!< UART3 TX DMA channel */ +#define DMA_CH_UART0RX 4 /*!< UART0 RX DMA channel */ +#define DMA_CH_UART1RX 5 /*!< UART1 RX DMA channel */ +#define DMA_CH_UART2RX 6 /*!< UART2 RX DMA channel */ +#define DMA_CH_UART3RX 7 /*!< UART3 RX DMA channel */ +#define DMA_CH_SPI0TX 8 /*!< SPI0 TX DMA channel */ +#define DMA_CH_SPI1TX 9 /*!< SPI1 TX DMA channel */ +#define DMA_CH_SPI2TX 10 /*!< SPI2 TX DMA channel */ +#define DMA_CH_SPI3TX 11 /*!< SPI3 TX DMA channel */ +#define DMA_CH_SPI0RX 12 /*!< SPI0 RX DMA channel */ +#define DMA_CH_SPI1RX 13 /*!< SPI1 RX DMA channel */ +#define DMA_CH_SPI2RX 14 /*!< SPI2 RX DMA channel */ +#define DMA_CH_SPI3RX 15 /*!< SPI3 RX DMA channel */ +#define DMA_CH_ADCSEQ0 16 /*!< ADC sequencer 0 DMA channel */ +#define DMA_CH_ADCSEQ1 17 /*!< ADC sequencer 1 DMA channel */ +#define DMA_CH_ADCSEQ2 18 /*!< ADC sequencer 2 DMA channel */ +#define DMA_CH_ADCSEQ3 19 /*!< ADC sequencer 3 DMA channel */ +#define DMA_CH_ADCSEQ4 20 /*!< ADC sequencer 4 DMA channel */ +#define DMA_CH_ADCSEQ5 21 /*!< ADC sequencer 5 DMA channel */ +#define DMA_CH_ADCSEQ6 22 /*!< ADC sequencer 6 DMA channel */ +#define DMA_CH_ADCSEQ7 23 /*!< ADC sequencer 7 DMA channel */ +#define DMA_CH_GPIOA 24 /*!< GPIOA DMA channel */ +#define DMA_CH_GPIOB 25 /*!< GPIOB DMA channel */ +#define DMA_CH_GPIOC 26 /*!< GPIOC DMA channel */ +#define DMA_CH_GPIOD 27 /*!< GPIOD DMA channel */ +#define DMA_CH_GPIOE 28 /*!< GPIOE DMA channel */ +#define DMA_CH_GPIOF 29 /*!< GPIOF DMA channel */ +#define DMA_CH_GPIOG 30 /*!< GPIOG DMA channel */ +#define DMA_CH_GPIOH 31 /*!< GPIOH DMA channel */ +#define DMA_CH_GPIOJ 27 /*!< GPIOJ DMA channel */ +#define DMA_CH_GPIOK 27 /*!< GPIOK DMA channel */ +#define DMA_CH_GPIOL 31 /*!< GPIOL DMA channel */ +#define DMA_CH_GPIOM 31 /*!< GPIOM DMA channel */ +#define DMA_CH_TMR0 24 /*!< TMR0 DMA channel */ +#define DMA_CH_TMR1 25 /*!< TMR1 DMA channel */ +#define DMA_CH_TMR2 26 /*!< TMR2 DMA channel */ +#define DMA_CH_TMR3 27 /*!< TMR3 DMA channel */ +#define DMA_CH_ETMR0 28 /*!< EMR0 DMA channel */ +#define DMA_CH_ETMR1 29 /*!< EMR1 DMA channel */ +#define DMA_CH_ETMR2 30 /*!< EMR2 DMA channel */ +#define DMA_CH_ETMR3 31 /*!< EMR3 DMA channel */ +#define DMA_CH_PWM0A 24 /*!< PWM0A DMA channel */ +#define DMA_CH_PWM1A 24 /*!< PWM1A DMA channel */ +#define DMA_CH_PWM2A 25 /*!< PWM2A DMA channel */ +#define DMA_CH_PWM3A 25 /*!< PWM3A DMA channel */ +#define DMA_CH_PWM4A 26 /*!< PWM4A DMA channel */ +#define DMA_CH_PWM5A 26 /*!< PWM5A DMA channel */ +#define DMA_CH_PWM6A 27 /*!< PWM6A DMA channel */ +#define DMA_CH_PWM7A 27 /*!< PWM7A DMA channel */ +#define DMA_CH_PWM8A 24 /*!< PWM8A DMA channel */ +#define DMA_CH_PWM9A 24 /*!< PWM9A DMA channel */ +#define DMA_CH_PWM0B 28 /*!< PWM0B DMA channel */ +#define DMA_CH_PWM1B 28 /*!< PWM1B DMA channel */ +#define DMA_CH_PWM2B 29 /*!< PWM2B DMA channel */ +#define DMA_CH_PWM3B 29 /*!< PWM3B DMA channel */ +#define DMA_CH_PWM4B 30 /*!< PWM4B DMA channel */ +#define DMA_CH_PWM5B 30 /*!< PWM5B DMA channel */ +#define DMA_CH_PWM6B 31 /*!< PWM6B DMA channel */ +#define DMA_CH_PWM7B 31 /*!< PWM7B DMA channel */ +#define DMA_CH_PWM8B 28 /*!< PWM8B DMA channel */ +#define DMA_CH_PWM9B 28 /*!< PWM9B DMA channel */ +#define DMA_CH_SDFM0 25 /*!< SDFM0 DMA channel */ +#define DMA_CH_SDFM1 26 /*!< SDFM1 DMA channel */ +#define DMA_CH_SDFM2 29 /*!< SDFM2 DMA channel */ +#define DMA_CH_SDFM3 30 /*!< SDFM3 DMA channel */ +#define DMA_CH_QEP0 25 /*!< QEP0 DMA channel */ +#define DMA_CH_QEP1 26 /*!< QEP1 DMA channel */ +#define DMA_CH_QEP2 29 /*!< QEP2 DMA channel */ +#define DMA_CH_QEP3 30 /*!< QEP3 DMA channel */ + +/*-- DMA control data summary -----------------------------------------------*/ +/*!< WARNING: struct should be 1024 byte aligned! Allowed addresses 0xXXXXX000, 0xXXXXX400, 0xXXXXX800, etc */ +typedef struct +{ + DMA_CtrlStruct_TypeDef PRM_DATA; /*!< Primary control structure */ + DMA_CtrlStruct_TypeDef ALT_DATA; /*!< Alternative control structure */ +} DMA_CtrlData_TypeDef; + +/*-- SpaceWire RX descriptor CTRL structure --------------------------------*/ +typedef struct +{ + uint32_t PKTLEN : 25; /*!< Packet length */ + uint32_t EN : 1; /*!< Enable */ + uint32_t WR : 1; /*!< Wrap */ + uint32_t IE : 1; /*!< Interrupt enable */ + uint32_t EP : 1; /*!< EEP termination */ + uint32_t : 2; /*!< RESERVED */ + uint32_t TR : 1; /*!< Packet truncated */ +} _SPWR_RXD_CTRL_bits; + +/* Bit field positions: */ +#define SPWR_RXD_CTRL_PKTLEN_Pos 0 /*!< Packet length */ +#define SPWR_RXD_CTRL_EN_Pos 25 /*!< Enable */ +#define SPWR_RXD_CTRL_WR_Pos 26 /*!< Wrap */ +#define SPWR_RXD_CTRL_IE_Pos 27 /*!< Interrupt enable */ +#define SPWR_RXD_CTRL_EP_Pos 28 /*!< EEP termination */ +#define SPWR_RXD_CTRL_TR_Pos 31 /*!< Packet truncated */ + +/* Bit field masks: */ +#define SPWR_RXD_CTRL_PKTLEN_Msk 0x01FFFFFFUL /*!< Packet length */ +#define SPWR_RXD_CTRL_EN_Msk 0x02000000UL /*!< Enable */ +#define SPWR_RXD_CTRL_WR_Msk 0x04000000UL /*!< Wrap */ +#define SPWR_RXD_CTRL_IE_Msk 0x08000000UL /*!< Interrupt enable */ +#define SPWR_RXD_CTRL_EP_Msk 0x10000000UL /*!< EEP termination */ +#define SPWR_RXD_CTRL_TR_Msk 0x80000000UL /*!< Packet truncated */ + +/*-- SpaceWire RX descriptor structure --------------------------------------------------*/ +/*!< WARNING: struct should be 16 byte aligned!*/ +typedef struct +{ + union + { + __IO uint32_t WORDS[2]; /*!< RX descriptor words array */ + struct + { + union { + __IO uint32_t CTRL; /*!< RX descriptor word 0 */ + __IO _SPWR_RXD_CTRL_bits CTRL_bit; /*!< RX descriptor word 0: bit access */ + }; + __IO uint32_t PKTADDR; /*!< RX descriptor word 1: packet address */ + }; + } ; +} SPWR_RXD_TypeDef; + +/*-- SpaceWire TX descriptor CTRL structure --------------------------------*/ +/*!< WARNING: struct should be 16 byte aligned!*/ +typedef struct +{ + uint32_t HEADERLEN : 8; /*!< Header length */ + uint32_t : 4; /*!< RESERVED */ + uint32_t EN : 1; /*!< Enable */ + uint32_t WR : 1; /*!< Wrap */ + uint32_t IE : 1; /*!< Interrupt enable */ + uint32_t LE : 1; /*!< Link error */ +} _SPWR_TXD_CTRL_bits; + +/* Bit field positions: */ +#define SPWR_TXD_CTRL_HEADERLEN_Pos 0 /*!< Header length */ +#define SPWR_TXD_CTRL_EN_Pos 12 /*!< Enable */ +#define SPWR_TXD_CTRL_WR_Pos 13 /*!< Wrap */ +#define SPWR_TXD_CTRL_IE_Pos 14 /*!< Interrupt enable */ +#define SPWR_TXD_CTRL_LE_Pos 15 /*!< Link error */ + +/* Bit field masks: */ +#define SPWR_TXD_CTRL_HEADERLEN_Msk 0x000000FFUL /*!< Header length */ +#define SPWR_TXD_CTRL_EN_Msk 0x00001000UL /*!< Enable */ +#define SPWR_TXD_CTRL_WR_Msk 0x00002000UL /*!< Wrap */ +#define SPWR_TXD_CTRL_IE_Msk 0x00004000UL /*!< Interrupt enable */ +#define SPWR_TXD_CTRL_LE_Msk 0x00008000UL /*!< Link error */ + +typedef struct +{ + union + { + __IO uint32_t WORDS[4]; /*!< TX descriptor words array */ + struct + { + union { + __IO uint32_t CTRL; /*!< TX descriptor word 0 */ + __IO _SPWR_TXD_CTRL_bits CTRL_bit; /*!< TX descriptor word 0: bit access */ + }; + __IO uint32_t HEADERADDR; /*!< TX descriptor word 1: header address */ + __IO uint32_t DATALEN; /*!< TX descriptor word 2: data length */ + __IO uint32_t DATAADDR; /*!< TX descriptor word 3: data address */ + }; + } ; +} SPWR_TXD_TypeDef; + +/*-- Milstd Transfer descriptor Word 0 configure word --------------------------------*/ +typedef struct { + uint32_t STIME :16; /*!< Slot time (STIME) - Allocated time in 4 microsecond units, remaining time after transfer will insert delay */ + uint32_t RESERVED :2; /*!< Reserved */ + uint32_t GAP :1; /*!< Extended intermessage gap (GAP) - If set, adds an additional amount of gap time, corresponding to the RTTO + field, after the transfer */ + uint32_t STBUS :1; /*!< Store bus (STBUS) - If the transfer succeeds and this bit is set, store the bus on which the transfer succeeded (0 + for bus A, 1 for bus B) into the per-RT bus swap register. If the transfer fails and this bit is set, store the opposite + bus instead. (only if the per-RT bus mask is supported in the core) */ + uint32_t NRET :3; /*!< Number of retries (NRET) - Number of automatic retries per bus + The total number of tries (including the first attempt) is NRET+1 for RETMD=00, 2 x (NRET+1) for RETMD=01/10 */ + uint32_t RETMD :2; /*!< Retry mode (RETMD). */ + uint32_t SUSN :1; /*!< Suspend normally (SUSN) - Always suspends after transfer */ + uint32_t SUSE :1; /*!< Suspend on Error (SUSE) - Suspends the schedule (or stops the async transfer list) on error */ + uint32_t IRQN :1; /*!< IRQ normally (IRQN) - Always interrupts after transfer */ + uint32_t IRQE :1; /*!< IRQ after transfer on Error (IRQE) */ + uint32_t EXCL :1; /*!< Exclusive time slot (EXCL) - Do not schedule asynchronous messages */ + uint32_t WTRIG :1; /*!< Wait for external trigger (WTRIG) */ + uint32_t ZERO :1; /*!< Must be 0 to identify as descriptor */ +} _MILSTD_BC_TDESC_WORD0_bits; + +/* Bit field positions: */ +#define MILSTD_BC_TDESC_WORD0_STIME_Pos 0 /*!< Slot time (STIME) - Allocated time in 4 microsecond units, remaining time after transfer will insert delay */ +#define MILSTD_BC_TDESC_WORD0_GAP_Pos 18 /*!< Extended intermessage gap (GAP) - If set, adds an additional amount of gap time, corresponding to the RTTO field, after the transfer */ +#define MILSTD_BC_TDESC_WORD0_STBUS_Pos 19 /*!< Store bus (STBUS) - If the transfer succeeds and this bit is set, store the bus on which the transfer succeeded */ +#define MILSTD_BC_TDESC_WORD0_NRET_Pos 20 /*!< Number of retries (NRET) - Number of automatic retries per bus */ +#define MILSTD_BC_TDESC_WORD0_RETMD_Pos 23 /*!< Retry mode (RETMD) */ +#define MILSTD_BC_TDESC_WORD0_SUSN_Pos 25 /*!< Suspend normally (SUSN) - Always suspends after transfer */ +#define MILSTD_BC_TDESC_WORD0_SUSE_Pos 26 /*!< Suspend on Error (SUSE) - Suspends the schedule (or stops the async transfer list) on error */ +#define MILSTD_BC_TDESC_WORD0_IRQN_Pos 27 /*!< IRQ normally (IRQN) - Always interrupts after transfer */ +#define MILSTD_BC_TDESC_WORD0_IRQE_Pos 28 /*!< IRQ after transfer on Error (IRQE) */ +#define MILSTD_BC_TDESC_WORD0_EXCL_Pos 29 /*!< Exclusive time slot (EXCL) - Do not schedule asynchronous messages */ +#define MILSTD_BC_TDESC_WORD0_WTRIG_Pos 30 /*!< Wait for external trigger (WTRIG) */ + +/* Bit field masks: */ +#define MILSTD_BC_TDESC_WORD0_STIME_Msk 0x0000FFFFUL /*!< Slot time (STIME) - Allocated time in 4 microsecond units, remaining time after transfer will insert delay */ +#define MILSTD_BC_TDESC_WORD0_GAP_Msk 0x00040000UL /*!< Extended intermessage gap (GAP) - If set, adds an additional amount of gap time, corresponding to the RTTO field, after the transfer */ +#define MILSTD_BC_TDESC_WORD0_STBUS_Msk 0x00080000UL /*!< Store bus (STBUS) - If the transfer succeeds and this bit is set, store the bus on which the transfer succeeded */ +#define MILSTD_BC_TDESC_WORD0_NRET_Msk 0x00700000UL /*!< Number of retries (NRET) - Number of automatic retries per bus */ +#define MILSTD_BC_TDESC_WORD0_RETMD_Msk 0x01800000UL /*!< Retry mode (RETMD) */ +#define MILSTD_BC_TDESC_WORD0_SUSN_Msk 0x02000000UL /*!< Suspend normally (SUSN) - Always suspends after transfer */ +#define MILSTD_BC_TDESC_WORD0_SUSE_Msk 0x04000000UL /*!< Suspend on Error (SUSE) - Suspends the schedule (or stops the async transfer list) on error */ +#define MILSTD_BC_TDESC_WORD0_IRQN_Msk 0x08000000UL /*!< IRQ normally (IRQN) - Always interrupts after transfer */ +#define MILSTD_BC_TDESC_WORD0_IRQE_Msk 0x10000000UL /*!< IRQ after transfer on Error (IRQE) */ +#define MILSTD_BC_TDESC_WORD0_EXCL_Msk 0x20000000UL /*!< Exclusive time slot (EXCL) - Do not schedule asynchronous messages */ +#define MILSTD_BC_TDESC_WORD0_WTRIG_Msk 0x40000000UL /*!< Wait for external trigger (WTRIG) */ +#define MILSTD_BC_TDESC_WORD0_ZERO_Msk 0x80000000UL /*!< Wait for external trigger (WTRIG) */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BC_TDESC_WORD0_RETMD_SameBus = 0x0UL, /*!< Retry on same bus only */ + MILSTD_BC_TDESC_WORD0_RETMD_BothBus = 0x1UL, /*!< Retry alternating on both buses */ + MILSTD_BC_TDESC_WORD0_RETMD_FirstSameBus = 0x2UL, /*!< Retry first on same bus, then on alternating bus */ +} MILSTD_BC_TDESC_WORD0_RETMD_Enum; + +/*-- Milstd Transfer descriptor Word 1 configure word --------------------------------*/ +typedef struct { + uint32_t WCMC :5; /*!< Word count/Mode code (WCMC) */ + uint32_t RTSA1 :5; /*!< RT Subaddress (RTSA1) */ + uint32_t TR :1; /*!< Transmit/receive (TR) */ + uint32_t RTAD1 :5; /*!< RT Address (RTAD1) */ + uint32_t RTSA2 :5; /*!< Second RT Subaddress for RT-to-RT transfer (RTSA2) */ + uint32_t RTAD2 :5; /*!< Second RT Address for RT-to-RT transfer (RTAD2) */ + uint32_t RTTO :4; /*!< RT Timeout (RTTO) - Extra RT status word timeout above nominal in units of 4 us + Note: This extra time is also used as extra intermessage gap time if the GAP bit is set. */ + uint32_t BUS :1; /*!< Bus selection (BUS) - Bus to use for transfer, 0 - Bus A, 1 - Bus B */ + uint32_t DUM :1; /*!< Dummy transfer (DUM) - If set to ‘1’ no bus traffic is generated and transfer “succeeds” immediately + For dummy transfers, the EXCL,IRQN,SUSN,STBUS,GAP,STIME settings are still in effect, other bits and + the data buffer pointer are ignored. */ +} _MILSTD_BC_TDESC_WORD1_bits; + +/* Bit field positions: */ +#define MILSTD_BC_TDESC_WORD1_WCMC_Pos 0 /*!< Word count/Mode code (WCMC) */ +#define MILSTD_BC_TDESC_WORD1_RTSA1_Pos 5 /*!< RT Subaddress (RTSA1) */ +#define MILSTD_BC_TDESC_WORD1_TR_Pos 10 /*!< Transmit/receive (TR) */ +#define MILSTD_BC_TDESC_WORD1_RTAD1_Pos 11 /*!< RT Address (RTAD1) */ +#define MILSTD_BC_TDESC_WORD1_RTSA2_Pos 16 /*!< Second RT Subaddress for RT-to-RT transfer (RTSA2) */ +#define MILSTD_BC_TDESC_WORD1_RTAD2_Pos 21 /*!< Second RT Address for RT-to-RT transfer (RTAD2) */ +#define MILSTD_BC_TDESC_WORD1_RTTO_Pos 26 /*!< RT Timeout (RTTO) - Extra RT status word timeout above nominal in units of 4 us */ +#define MILSTD_BC_TDESC_WORD1_BUS_Pos 30 /*!< Bus selection (BUS) - Bus to use for transfer, 0 - Bus A, 1 - Bus B */ +#define MILSTD_BC_TDESC_WORD1_DUM_Pos 31 /*!< Dummy transfer (DUM) */ + +/* Bit field masks: */ +#define MILSTD_BC_TDESC_WORD1_WCMC_Msk 0x0000001FUL /*!< Word count/Mode code (WCMC) */ +#define MILSTD_BC_TDESC_WORD1_RTSA1_Msk 0x000003E0UL /*!< RT Subaddress (RTSA1) */ +#define MILSTD_BC_TDESC_WORD1_TR_Msk 0x00000400UL /*!< Transmit/receive (TR) */ +#define MILSTD_BC_TDESC_WORD1_RTAD1_Msk 0x0000F800UL /*!< RT Address (RTAD1) */ +#define MILSTD_BC_TDESC_WORD1_RTSA2_Msk 0x001F0000UL /*!< Second RT Subaddress for RT-to-RT transfer (RTSA2) */ +#define MILSTD_BC_TDESC_WORD1_RTAD2_Msk 0x03E00000UL /*!< Second RT Address for RT-to-RT transfer (RTAD2) */ +#define MILSTD_BC_TDESC_WORD1_RTTO_Msk 0x3C000000UL /*!< RT Timeout (RTTO) - Extra RT status word timeout above nominal in units of 4 us */ +#define MILSTD_BC_TDESC_WORD1_BUS_Msk 0x40000000UL /*!< Bus selection (BUS) - Bus to use for transfer, 0 - Bus A, 1 - Bus B */ +#define MILSTD_BC_TDESC_WORD1_DUM_Msk 0x80000000UL /*!< Dummy transfer (DUM) */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BC_TDESC_WORD1_RTTO_14us = 0x0UL, /*!< RT Timeout 14us */ + MILSTD_BC_TDESC_WORD1_RTTO_18us = 0x1UL, /*!< RT Timeout 18us */ + MILSTD_BC_TDESC_WORD1_RTTO_22us = 0x2UL, /*!< RT Timeout 22us */ + MILSTD_BC_TDESC_WORD1_RTTO_26us = 0x3UL, /*!< RT Timeout 26us */ + MILSTD_BC_TDESC_WORD1_RTTO_30us = 0x4UL, /*!< RT Timeout 30us */ + MILSTD_BC_TDESC_WORD1_RTTO_34us = 0x5UL, /*!< RT Timeout 34us */ + MILSTD_BC_TDESC_WORD1_RTTO_38us = 0x6UL, /*!< RT Timeout 38us */ + MILSTD_BC_TDESC_WORD1_RTTO_42us = 0x7UL, /*!< RT Timeout 42us */ + MILSTD_BC_TDESC_WORD1_RTTO_46us = 0x8UL, /*!< RT Timeout 46us */ + MILSTD_BC_TDESC_WORD1_RTTO_50us = 0x9UL, /*!< RT Timeout 50us */ + MILSTD_BC_TDESC_WORD1_RTTO_54us = 0xAUL, /*!< RT Timeout 54us */ + MILSTD_BC_TDESC_WORD1_RTTO_58us = 0xBUL, /*!< RT Timeout 58us */ + MILSTD_BC_TDESC_WORD1_RTTO_62us = 0xCUL, /*!< RT Timeout 62us */ + MILSTD_BC_TDESC_WORD1_RTTO_66us = 0xDUL, /*!< RT Timeout 66us */ + MILSTD_BC_TDESC_WORD1_RTTO_70us = 0xEUL, /*!< RT Timeout 70us */ + MILSTD_BC_TDESC_WORD1_RTTO_74us = 0xFUL, /*!< RT Timeout 74us */ +} MILSTD_BC_TDESC_WORD1_RTTO_Enum; + +typedef enum { + MILSTD_BC_TDESC_WORD1_BUS_A = 0x0UL, /*!< Bus to use for transfer - Bus A */ + MILSTD_BC_TDESC_WORD1_BUS_B = 0x1UL, /*!< Bus to use for transfer - Bus B */ +} MILSTD_BC_TDESC_WORD1_BUS_Enum; + +/*-- Milstd Transfer descriptor Result Word configure word --------------------------------*/ +typedef struct { + uint32_t TFRST :3; /*!< Transfer status (TFRST) - Outcome of last try */ + uint32_t RES :1; /*!< Reserved - Mask away on read for forward compatibility */ + uint32_t RETCNT :4; /*!< Retry count (RETCNT) - Number of retries performed */ + uint32_t RTST :8; /*!< RT Status Bits (RTST) - Status bits from RT (transmitting RT in RT-to-RT transfer)*/ + uint32_t RT2ST :8; /*!< RT 2 Status Bits (RT2ST) - Status bits from receiving RT in RT-to-RT transfer, otherwise 0 + Same bit pattern as for RTST below */ + uint32_t RESERVED :7; /*!< Reserved - Mask away on read for forward compatibility */ + uint32_t ZERO :1; /*!< Always written as 0 */ +} _MILSTD_BC_TDESC_RESULT_bits; + +/* Bit field positions: */ +#define MILSTD_BC_TDESC_RESULT_TFRST_Pos 0 /*!< Transfer status (TFRST) - Outcome of last try */ +#define MILSTD_BC_TDESC_RESULT_RETCNT_Pos 4 /*!< Retry count (RETCNT) - Number of retries performed */ +#define MILSTD_BC_TDESC_RESULT_RTST_Pos 8 /*!< RT Status Bits (RTST) - Status bits from RT (transmitting RT in RT-to-RT transfer) */ +#define MILSTD_BC_TDESC_RESULT_RT2ST_Pos 16 /*!< RT 2 Status Bits (RT2ST) - Status bits from receiving RT in RT-to-RT transfer */ +#define MILSTD_BC_TDESC_RESULT_ZERO_Pos 31 /*!< Retry count (RETCNT) - Number of retries performed */ + +/* Bit field masks: */ +#define MILSTD_BC_TDESC_RESULT_TFRST_Msk 0x00000007UL /*!< Transfer status (TFRST) - Outcome of last try */ +#define MILSTD_BC_TDESC_RESULT_RETCNT_Msk 0x000000F0UL /*!< Retry count (RETCNT) - Number of retries performed */ +#define MILSTD_BC_TDESC_RESULT_RTST_Msk 0x0000FF00UL /*!< RT Status Bits (RTST) - Status bits from RT (transmitting RT in RT-to-RT transfer) */ +#define MILSTD_BC_TDESC_RESULT_RT2ST_Msk 0x00FF0000UL /*!< RT 2 Status Bits (RT2ST) - Status bits from receiving RT in RT-to-RT transfer */ +#define MILSTD_BC_TDESC_RESULT_ZERO_Msk 0x80000000UL /*!< Retry count (RETCNT) - Number of retries performed */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BC_TDESC_RESULT_TFRST_Success = 0x0UL, /*!< Success (or dummy bit was set) */ + MILSTD_BC_TDESC_RESULT_TFRST_Trans_RT_NotRespond = 0x1UL, /*!< RT did not respond (transmitting RT in RT-to-RT transfer) */ + MILSTD_BC_TDESC_RESULT_TFRST_Receiv_RT_NotRespond = 0x2UL, /*!< Receiving RT of RT-to-RT transfer did not respond */ + MILSTD_BC_TDESC_RESULT_TFRST_StatusWordError = 0x3UL, /*!< A responding RT:s status word had message error, busy, instrumentation or reserved bit set (*) */ + MILSTD_BC_TDESC_RESULT_TFRST_ProtocolError = 0x4UL, /*!< Protocol error (improperly timed data words, decoder error, wrong number of data words) */ + MILSTD_BC_TDESC_RESULT_TFRST_TD_Invalid = 0x5UL, /*!< The transfer descriptor was invalid */ + MILSTD_BC_TDESC_RESULT_TFRST_Error = 0x6UL, /*!< Data buffer DMA timeout or error response */ + MILSTD_BC_TDESC_RESULT_TFRST_Aborted = 0x7UL, /*!< Transfer aborted due to loop back check failure */ +} MILSTD_BC_TDESC_RESULT_TFRST_Enum; + +typedef enum { + MILSTD_BC_TDESC_RESULT_RTST_TerminalFlag = 0x8UL, /*!< Terminal flag */ + MILSTD_BC_TDESC_RESULT_RTST_DynamicBusCtrl = 0x9UL, /*!< Dynamic bus control acceptance */ + MILSTD_BC_TDESC_RESULT_RTST_SubSystem = 0xAUL, /*!< Subsystem flag */ + MILSTD_BC_TDESC_RESULT_RTST_Busy = 0xBUL, /*!< Busy bit */ + MILSTD_BC_TDESC_RESULT_RTST_BroadcastCmd = 0xCUL, /*!< Broadcast command received */ + MILSTD_BC_TDESC_RESULT_RTST_SrvReq = 0xDUL, /*!< Service request */ + MILSTD_BC_TDESC_RESULT_RTST_InstrBit = 0xEUL, /*!< Instrumentation bit or reserved bit set */ + MILSTD_BC_TDESC_RESULT_RTST_MsgError = 0xFUL, /*!< Message error */ +} MILSTD_BC_TDESC_RESULT_RTST_Enum; + +/*-- Milstd BC Transfer descriptor structure --------------------------------------------------*/ +typedef struct +{ + union { + __IO uint32_t WORD0; /*!< Milstd Transfer descriptor Word 0 configure word */ + __IO _MILSTD_BC_TDESC_WORD0_bits WORD0_bit; /*!< Milstd Transfer descriptor Word 0 configure word: bit access */ + }; + union { + __IO uint32_t WORD1; /*!< Milstd Transfer descriptor Word 1 configure word */ + __IO _MILSTD_BC_TDESC_WORD1_bits WORD1_bit; /*!< Milstd Transfer descriptor Word 1 configure word: bit access */ + }; + __IO uint32_t DATA_BUF_PTR; /*!< Milstd Transfer descriptor Data buffer pointer, 16-bit aligned.*/ + union { + __IO uint32_t RESULT; /*!< Milstd Transfer descriptor Result Word configure word */ + __IO _MILSTD_BC_TDESC_RESULT_bits RESULT_bit; /*!< Milstd Transfer descriptor Result Word configure word: bit access */ + }; +} MILSTD_BC_TDESC_TypeDef; + +/*-- Milstd branch condition Word Structure definition ----------------------------------*/ +typedef struct { + uint32_t STCC :8; /*!< Status Condition Code (STCC) - Mask with bits corresponding to status value of last transfer */ + uint32_t RTCC :8; /*!< RT Condition Code (RTCC) - Mask with bits corresponding to RTST in result word of last transfer */ + uint32_t RT2CC :8; /*!< RT 2 Condition Code (RT2CC) - Mask with bits corresponding to RT2ST in result word of last transfer */ + uint32_t MODE :1; /*!< Logic mode (MODE) */ + uint32_t ACT :1; /*!< Action (ACT) - What to do if condition is met, 0 - Suspend schedule, 1 - Jump */ + uint32_t IRQC :1; /*!< Interrupt if condition met (IRQC) */ + uint32_t RESERVED :4; /*!< Reserved - Set to 0 */ + uint32_t ONE :1; /*!< Must be 1 to identify as branch */ +} _MILSTD_BC_BR_CONDWORD_bits; + +/* Bit field positions: */ +#define MILSTD_BC_BR_CONDWORD_STCC_Pos 0 /*!< Status Condition Code (STCC) - Mask with bits corresponding to status value of last transfer */ +#define MILSTD_BC_BR_CONDWORD_RTCC_Pos 8 /*!< RT Condition Code (RTCC) - Mask with bits corresponding to RTST in result word of last transfer */ +#define MILSTD_BC_BR_CONDWORD_RT2CC_Pos 16 /*!< RT 2 Condition Code (RT2CC) - Mask with bits corresponding to RT2ST in result word of last transfer */ +#define MILSTD_BC_BR_CONDWORD_MODE_Pos 24 /*!< Logic mode (MODE) */ +#define MILSTD_BC_BR_CONDWORD_ACT_Pos 25 /*!< Action (ACT) - What to do if condition is met, 0 - Suspend schedule, 1 - Jump */ +#define MILSTD_BC_BR_CONDWORD_IRQC_Pos 26 /*!< Interrupt if condition met (IRQC) */ +#define MILSTD_BC_BR_CONDWORD_ONE_Pos 31 /*!< Must be 1 to identify as branch */ + +/* Bit field masks: */ +#define MILSTD_BC_BR_CONDWORD_STCC_Msk 0x00000007UL /*!< Status Condition Code (STCC) - Mask with bits corresponding to status value of last transfer */ +#define MILSTD_BC_BR_CONDWORD_RTCC_Msk 0x000000F0UL /*!< RT Condition Code (RTCC) - Mask with bits corresponding to RTST in result word of last transfer */ +#define MILSTD_BC_BR_CONDWORD_RT2CC_Msk 0x0000FF00UL /*!< RT 2 Condition Code (RT2CC) - Mask with bits corresponding to RT2ST in result word of last transfer */ +#define MILSTD_BC_BR_CONDWORD_MODE_Msk 0x00FF0000UL /*!< Logic mode (MODE) */ +#define MILSTD_BC_BR_CONDWORD_ACT_Msk 0x80000000UL /*!< Action (ACT) - What to do if condition is met, 0 - Suspend schedule, 1 - Jump */ +#define MILSTD_BC_BR_CONDWORD_IRQC_Msk 0x00FF0000UL /*!< Interrupt if condition met (IRQC) */ +#define MILSTD_BC_BR_CONDWORD_ONE_Msk 0x80000000UL /*!< Must be 1 to identify as branch */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BC_BR_CONDWORD_MODE_Or = 0x0UL, /*!< Or mode (any bit set in RT2CC, RTCC is set in RT2ST,RTST, or result is in STCC mask) */ + MILSTD_BC_BR_CONDWORD_MODE_And = 0x1UL, /*!< And mode (all bits set in RT2CC,RTCC are set in RT2ST,RTST and result is in STCC mask) */ +} MILSTD_BC_BR_CONDWORD_MODE_Enum; + +/*-- Milstd BC Branch structure ----------------------------------*/ +typedef struct { + union { + __IO uint32_t CONDWORD; /*!< Condition word */ + __IO _MILSTD_BC_BR_CONDWORD_bits CONDWORD_bit; /*!< Condition word: bit access */ + }; + __IO uint32_t BRADDR; /*!< Branch address, 128-bit aligned */ + __IO uint32_t RESERVED0; /*!< Reserved */ + __IO uint32_t RESERVED1; /*!< Reserved */ +} MILSTD_RTD_TypeDef; + +/*-- Milstd RT Subaddress table control word Structure definition ----------------------------------*/ +typedef struct { + uint32_t TXSZ :5; /*!< Maximum legal transmit size (TXSZ) from this subaddress - in 16-bit words, 0 means 32 */ + uint32_t TXIRQ :1; /*!< Interrupt on transmit transfers (TXIRQ) - Each transmit transfer will cause an interrupt (only if TXEN,TXLOG=1) */ + uint32_t TXLOG :1; /*!< Log transmit transfers (TXLOG) - Log all transmit transfers in event log ring (only if also TXEN=1) */ + uint32_t TXEN :1; /*!< Transmit enable (TXEN) - Allow transmit transfers from this subaddress */ + + uint32_t RXSZ :5; /*!< Maximum legal receive size (RXSZ) from this subaddress - in 16-bit words, 0 means 32 */ + uint32_t RXIRQ :1; /*!< Interrupt on receive transfers (RXIRQ) - Each receive transfer will cause an interrupt (only if RXEN,RXLOG=1) */ + uint32_t RXLOG :1; /*!< Log receive transfers (RXLOG) - Log all receive transfers in event log ring (only if also RXEN=1) */ + uint32_t RXEN :1; /*!< Receive enable (RXEN) - Allow receive transfers to this subaddress */ + + uint32_t BCRXE :1; /*!< Broadcast receive enable (BCRXEN) - Allow broadcast receive transfers to this subaddress */ + uint32_t IGNDV :1; /*!< Ignore data valid bit (IGNDV) - If this is ‘1’ then receive transfers will proceed (and overwrite the buffer) if the receive + descriptor has the data valid bit set, instead of not responding to the request. + This can be used for descriptor rings where you don’t care if the oldest data is overwritten. */ + uint32_t WRAP :1; /*!< Auto-wraparound enable (WRAP) - Enables a test mode for this subaddress, where transmit transfers send back the + last received data. This is done by copying the finished transfer’s descriptor pointer to the transmit descriptor pointer + address after each successful transfer. + Note: If WRAP=1, you should not set TXSZ > RXSZ as this might cause reading beyond buffer end */ + uint32_t ZERO :13; /*!< Reserved - set to 0 for forward compatibility */ +} _MILSTD_RT_SAT_CTRL_TypeDef; + +/* Bit field positions: */ +#define MILSTD_RT_SAT_CTRL_TXSZ_Pos 0 /*!< Maximum legal transmit size (TXSZ) from this subaddress - in 16-bit words, 0 means 32 */ +#define MILSTD_RT_SAT_CTRL_TXIRQ_Pos 5 /*!< Interrupt on transmit transfers (TXIRQ) - Each transmit transfer will cause an interrupt (only if TXEN,TXLOG=1) */ +#define MILSTD_RT_SAT_CTRL_TXLOG_Pos 6 /*!< Log transmit transfers (TXLOG) - Log all transmit transfers in event log ring (only if also TXEN=1) */ +#define MILSTD_RT_SAT_CTRL_TXEN_Pos 7 /*!< Transmit enable (TXEN) - Allow transmit transfers from this subaddress */ +#define MILSTD_RT_SAT_CTRL_RXSZ_Pos 8 /*!< Maximum legal receive size (RXSZ) from this subaddress - in 16-bit words, 0 means 32 */ +#define MILSTD_RT_SAT_CTRL_RXIRQ_Pos 13 /*!< Interrupt on receive transfers (RXIRQ) - Each receive transfer will cause an interrupt (only if RXEN,RXLOG=1) */ +#define MILSTD_RT_SAT_CTRL_RXLOG_Pos 14 /*!< Log receive transfers (RXLOG) - Log all receive transfers in event log ring (only if also RXEN=1) */ +#define MILSTD_RT_SAT_CTRL_RXEN_Pos 15 /*!< Receive enable (RXEN) - Allow receive transfers to this subaddress */ +#define MILSTD_RT_SAT_CTRL_BCRXE_Pos 16 /*!< Broadcast receive enable (BCRXEN) - Allow broadcast receive transfers to this subaddress */ +#define MILSTD_RT_SAT_CTRL_IGNDV_Pos 17 /*!< Ignore data valid bit (IGNDV) */ +#define MILSTD_RT_SAT_CTRL_WRAP_Pos 18 /*!< Auto-wraparound enable (WRAP) */ +#define MILSTD_RT_SAT_CTRL_ZERO_Pos 19 /*!< Reserved - set to 0 for forward compatibility */ + +/* Bit field masks: */ +#define MILSTD_RT_SAT_CTRL_TXSZ_Msk 0x0000001FUL /*!< Maximum legal transmit size (TXSZ) from this subaddress - in 16-bit words, 0 means 32 */ +#define MILSTD_RT_SAT_CTRL_TXIRQ_Msk 0x00000020UL /*!< Interrupt on transmit transfers (TXIRQ) - Each transmit transfer will cause an interrupt (only if TXEN,TXLOG=1) */ +#define MILSTD_RT_SAT_CTRL_TXLOG_Msk 0x00000040UL /*!< Log transmit transfers (TXLOG) - Log all transmit transfers in event log ring (only if also TXEN=1) */ +#define MILSTD_RT_SAT_CTRL_TXEN_Msk 0x00000080UL /*!< Transmit enable (TXEN) - Allow transmit transfers from this subaddress */ +#define MILSTD_RT_SAT_CTRL_RXSZ_Msk 0x00001F00UL /*!< Maximum legal receive size (RXSZ) from this subaddress - in 16-bit words, 0 means 32 */ +#define MILSTD_RT_SAT_CTRL_RXIRQ_Msk 0x00002000UL /*!< Interrupt on receive transfers (RXIRQ) - Each receive transfer will cause an interrupt (only if RXEN,RXLOG=1) */ +#define MILSTD_RT_SAT_CTRL_RXLOG_Msk 0x00004000UL /*!< Log receive transfers (RXLOG) - Log all receive transfers in event log ring (only if also RXEN=1) */ +#define MILSTD_RT_SAT_CTRL_RXEN_Msk 0x00008000UL /*!< Receive enable (RXEN) - Allow receive transfers to this subaddress */ +#define MILSTD_RT_SAT_CTRL_BCRXE_Msk 0x00010000UL /*!< Broadcast receive enable (BCRXEN) - Allow broadcast receive transfers to this subaddress */ +#define MILSTD_RT_SAT_CTRL_IGNDV_Msk 0x00020000UL /*!< Ignore data valid bit (IGNDV) */ +#define MILSTD_RT_SAT_CTRL_WRAP_Msk 0x00040000UL /*!< Auto-wraparound enable (WRAP) */ +#define MILSTD_RT_SAT_CTRL_ZERO_Msk 0xFFF80000UL /*`!< Reserved - set to 0 for forward compatibility */ + +/*-- Milstd RT SubAddress Table Structure definition ----------------------------------*/ +typedef struct { + union { + __IO uint32_t CTRL; /*!< RT Subaddress table control word */ + __IO _MILSTD_RT_SAT_CTRL_TypeDef CTRL_bit; /*!< RT Subaddress table control word: bit access */ + }; + __IO uint32_t TDSCR; /*!< Transmit descriptor pointer, 16-byte aligned (0x3 to indicate invalid pointer) */ + __IO uint32_t RDSCR; /*!< Receive descriptor pointer, 16-byte aligned (0x3 to indicate invalid pointer) */ + __IO uint32_t RESERVED; /*!< Reserved */ +} MILSTD_RT_SAT_TypeDef; + +typedef struct +{ + MILSTD_RT_SAT_TypeDef SAT[32]; /*!< RT Subaddress table array */ +} MILSTD_RT_SAT_Arr_TypeDef; + +/*-- Milstd RT Event Log entry format Structure definition ----------------------------------*/ +typedef struct { + uint32_t TRES :3; /*!< Transfer result (TRES) */ + uint32_t SZ :5; /*!< Transfer size (SZ) - Count in 16-bit words (0-32) */ + uint32_t BC :1; /*!< Broadcast (BC) - Set to 1 if request was to the broadcast address */ + uint32_t TIMEL :14; /*!< Low 14 bits of time tag counter */ + uint32_t SAMC :5; /*!< Subaddress / Mode code (SAMC) - + If TYPE=00/01 this is the transfer subaddress, + If TYPE=10, this is the mode code */ + uint32_t TYPE :2; /*!< Transfer type (TYPE) */ + uint32_t IRQSR :1; /*!< IRQ Source (IRQSRC) - Set to ‘1’ if this transfer caused an interrup */ +} MILSTD_RT_LOG_TypeDef; + +/* Bit field positions: */ +#define MILSTD_RT_LOG_TRES_Pos 0 /*!< Transfer result (TRES) */ +#define MILSTD_RT_LOG_SZ_Pos 3 /*!< Transfer size (SZ) - Count in 16-bit words (0-32) */ +#define MILSTD_RT_LOG_BC_Pos 9 /*!< Broadcast (BC) - Set to 1 if request was to the broadcast address */ +#define MILSTD_RT_LOG_TIMEL_Pos 10 /*!< Low 14 bits of time tag counter */ +#define MILSTD_RT_LOG_SAMC_Pos 24 /*!< Subaddress / Mode code (SAMC) */ +#define MILSTD_RT_LOG_TYPE_Pos 29 /*!< Transfer type (TYPE) */ +#define MILSTD_RT_LOG_IRQSR_Pos 31 /*!< IRQ Source (IRQSRC) - Set to ‘1’ if this transfer caused an interrup */ + +/* Bit field masks: */ +#define MILSTD_RT_LOG_TRES_Msk 0x00000003UL /*!< Transfer result (TRES) */ +#define MILSTD_RT_LOG_SZ_Msk 0x000001FCUL /*!< Transfer size (SZ) - Count in 16-bit words (0-32) */ +#define MILSTD_RT_LOG_BC_Msk 0x00000200UL /*!< Broadcast (BC) - Set to 1 if request was to the broadcast address */ +#define MILSTD_RT_LOG_TIMEL_Msk 0x00FFFC00UL /*!< Low 14 bits of time tag counter */ +#define MILSTD_RT_LOG_SAMC_Msk 0x1F000000UL /*!< Subaddress / Mode code (SAMC) */ +#define MILSTD_RT_LOG_TYPE_Msk 0x60000000UL /*!< Transfer type (TYPE) */ +#define MILSTD_RT_LOG_IRQSR_Msk 0x80000000UL /*!< IRQ Source (IRQSRC) - Set to ‘1’ if this transfer caused an interrup */ + +/* Bit field enums: */ +typedef enum { + MILSTD_RT_LOG_TRES_Success = 0x0UL, /*!< Success */ + MILSTD_RT_LOG_TRES_Superseded = 0x1UL, /*!< Superseded (canceled because a new command was given on the other bus) */ + MILSTD_RT_LOG_TRES_DMAErr = 0x2UL, /*!< DMA error or memory timeout occurred */ + MILSTD_RT_LOG_TRES_ProtocolErr = 0x3UL, /*!< Protocol error (improperly timed data words or decoder error) */ + MILSTD_RT_LOG_TRES_MsgErr = 0x4UL, /*!< The busy bit or message error bit was set in the transmitted status word and no data was sent */ + MILSTD_RT_LOG_TRES_Aborted = 0x5UL, /*!< Transfer aborted due to loop back checker error */ +} MILSTD_RT_LOG_TRES_Enum; + +typedef enum { + MILSTD_RT_LOG_TYPE_TxData = 0x0UL, /*!< Transmit data */ + MILSTD_RT_LOG_TYPE_RxData = 0x1UL, /*!< Receive data */ + MILSTD_RT_LOG_TYPE_ModeCode = 0x2UL, /*!< Mode code */ +} MILSTD_RT_LOG_TYPE_Enum; + +/*-- Milstd RT Descriptor control/status word Structure definition ----------------------------------*/ +typedef struct { + uint32_t TRES :3; /*!< Transfer result (TRES) + 000 = Success + 001 = Superseded (canceled because a new command was given on the other bus) + 010 = DMA error or memory timeout occurred + 011 = Protocol error (improperly timed data words or decoder error) + 100 = The busy bit or message error bit was set in the transmitted status word and no data was sent + 101 = Transfer aborted due to loop back checker error */ + uint32_t SZ :5; /*!< Transfer size (SZ) - Count in 16-bit words (0-32) */ + uint32_t BC :1; /*!< Broadcast (BC) - Set by the core if the transfer was a broadcast transfer */ + uint32_t TIME :16; /*!< Transmission time tag (TTIME) - Set by the core to the value of the RT timer when the transfer finished. */ + uint32_t RESERVED :4; /*!< Reserved - Write 0 and mask out on read for forward compatibility */ + uint32_t IRQEN :1; /*!< IRQ Enable override (IRQEN) - Log and IRQ after transfer regardless of SA control word settings + Can be used for getting an interrupt when nearing the end of a descriptor list. */ + uint32_t DV :1; /*!< Data valid (DV) - Should be set to 0 by software before and set to 1 by hardware after transfer. + If DV=1 in the current receive descriptor before the receive transfer begins then a descriptor table error will + be triggered. You can override this by setting the IGNDV bit in the subaddress table. */ +} _MILSTD_RT_DESC_CTRLSTAT_TypeDef; + +/* Bit field positions: */ +#define MILSTD_RT_DESC_CTRLSTAT_TRES_Pos 0 /*!< Transfer result (TRES) */ +#define MILSTD_RT_DESC_CTRLSTAT_SZ_Pos 3 /*!< Transfer size (SZ) - Count in 16-bit words (0-32) */ +#define MILSTD_RT_DESC_CTRLSTAT_BC_Pos 9 /*!< Broadcast (BC) - Set by the core if the transfer was a broadcast transfer */ +#define MILSTD_RT_DESC_CTRLSTAT_TIME_Pos 10 /*!< Transmission time tag (TTIME) - Set by the core to the value of the RT timer when the transfer finished. */ +#define MILSTD_RT_DESC_CTRLSTAT_IRQEN_Pos 30 /*!< IRQ Enable override (IRQEN) */ +#define MILSTD_RT_DESC_CTRLSTAT_DV_Pos 31 /*!< Data valid (DV) */ + +/* Bit field masks: */ +#define MILSTD_RT_DESC_CTRLSTAT_TRES_Msk 0x00000003UL /*!< Transfer result (TRES) */ +#define MILSTD_RT_DESC_CTRLSTAT_SZ_Msk 0x000001FCUL /*!< Transfer size (SZ) - Count in 16-bit words (0-32) */ +#define MILSTD_RT_DESC_CTRLSTAT_BC_Msk 0x00000200UL /*!< Broadcast (BC) - Set by the core if the transfer was a broadcast transfer */ +#define MILSTD_RT_DESC_CTRLSTAT_TIME_Msk 0x03FFFC00UL /*!< Transmission time tag (TTIME) - Set by the core to the value of the RT timer when the transfer finished. */ +#define MILSTD_RT_DESC_CTRLSTAT_IRQEN_Msk 0x40000000UL /*!< IRQ Enable override (IRQEN) */ +#define MILSTD_RT_DESC_CTRLSTAT_DV_Msk 0x80000000UL /*!< Data valid (DV) */ + +/* Bit field enums: */ +typedef enum { + MILSTD_RT_DESC_CTRLSTAT_TRES_Success = 0x0UL, /*!< Success */ + MILSTD_RT_DESC_CTRLSTAT_TRES_Superseded = 0x1UL, /*!< Superseded (canceled because a new command was given on the other bus) */ + MILSTD_RT_DESC_CTRLSTAT_TRES_DMAErr = 0x2UL, /*!< DMA error or memory timeout occurred */ + MILSTD_RT_DESC_CTRLSTAT_TRES_ProtocolErr = 0x3UL, /*!< Protocol error (improperly timed data words or decoder error) */ + MILSTD_RT_DESC_CTRLSTAT_TRES_MsgErr = 0x4UL, /*!< The busy bit or message error bit was set in the transmitted status word and no data was sent */ + MILSTD_RT_DESC_CTRLSTAT_TRES_Aborted = 0x5UL, /*!< Transfer aborted due to loop back checker error */ +} MILSTD_RT_DESC_CTRLSTAT_TRES_Enum; + +/*-- Milstd RT Descriptor format Structure definition ----------------------------------*/ +typedef struct { + union { + __IO uint32_t CTRLSTAT; /*!< Control and status word */ + __IO _MILSTD_RT_DESC_CTRLSTAT_TypeDef CTRLSTAT_bit; /*!< Control and status word: bit access */ + }; + __IO uint32_t DBUFF_PTR; /*!< Data buffer pointer, 16-bit aligned */ + __IO uint32_t NEXT_DESCR_PTR; /*!< Pointer to next descriptor, 16-byte aligned or 0x0000003 to indicate end of list */ +} MILSTD_RT_DESC_TypeDef; + +/*-- Milstd BM Log entry word 0 Structure definition ----------------------------------*/ +typedef struct { + uint32_t TIME :24; /*!< Time tag (TIME) */ + uint32_t RESERVED :7; /*!< Reserved - Mask out on read for forward compatibility */ + uint32_t ONE :1; /*!< Always written as 1 */ +} _BM_LOG_WORD0_TypeDef; + +/* Bit field positions: */ +#define MILSTD_BM_LOG_WORD0_TIME_Pos 0 /*!< Time tag (TIME) */ +#define MILSTD_BM_LOG_WORD0_ONE_Pos 31 /*!< Always written as 1 */ + +/* Bit field masks: */ +#define MILSTD_BM_LOG_WORD0_TIME_Msk 0x00FFFFFUL /*!< Time tag (TIME) */ +#define MILSTD_BM_LOG_WORD0_ONE_Msk 0x8000000UL /*!< Always written as 1 */ + +/*-- Milstd BM Log entry word 1 Structure definition ----------------------------------*/ +typedef struct { + uint32_t WD :16; /*!< Word data (WD) */ + uint32_t WTP :1; /*!< Word type (WTP) */ + uint32_t WST :2; /*!< Word status (WST) - 00=word OK, 01=Manchester error, 10=Parity error */ + uint32_t BUS :1; /*!< Receive data bus (BUS) - 0:A, 1:B */ + uint32_t RESERVED :11; /*!< Reserved - Mask out on read for forward compatibility */ + uint32_t ZERO :1; /*!< Always written as 0 */ +} _BM_LOG_WORD1_TypeDef; + +/* Bit field positions: */ +#define MILSTD_BM_LOG_WORD1_WD_Pos 0 /*!< Word data (WD)*/ +#define MILSTD_BM_LOG_WORD1_WTP_Pos 16 /*!< Word type (WTP) */ +#define MILSTD_BM_LOG_WORD1_WST_Pos 17 /*!< Word status (WST) */ +#define MILSTD_BM_LOG_WORD1_BUS_Pos 19 /*!< Receive data bus (BUS) */ +#define MILSTD_BM_LOG_WORD1_ZERO_Pos 31 /*!< Always written as 0 */ + +/* Bit field masks: */ +#define MILSTD_BM_LOG_WORD1_WD_Msk 0x0000FFFFUL /*!< Word data (WD)*/ +#define MILSTD_BM_LOG_WORD1_WTP_Msk 0x00010000UL /*!< Word type (WTP) */ +#define MILSTD_BM_LOG_WORD1_WST_Msk 0x00060000UL /*!< Word status (WST) */ +#define MILSTD_BM_LOG_WORD1_BUS_Msk 0x00080000UL /*!< Receive data bus (BUS) */ +#define MILSTD_BM_LOG_WORD1_ZERO_Msk 0x80000000UL /*!< Always written as 0 */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BM_LOG_WORD1_WTP_Data = 0x0UL, /*!< Data */ + MILSTD_BM_LOG_WORD1_WTP_CmdStatus = 0x1UL /*!< Command/status */ +} MILSTD_BM_LOG_WORD1_WTP_Enum; + +typedef enum { + MILSTD_BM_LOG_WORD1_WST_OK = 0x0UL, /*!< Word OK */ + MILSTD_BM_LOG_WORD1_WST_ManchErr = 0x1UL, /*!< Manchester error */ + MILSTD_BM_LOG_WORD1_WST_ParityErr = 0x2UL /*!< Parity error */ +} MILSTD_BM_LOG_WORD1_WST_Enum; + +typedef enum { + MILSTD_BM_LOG_WORD1_BUS_A = 0x0UL, /*!< Bus to use for transfer - Bus A */ + MILSTD_BM_LOG_WORD1_BUS_B = 0x1UL, /*!< Bus to use for transfer - Bus B */ +} MILSTD_BM_LOG_WORD1_BUS_Enum; + +typedef struct { + union { + __IO uint32_t WORD0; /*!< BM Log entry word 0 */ + __IO _BM_LOG_WORD0_TypeDef WORD0_bit; /*!< BM Log entry word 0: bit access */ + }; + union { + __IO uint32_t WORD1; /*!< BM Log entry word 1 */ + __IO _BM_LOG_WORD1_TypeDef WORD1_bit; /*!< BM Log entry word 1: bit access */ + }; +} MILSTD_BM_LOG_TypeDef; + + +/******************************************************************************/ +/* RCU registers */ +/******************************************************************************/ + +/*-- PLLCFG: PLL Configuration Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t FBDIV :12; /*!< PLL FBDIV Coefficient */ + uint32_t DIV1 :3; /*!< Output DIV1 coefficient */ + uint32_t :1; /*!< RESERVED */ + uint32_t DIV2 :3; /*!< Output DIV2 coefficient */ + uint32_t :1; /*!< RESERVED */ + uint32_t REFDIV :6; /*!< PLL reference clock divider */ + uint32_t PD :1; /*!< PLL PowerDown enable bit */ + uint32_t LOCK :1; /*!< Lock status of stable PLL output clock */ + uint32_t OUTDIS :1; /*!< Disable PLL output clock */ + uint32_t BP :1; /*!< Bypass PLL reference clock */ + uint32_t REFSRC :2; /*!< Reference clock source */ +} _RCU_PLLCFG_bits; + +/* Bit field positions: */ +#define RCU_PLLCFG_FBDIV_Pos 0 /*!< PLL FBDIV Coefficient */ +#define RCU_PLLCFG_DIV1_Pos 12 /*!< Output DIV1 coefficient */ +#define RCU_PLLCFG_DIV2_Pos 16 /*!< Output DIV2 coefficient */ +#define RCU_PLLCFG_REFDIV_Pos 20 /*!< PLL reference clock divider */ +#define RCU_PLLCFG_PD_Pos 26 /*!< PLL PowerDown enable bit */ +#define RCU_PLLCFG_LOCK_Pos 27 /*!< Lock status of stable PLL output clock */ +#define RCU_PLLCFG_OUTDIS_Pos 28 /*!< Disable PLL output clock */ +#define RCU_PLLCFG_BP_Pos 29 /*!< Bypass PLL reference clock */ +#define RCU_PLLCFG_REFSRC_Pos 30 /*!< Reference clock source */ + +/* Bit field masks: */ +#define RCU_PLLCFG_FBDIV_Msk 0x00000FFFUL /*!< PLL FBDIV Coefficient */ +#define RCU_PLLCFG_DIV1_Msk 0x00007000UL /*!< Output DIV1 coefficient */ +#define RCU_PLLCFG_DIV2_Msk 0x00070000UL /*!< Output DIV2 coefficient */ +#define RCU_PLLCFG_REFDIV_Msk 0x03F00000UL /*!< PLL reference clock divider */ +#define RCU_PLLCFG_PD_Msk 0x04000000UL /*!< PLL PowerDown enable bit */ +#define RCU_PLLCFG_LOCK_Msk 0x08000000UL /*!< Lock status of stable PLL output clock */ +#define RCU_PLLCFG_OUTDIS_Msk 0x10000000UL /*!< Disable PLL output clock */ +#define RCU_PLLCFG_BP_Msk 0x20000000UL /*!< Bypass PLL reference clock */ +#define RCU_PLLCFG_REFSRC_Msk 0xC0000000UL /*!< Reference clock source */ + +/* Bit field enums: */ +typedef enum { + RCU_PLLCFG_REFSRC_OSECLK = 0x0UL, /*!< external oscillator */ + RCU_PLLCFG_REFSRC_OSICLK = 0x1UL, /*!< internal oscillator */ + RCU_PLLCFG_REFSRC_PLLEXTCLK = 0x2UL, /*!< external PLL clock source */ +} RCU_PLLCFG_REFSRC_Enum; + +/*-- PLLDIV: PLL Divider Register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t DIVEN :1; /*!< PLL Divider enable bit */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIV :6; /*!< PLL divider coefficent */ +} _RCU_PLLDIV_bits; + +/* Bit field positions: */ +#define RCU_PLLDIV_DIVEN_Pos 0 /*!< PLL Divider enable bit */ +#define RCU_PLLDIV_DIV_Pos 8 /*!< PLL divider coefficent */ + +/* Bit field masks: */ +#define RCU_PLLDIV_DIVEN_Msk 0x00000001UL /*!< PLL Divider enable bit */ +#define RCU_PLLDIV_DIV_Msk 0x00003F00UL /*!< PLL divider coefficent */ + +/*-- SYSCLKCFG: System Clock Configuration Register ----------------------------------------------------------*/ +typedef struct { + uint32_t SYSSEL :2; /*!< System clock source selection */ + uint32_t :14; /*!< RESERVED */ + uint32_t SECEN :1; /*!< Enable clock security system */ +} _RCU_SYSCLKCFG_bits; + +/* Bit field positions: */ +#define RCU_SYSCLKCFG_SYSSEL_Pos 0 /*!< System clock source selection */ +#define RCU_SYSCLKCFG_SECEN_Pos 16 /*!< Enable clock security system */ + +/* Bit field masks: */ +#define RCU_SYSCLKCFG_SYSSEL_Msk 0x00000003UL /*!< System clock source selection */ +#define RCU_SYSCLKCFG_SECEN_Msk 0x00010000UL /*!< Enable clock security system */ + +/* Bit field enums: */ +typedef enum { + RCU_SYSCLKCFG_SYSSEL_REFCLK = 0x0UL, /*!< reference clock */ + RCU_SYSCLKCFG_SYSSEL_SRCCLK = 0x1UL, /*!< additional clock source */ + RCU_SYSCLKCFG_SYSSEL_PLLCLK = 0x2UL, /*!< PLL output clock */ + RCU_SYSCLKCFG_SYSSEL_PLLDIVCLK = 0x3UL, /*!< PLL divided clock */ +} RCU_SYSCLKCFG_SYSSEL_Enum; + +/*-- SYSCLKSTAT: System Clock Status Register ----------------------------------------------------------------*/ +typedef struct { + uint32_t SYSSTAT :2; /*!< Current system clock source */ + uint32_t :2; /*!< RESERVED */ + uint32_t BUSY :1; /*!< Clock manager is busy, for example, when change clock source */ + uint32_t :3; /*!< RESERVED */ + uint32_t SYSFAIL :1; /*!< Error in current clock was detected */ + uint32_t :8; /*!< RESERVED */ + uint32_t SRCCLKERR :1; /*!< Additional clock source fail */ + uint32_t PLLCLKERR :1; /*!< PLL clock fail */ + uint32_t PLLDIVCLKERR :1; /*!< PLL divided clock fail */ + uint32_t :5; /*!< RESERVED */ + uint32_t SRCCLKOK :1; /*!< Additional clock source good */ + uint32_t PLLCLKOK :1; /*!< PLL clock good */ + uint32_t PLLDIVCLKOK :1; /*!< PLL divided clock good */ +} _RCU_SYSCLKSTAT_bits; + +/* Bit field positions: */ +#define RCU_SYSCLKSTAT_SYSSTAT_Pos 0 /*!< Current system clock source */ +#define RCU_SYSCLKSTAT_BUSY_Pos 4 /*!< Clock manager is busy, for example, when change clock source */ +#define RCU_SYSCLKSTAT_SYSFAIL_Pos 8 /*!< Error in current clock was detected */ +#define RCU_SYSCLKSTAT_SRCCLKERR_Pos 17 /*!< Additional clock source fail */ +#define RCU_SYSCLKSTAT_PLLCLKERR_Pos 18 /*!< PLL clock fail */ +#define RCU_SYSCLKSTAT_PLLDIVCLKERR_Pos 19 /*!< PLL divided clock fail */ +#define RCU_SYSCLKSTAT_SRCCLKOK_Pos 25 /*!< Additional clock source good */ +#define RCU_SYSCLKSTAT_PLLCLKOK_Pos 26 /*!< PLL clock good */ +#define RCU_SYSCLKSTAT_PLLDIVCLKOK_Pos 27 /*!< PLL divided clock good */ + +/* Bit field masks: */ +#define RCU_SYSCLKSTAT_SYSSTAT_Msk 0x00000003UL /*!< Current system clock source */ +#define RCU_SYSCLKSTAT_BUSY_Msk 0x00000010UL /*!< Clock manager is busy, for example, when change clock source */ +#define RCU_SYSCLKSTAT_SYSFAIL_Msk 0x00000100UL /*!< Error in current clock was detected */ +#define RCU_SYSCLKSTAT_SRCCLKERR_Msk 0x00020000UL /*!< Additional clock source fail */ +#define RCU_SYSCLKSTAT_PLLCLKERR_Msk 0x00040000UL /*!< PLL clock fail */ +#define RCU_SYSCLKSTAT_PLLDIVCLKERR_Msk 0x00080000UL /*!< PLL divided clock fail */ +#define RCU_SYSCLKSTAT_SRCCLKOK_Msk 0x02000000UL /*!< Additional clock source good */ +#define RCU_SYSCLKSTAT_PLLCLKOK_Msk 0x04000000UL /*!< PLL clock good */ +#define RCU_SYSCLKSTAT_PLLDIVCLKOK_Msk 0x08000000UL /*!< PLL divided clock good */ + +/* Bit field enums: */ +typedef enum { + RCU_SYSCLKSTAT_SYSSTAT_REFCLK = 0x0UL, /*!< reference clock */ + RCU_SYSCLKSTAT_SYSSTAT_SRCCLK = 0x1UL, /*!< additional clock source */ + RCU_SYSCLKSTAT_SYSSTAT_PLLCLK = 0x2UL, /*!< PLL output clock */ + RCU_SYSCLKSTAT_SYSSTAT_PLLDIVCLK = 0x3UL, /*!< PLL divided clock */ +} RCU_SYSCLKSTAT_SYSSTAT_Enum; + +/*-- SECPRD: Security Sysytem Clock Period Register 0 --------------------------------------------------------*/ +typedef struct { + uint32_t :8; /*!< RESERVED */ + uint32_t SRCCLK :8; /*!< Additional clock source max counter value for fail detection */ + uint32_t PLLCLK :8; /*!< Clock source 2 max counter value for clock fail detection */ + uint32_t PLLDIVCLK :8; /*!< Clock source 3 max counter value for clock fail detection */ +} _RCU_SECPRD_bits; + +/* Bit field positions: */ +#define RCU_SECPRD_SRCCLK_Pos 8 /*!< Additional clock source max counter value for fail detection */ +#define RCU_SECPRD_PLLCLK_Pos 16 /*!< Clock source 2 max counter value for clock fail detection */ +#define RCU_SECPRD_PLLDIVCLK_Pos 24 /*!< Clock source 3 max counter value for clock fail detection */ + +/* Bit field masks: */ +#define RCU_SECPRD_SRCCLK_Msk 0x0000FF00UL /*!< Additional clock source max counter value for fail detection */ +#define RCU_SECPRD_PLLCLK_Msk 0x00FF0000UL /*!< Clock source 2 max counter value for clock fail detection */ +#define RCU_SECPRD_PLLDIVCLK_Msk 0xFF000000UL /*!< Clock source 3 max counter value for clock fail detection */ + +/*-- SYSRSTCFG: System Reset Configuration Register ----------------------------------------------------------*/ +typedef struct { + uint32_t LOCKUPEN :1; /*!< Enable reset when processor in LOCKUP state */ +} _RCU_SYSRSTCFG_bits; + +/* Bit field positions: */ +#define RCU_SYSRSTCFG_LOCKUPEN_Pos 0 /*!< Enable reset when processor in LOCKUP state */ + +/* Bit field masks: */ +#define RCU_SYSRSTCFG_LOCKUPEN_Msk 0x00000001UL /*!< Enable reset when processor in LOCKUP state */ + +/*-- SYSRSTSTAT: Reset Status Register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t POR :1; /*!< PowerOn Reset status */ + uint32_t WDOG :1; /*!< WatchDog Reset status */ + uint32_t SYSRST :1; /*!< System Reset Status */ + uint32_t LOCKUP :1; /*!< Lockup Reset Status */ +} _RCU_SYSRSTSTAT_bits; + +/* Bit field positions: */ +#define RCU_SYSRSTSTAT_POR_Pos 0 /*!< PowerOn Reset status */ +#define RCU_SYSRSTSTAT_WDOG_Pos 1 /*!< WatchDog Reset status */ +#define RCU_SYSRSTSTAT_SYSRST_Pos 2 /*!< System Reset Status */ +#define RCU_SYSRSTSTAT_LOCKUP_Pos 3 /*!< Lockup Reset Status */ + +/* Bit field masks: */ +#define RCU_SYSRSTSTAT_POR_Msk 0x00000001UL /*!< PowerOn Reset status */ +#define RCU_SYSRSTSTAT_WDOG_Msk 0x00000002UL /*!< WatchDog Reset status */ +#define RCU_SYSRSTSTAT_SYSRST_Msk 0x00000004UL /*!< System Reset Status */ +#define RCU_SYSRSTSTAT_LOCKUP_Msk 0x00000008UL /*!< Lockup Reset Status */ + +/*-- INTEN: Interrupt Enable Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t SRCCLKERR :1; /*!< Enable SRCCLK fail interrupt */ + uint32_t PLLCLKERR :1; /*!< Enable PLLCLK fail interrupt */ + uint32_t PLLDIVCLKERR :1; /*!< Enable PLLDIVCLK fail interrupt */ + uint32_t :5; /*!< RESERVED */ + uint32_t SRCCLKOK :1; /*!< Enable SRCCLK good interrupt */ + uint32_t PLLCLKOK :1; /*!< Enable PLLCLK good interrupt */ + uint32_t PLLDIVCLKOK :1; /*!< Enable PLLDIVCLK good interrupt */ + uint32_t :4; /*!< RESERVED */ + uint32_t PLLLOCK :1; /*!< Enable int from pll lock signal */ +} _RCU_INTEN_bits; + +/* Bit field positions: */ +#define RCU_INTEN_SRCCLKERR_Pos 1 /*!< Enable SRCCLK fail interrupt */ +#define RCU_INTEN_PLLCLKERR_Pos 2 /*!< Enable PLLCLK fail interrupt */ +#define RCU_INTEN_PLLDIVCLKERR_Pos 3 /*!< Enable PLLDIVCLK fail interrupt */ +#define RCU_INTEN_SRCCLKOK_Pos 9 /*!< Enable SRCCLK good interrupt */ +#define RCU_INTEN_PLLCLKOK_Pos 10 /*!< Enable PLLCLK good interrupt */ +#define RCU_INTEN_PLLDIVCLKOK_Pos 11 /*!< Enable PLLDIVCLK good interrupt */ +#define RCU_INTEN_PLLLOCK_Pos 16 /*!< Enable int from pll lock signal */ + +/* Bit field masks: */ +#define RCU_INTEN_SRCCLKERR_Msk 0x00000002UL /*!< Enable SRCCLK fail interrupt */ +#define RCU_INTEN_PLLCLKERR_Msk 0x00000004UL /*!< Enable PLLCLK fail interrupt */ +#define RCU_INTEN_PLLDIVCLKERR_Msk 0x00000008UL /*!< Enable PLLDIVCLK fail interrupt */ +#define RCU_INTEN_SRCCLKOK_Msk 0x00000200UL /*!< Enable SRCCLK good interrupt */ +#define RCU_INTEN_PLLCLKOK_Msk 0x00000400UL /*!< Enable PLLCLK good interrupt */ +#define RCU_INTEN_PLLDIVCLKOK_Msk 0x00000800UL /*!< Enable PLLDIVCLK good interrupt */ +#define RCU_INTEN_PLLLOCK_Msk 0x00010000UL /*!< Enable int from pll lock signal */ + +/*-- INTSTAT: Interrupt Status Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t SRCCLKERR :1; /*!< Status SRCCLK fail */ + uint32_t PLLCLKERR :1; /*!< Status PLLCLK fail */ + uint32_t PLLDIVCLKERR :1; /*!< Status PLLDIVCLK fail */ + uint32_t :5; /*!< RESERVED */ + uint32_t SRCCLKOK :1; /*!< Status SRCCLK good */ + uint32_t PLLCLKOK :1; /*!< Status PLLCLK good */ + uint32_t PLLDIVCLKOK :1; /*!< Status PLLDIVCLK good */ + uint32_t :4; /*!< RESERVED */ + uint32_t PLLLOCK :1; /*!< Status pll lock signal */ + uint32_t :3; /*!< RESERVED */ + uint32_t SYSFAIL :1; /*!< SYSCLK fail status */ +} _RCU_INTSTAT_bits; + +/* Bit field positions: */ +#define RCU_INTSTAT_SRCCLKERR_Pos 1 /*!< Status SRCCLK fail */ +#define RCU_INTSTAT_PLLCLKERR_Pos 2 /*!< Status PLLCLK fail */ +#define RCU_INTSTAT_PLLDIVCLKERR_Pos 3 /*!< Status PLLDIVCLK fail */ +#define RCU_INTSTAT_SRCCLKOK_Pos 9 /*!< Status SRCCLK good */ +#define RCU_INTSTAT_PLLCLKOK_Pos 10 /*!< Status PLLCLK good */ +#define RCU_INTSTAT_PLLDIVCLKOK_Pos 11 /*!< Status PLLDIVCLK good */ +#define RCU_INTSTAT_PLLLOCK_Pos 16 /*!< Status pll lock signal */ +#define RCU_INTSTAT_SYSFAIL_Pos 20 /*!< SYSCLK fail status */ + +/* Bit field masks: */ +#define RCU_INTSTAT_SRCCLKERR_Msk 0x00000002UL /*!< Status SRCCLK fail */ +#define RCU_INTSTAT_PLLCLKERR_Msk 0x00000004UL /*!< Status PLLCLK fail */ +#define RCU_INTSTAT_PLLDIVCLKERR_Msk 0x00000008UL /*!< Status PLLDIVCLK fail */ +#define RCU_INTSTAT_SRCCLKOK_Msk 0x00000200UL /*!< Status SRCCLK good */ +#define RCU_INTSTAT_PLLCLKOK_Msk 0x00000400UL /*!< Status PLLCLK good */ +#define RCU_INTSTAT_PLLDIVCLKOK_Msk 0x00000800UL /*!< Status PLLDIVCLK good */ +#define RCU_INTSTAT_PLLLOCK_Msk 0x00010000UL /*!< Status pll lock signal */ +#define RCU_INTSTAT_SYSFAIL_Msk 0x00100000UL /*!< SYSCLK fail status */ + +/*-- TRACECFG: Trace Clock Configuration Register ------------------------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :7; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_TRACECFG_bits; + +/* Bit field positions: */ +#define RCU_TRACECFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_TRACECFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_TRACECFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_TRACECFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_TRACECFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_TRACECFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_TRACECFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_TRACECFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_TRACECFG_CLKSEL_REFCLK = 0x0UL, /*!< reference clock */ + RCU_TRACECFG_CLKSEL_SRCCLK = 0x1UL, /*!< additional clock source */ + RCU_TRACECFG_CLKSEL_SYSCLK = 0x2UL, /*!< System clock */ + RCU_TRACECFG_CLKSEL_TRACEEXTCLK = 0x3UL, /*!< Trace external clock */ +} RCU_TRACECFG_CLKSEL_Enum; + +/*-- CLKOUTCFG: Clockout Configuration Register --------------------------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :7; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :3; /*!< Divider coefficient */ +} _RCU_CLKOUTCFG_bits; + +/* Bit field positions: */ +#define RCU_CLKOUTCFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_CLKOUTCFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_CLKOUTCFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_CLKOUTCFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_CLKOUTCFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_CLKOUTCFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_CLKOUTCFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_CLKOUTCFG_DIVN_Msk 0x07000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_CLKOUTCFG_CLKSEL_REFCLK = 0x0UL, /*!< reference clock */ + RCU_CLKOUTCFG_CLKSEL_SRCCLK = 0x1UL, /*!< additional clock source */ + RCU_CLKOUTCFG_CLKSEL_SYSCLK = 0x2UL, /*!< System clock */ + RCU_CLKOUTCFG_CLKSEL_PLLCLK = 0x3UL, /*!< PLL output clock */ +} RCU_CLKOUTCFG_CLKSEL_Enum; + +/*-- WDTCFG: WatchDog Configuration Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :3; /*!< RESERVED */ + uint32_t RSTDIS :1; /*!< Reset disable */ + uint32_t :3; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_WDTCFG_bits; + +/* Bit field positions: */ +#define RCU_WDTCFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_WDTCFG_RSTDIS_Pos 4 /*!< Reset disable */ +#define RCU_WDTCFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_WDTCFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_WDTCFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_WDTCFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_WDTCFG_RSTDIS_Msk 0x00000010UL /*!< Reset disable */ +#define RCU_WDTCFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_WDTCFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_WDTCFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_WDTCFG_CLKSEL_REFCLK = 0x0UL, /*!< reference clock */ + RCU_WDTCFG_CLKSEL_SRCCLK = 0x1UL, /*!< additional clock source */ + RCU_WDTCFG_CLKSEL_SYSCLK = 0x2UL, /*!< System clock */ + RCU_WDTCFG_CLKSEL_PLLCLK = 0x3UL, /*!< PLL output clock */ +} RCU_WDTCFG_CLKSEL_Enum; + +/*-- MILSTDCFG: MILSTDCFG: MILSTD Codec Clock and Reset Configuration Register --------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :3; /*!< RESERVED */ + uint32_t RSTDIS :1; /*!< Reset disable */ + uint32_t :3; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_MILSTDCFG_MILSTDCFG_bits; + +/* Bit field positions: */ +#define RCU_MILSTDCFG_MILSTDCFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_MILSTDCFG_MILSTDCFG_RSTDIS_Pos 4 /*!< Reset disable */ +#define RCU_MILSTDCFG_MILSTDCFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_MILSTDCFG_MILSTDCFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_MILSTDCFG_MILSTDCFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_MILSTDCFG_MILSTDCFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_MILSTDCFG_MILSTDCFG_RSTDIS_Msk 0x00000010UL /*!< Reset disable */ +#define RCU_MILSTDCFG_MILSTDCFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_MILSTDCFG_MILSTDCFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_MILSTDCFG_MILSTDCFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_MILSTDCFG_MILSTDCFG_CLKSEL_OSECLK = 0x0UL, /*!< external oscillator */ + RCU_MILSTDCFG_MILSTDCFG_CLKSEL_PLLCLK = 0x1UL, /*!< PLL output clock */ + RCU_MILSTDCFG_MILSTDCFG_CLKSEL_PLLDIVCLK = 0x2UL, /*!< PLL divided clock */ + RCU_MILSTDCFG_MILSTDCFG_CLKSEL_PLLEXTCLK = 0x3UL, /*!< external PLL clock source */ +} RCU_MILSTDCFG_MILSTDCFG_CLKSEL_Enum; + +/*-- SPWRCFG: SPWRCFG: SPWR TX Clock Configuration Register ---------------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :15; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_SPWRCFG_SPWRCFG_bits; + +/* Bit field positions: */ +#define RCU_SPWRCFG_SPWRCFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_SPWRCFG_SPWRCFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_SPWRCFG_SPWRCFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_SPWRCFG_SPWRCFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_SPWRCFG_SPWRCFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_SPWRCFG_SPWRCFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/*-- UARTCFG: UARTCFG: UART Clock and Reset Configuration Register --------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :3; /*!< RESERVED */ + uint32_t RSTDIS :1; /*!< Reset disable */ + uint32_t :3; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_UARTCFG_UARTCFG_bits; + +/* Bit field positions: */ +#define RCU_UARTCFG_UARTCFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_UARTCFG_UARTCFG_RSTDIS_Pos 4 /*!< Reset disable */ +#define RCU_UARTCFG_UARTCFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_UARTCFG_UARTCFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_UARTCFG_UARTCFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_UARTCFG_UARTCFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_UARTCFG_UARTCFG_RSTDIS_Msk 0x00000010UL /*!< Reset disable */ +#define RCU_UARTCFG_UARTCFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_UARTCFG_UARTCFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_UARTCFG_UARTCFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_UARTCFG_UARTCFG_CLKSEL_OSECLK = 0x0UL, /*!< external oscillator */ + RCU_UARTCFG_UARTCFG_CLKSEL_PLLCLK = 0x1UL, /*!< PLL output clock */ + RCU_UARTCFG_UARTCFG_CLKSEL_PLLDIVCLK = 0x2UL, /*!< PLL divided clock */ + RCU_UARTCFG_UARTCFG_CLKSEL_PLLEXTCLK = 0x3UL, /*!< external PLL clock source */ +} RCU_UARTCFG_UARTCFG_CLKSEL_Enum; + +/*-- SPICFG: SPICFG: SPI Clock and Reset Configuration Register -----------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :3; /*!< RESERVED */ + uint32_t RSTDIS :1; /*!< Reset disable */ + uint32_t :3; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_SPICFG_SPICFG_bits; + +/* Bit field positions: */ +#define RCU_SPICFG_SPICFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_SPICFG_SPICFG_RSTDIS_Pos 4 /*!< Reset disable */ +#define RCU_SPICFG_SPICFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_SPICFG_SPICFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_SPICFG_SPICFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_SPICFG_SPICFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_SPICFG_SPICFG_RSTDIS_Msk 0x00000010UL /*!< Reset disable */ +#define RCU_SPICFG_SPICFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_SPICFG_SPICFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_SPICFG_SPICFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_SPICFG_SPICFG_CLKSEL_OSECLK = 0x0UL, /*!< external oscillator */ + RCU_SPICFG_SPICFG_CLKSEL_PLLCLK = 0x1UL, /*!< PLL output clock */ + RCU_SPICFG_SPICFG_CLKSEL_PLLDIVCLK = 0x2UL, /*!< PLL divided clock */ + RCU_SPICFG_SPICFG_CLKSEL_PLLEXTCLK = 0x3UL, /*!< external PLL clock source */ +} RCU_SPICFG_SPICFG_CLKSEL_Enum; + +/*-- ADCCFG: ADC Clock and Reset Configuration Register ------------------------------------------------------*/ +typedef struct { + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t :3; /*!< RESERVED */ + uint32_t RSTDIS :1; /*!< Reset disable */ + uint32_t :3; /*!< RESERVED */ + uint32_t CLKSEL :2; /*!< Clock source select */ + uint32_t :6; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Enable divider */ + uint32_t :7; /*!< RESERVED */ + uint32_t DIVN :6; /*!< Divider coefficient */ +} _RCU_ADCCFG_bits; + +/* Bit field positions: */ +#define RCU_ADCCFG_CLKEN_Pos 0 /*!< Clock enable */ +#define RCU_ADCCFG_RSTDIS_Pos 4 /*!< Reset disable */ +#define RCU_ADCCFG_CLKSEL_Pos 8 /*!< Clock source select */ +#define RCU_ADCCFG_DIVEN_Pos 16 /*!< Enable divider */ +#define RCU_ADCCFG_DIVN_Pos 24 /*!< Divider coefficient */ + +/* Bit field masks: */ +#define RCU_ADCCFG_CLKEN_Msk 0x00000001UL /*!< Clock enable */ +#define RCU_ADCCFG_RSTDIS_Msk 0x00000010UL /*!< Reset disable */ +#define RCU_ADCCFG_CLKSEL_Msk 0x00000300UL /*!< Clock source select */ +#define RCU_ADCCFG_DIVEN_Msk 0x00010000UL /*!< Enable divider */ +#define RCU_ADCCFG_DIVN_Msk 0x3F000000UL /*!< Divider coefficient */ + +/* Bit field enums: */ +typedef enum { + RCU_ADCCFG_CLKSEL_OSECLK = 0x0UL, /*!< external oscillator */ + RCU_ADCCFG_CLKSEL_PLLCLK = 0x1UL, /*!< PLL output clock */ + RCU_ADCCFG_CLKSEL_PLLDIVCLK = 0x2UL, /*!< PLL divided clock */ + RCU_ADCCFG_CLKSEL_PLLEXTCLK = 0x3UL, /*!< external PLL clock source */ +} RCU_ADCCFG_CLKSEL_Enum; + +/*-- APBCFG: APB Clock Configuraton Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t DIV :2; /*!< Divider coefficent */ +} _RCU_APBCFG_bits; + +/* Bit field positions: */ +#define RCU_APBCFG_DIV_Pos 0 /*!< Divider coefficent */ + +/* Bit field masks: */ +#define RCU_APBCFG_DIV_Msk 0x00000003UL /*!< Divider coefficent */ + +/* Bit field enums: */ +typedef enum { + RCU_APBCFG_DIV_None = 0x0UL, /*!< no divide */ + RCU_APBCFG_DIV_DIV2 = 0x1UL, /*!< divide by 2 */ + RCU_APBCFG_DIV_DIV4 = 0x2UL, /*!< divide by 4 */ + RCU_APBCFG_DIV_DIV8 = 0x3UL, /*!< divide by 8 */ +} RCU_APBCFG_DIV_Enum; + +/*-- PCLKCFG0: APB Clock Configuration Register 0 ------------------------------------------------------------*/ +typedef struct { + uint32_t :9; /*!< RESERVED */ + uint32_t TUART0EN :1; /*!< TUART0 clock enable */ + uint32_t TUART1EN :1; /*!< TUART1 clock enable */ + uint32_t I2C0EN :1; /*!< I2C0 clock enable */ + uint32_t I2C1EN :1; /*!< I2C1 clock enable */ + uint32_t :4; /*!< RESERVED */ + uint32_t TMR0EN :1; /*!< TMR0 clock enable */ + uint32_t TMR1EN :1; /*!< TMR1 clock enable */ + uint32_t TMR2EN :1; /*!< TMR2 clock enable */ + uint32_t TMR3EN :1; /*!< TMR3 clock enable */ + uint32_t ETMR0EN :1; /*!< ETMR0 clock enable */ + uint32_t ETMR1EN :1; /*!< ETMR1 clock enable */ + uint32_t ETMR2EN :1; /*!< ETMR2 clock enable */ + uint32_t ETMR3EN :1; /*!< ETMR3 clock enable */ + uint32_t RTCEN :1; /*!< RTC clock enable */ + uint32_t ECAP0EN :1; /*!< CAP0 clock enable */ + uint32_t ECAP1EN :1; /*!< CAP1 clock enable */ + uint32_t ECAP2EN :1; /*!< CAP2 clock enable */ + uint32_t ECAP3EN :1; /*!< CAP3 clock enable */ + uint32_t ECAP4EN :1; /*!< CAP4 clock enable */ + uint32_t ECAP5EN :1; /*!< CAP5 clock enable */ +} _RCU_PCLKCFG0_bits; + +/* Bit field positions: */ +#define RCU_PCLKCFG0_TUART0EN_Pos 9 /*!< TUART0 clock enable */ +#define RCU_PCLKCFG0_TUART1EN_Pos 10 /*!< TUART1 clock enable */ +#define RCU_PCLKCFG0_I2C0EN_Pos 11 /*!< I2C0 clock enable */ +#define RCU_PCLKCFG0_I2C1EN_Pos 12 /*!< I2C1 clock enable */ +#define RCU_PCLKCFG0_TMR0EN_Pos 17 /*!< TMR0 clock enable */ +#define RCU_PCLKCFG0_TMR1EN_Pos 18 /*!< TMR1 clock enable */ +#define RCU_PCLKCFG0_TMR2EN_Pos 19 /*!< TMR2 clock enable */ +#define RCU_PCLKCFG0_TMR3EN_Pos 20 /*!< TMR3 clock enable */ +#define RCU_PCLKCFG0_ETMR0EN_Pos 21 /*!< ETMR0 clock enable */ +#define RCU_PCLKCFG0_ETMR1EN_Pos 22 /*!< ETMR1 clock enable */ +#define RCU_PCLKCFG0_ETMR2EN_Pos 23 /*!< ETMR2 clock enable */ +#define RCU_PCLKCFG0_ETMR3EN_Pos 24 /*!< ETMR3 clock enable */ +#define RCU_PCLKCFG0_RTCEN_Pos 25 /*!< RTC clock enable */ +#define RCU_PCLKCFG0_ECAP0EN_Pos 26 /*!< CAP0 clock enable */ +#define RCU_PCLKCFG0_ECAP1EN_Pos 27 /*!< CAP1 clock enable */ +#define RCU_PCLKCFG0_ECAP2EN_Pos 28 /*!< CAP2 clock enable */ +#define RCU_PCLKCFG0_ECAP3EN_Pos 29 /*!< CAP3 clock enable */ +#define RCU_PCLKCFG0_ECAP4EN_Pos 30 /*!< CAP4 clock enable */ +#define RCU_PCLKCFG0_ECAP5EN_Pos 31 /*!< CAP5 clock enable */ + +/* Bit field masks: */ +#define RCU_PCLKCFG0_TUART0EN_Msk 0x00000200UL /*!< TUART0 clock enable */ +#define RCU_PCLKCFG0_TUART1EN_Msk 0x00000400UL /*!< TUART1 clock enable */ +#define RCU_PCLKCFG0_I2C0EN_Msk 0x00000800UL /*!< I2C0 clock enable */ +#define RCU_PCLKCFG0_I2C1EN_Msk 0x00001000UL /*!< I2C1 clock enable */ +#define RCU_PCLKCFG0_TMR0EN_Msk 0x00020000UL /*!< TMR0 clock enable */ +#define RCU_PCLKCFG0_TMR1EN_Msk 0x00040000UL /*!< TMR1 clock enable */ +#define RCU_PCLKCFG0_TMR2EN_Msk 0x00080000UL /*!< TMR2 clock enable */ +#define RCU_PCLKCFG0_TMR3EN_Msk 0x00100000UL /*!< TMR3 clock enable */ +#define RCU_PCLKCFG0_ETMR0EN_Msk 0x00200000UL /*!< ETMR0 clock enable */ +#define RCU_PCLKCFG0_ETMR1EN_Msk 0x00400000UL /*!< ETMR1 clock enable */ +#define RCU_PCLKCFG0_ETMR2EN_Msk 0x00800000UL /*!< ETMR2 clock enable */ +#define RCU_PCLKCFG0_ETMR3EN_Msk 0x01000000UL /*!< ETMR3 clock enable */ +#define RCU_PCLKCFG0_RTCEN_Msk 0x02000000UL /*!< RTC clock enable */ +#define RCU_PCLKCFG0_ECAP0EN_Msk 0x04000000UL /*!< CAP0 clock enable */ +#define RCU_PCLKCFG0_ECAP1EN_Msk 0x08000000UL /*!< CAP1 clock enable */ +#define RCU_PCLKCFG0_ECAP2EN_Msk 0x10000000UL /*!< CAP2 clock enable */ +#define RCU_PCLKCFG0_ECAP3EN_Msk 0x20000000UL /*!< CAP3 clock enable */ +#define RCU_PCLKCFG0_ECAP4EN_Msk 0x40000000UL /*!< CAP4 clock enable */ +#define RCU_PCLKCFG0_ECAP5EN_Msk 0x80000000UL /*!< CAP5 clock enable */ + +/*-- PCLKCFG1: APB Clock Configuration Register 1 ------------------------------------------------------------*/ +typedef struct { + uint32_t PWM0EN :1; /*!< PWM0 clock enable */ + uint32_t PWM1EN :1; /*!< PWM1 clock enable */ + uint32_t PWM2EN :1; /*!< PWM2 clock enable */ + uint32_t PWM3EN :1; /*!< PWM3 clock enable */ + uint32_t PWM4EN :1; /*!< PWM4 clock enable */ + uint32_t PWM5EN :1; /*!< PWM5 clock enable */ + uint32_t PWM6EN :1; /*!< PWM6 clock enable */ + uint32_t PWM7EN :1; /*!< PWM7 clock enable */ + uint32_t PWM8EN :1; /*!< PWM8 clock enable */ + uint32_t PWM9EN :1; /*!< PWM9 clock enable */ + uint32_t QEP0EN :1; /*!< QEP0 clock enable */ + uint32_t QEP1EN :1; /*!< QEP1 clock enable */ + uint32_t QEP2EN :1; /*!< QEP2 clock enable */ + uint32_t QEP3EN :1; /*!< QEP3 clock enable */ + uint32_t LAUEN :1; /*!< LAU clock enable */ + uint32_t OWI0EN :1; /*!< OWI0 clock enable */ + uint32_t OWI1EN :1; /*!< OWI1 clock enable */ +} _RCU_PCLKCFG1_bits; + +/* Bit field positions: */ +#define RCU_PCLKCFG1_PWM0EN_Pos 0 /*!< PWM0 clock enable */ +#define RCU_PCLKCFG1_PWM1EN_Pos 1 /*!< PWM1 clock enable */ +#define RCU_PCLKCFG1_PWM2EN_Pos 2 /*!< PWM2 clock enable */ +#define RCU_PCLKCFG1_PWM3EN_Pos 3 /*!< PWM3 clock enable */ +#define RCU_PCLKCFG1_PWM4EN_Pos 4 /*!< PWM4 clock enable */ +#define RCU_PCLKCFG1_PWM5EN_Pos 5 /*!< PWM5 clock enable */ +#define RCU_PCLKCFG1_PWM6EN_Pos 6 /*!< PWM6 clock enable */ +#define RCU_PCLKCFG1_PWM7EN_Pos 7 /*!< PWM7 clock enable */ +#define RCU_PCLKCFG1_PWM8EN_Pos 8 /*!< PWM8 clock enable */ +#define RCU_PCLKCFG1_PWM9EN_Pos 9 /*!< PWM9 clock enable */ +#define RCU_PCLKCFG1_QEP0EN_Pos 10 /*!< QEP0 clock enable */ +#define RCU_PCLKCFG1_QEP1EN_Pos 11 /*!< QEP1 clock enable */ +#define RCU_PCLKCFG1_QEP2EN_Pos 12 /*!< QEP2 clock enable */ +#define RCU_PCLKCFG1_QEP3EN_Pos 13 /*!< QEP3 clock enable */ +#define RCU_PCLKCFG1_LAUEN_Pos 14 /*!< LAU clock enable */ +#define RCU_PCLKCFG1_OWI0EN_Pos 15 /*!< OWI0 clock enable */ +#define RCU_PCLKCFG1_OWI1EN_Pos 16 /*!< OWI1 clock enable */ + +/* Bit field masks: */ +#define RCU_PCLKCFG1_PWM0EN_Msk 0x00000001UL /*!< PWM0 clock enable */ +#define RCU_PCLKCFG1_PWM1EN_Msk 0x00000002UL /*!< PWM1 clock enable */ +#define RCU_PCLKCFG1_PWM2EN_Msk 0x00000004UL /*!< PWM2 clock enable */ +#define RCU_PCLKCFG1_PWM3EN_Msk 0x00000008UL /*!< PWM3 clock enable */ +#define RCU_PCLKCFG1_PWM4EN_Msk 0x00000010UL /*!< PWM4 clock enable */ +#define RCU_PCLKCFG1_PWM5EN_Msk 0x00000020UL /*!< PWM5 clock enable */ +#define RCU_PCLKCFG1_PWM6EN_Msk 0x00000040UL /*!< PWM6 clock enable */ +#define RCU_PCLKCFG1_PWM7EN_Msk 0x00000080UL /*!< PWM7 clock enable */ +#define RCU_PCLKCFG1_PWM8EN_Msk 0x00000100UL /*!< PWM8 clock enable */ +#define RCU_PCLKCFG1_PWM9EN_Msk 0x00000200UL /*!< PWM9 clock enable */ +#define RCU_PCLKCFG1_QEP0EN_Msk 0x00000400UL /*!< QEP0 clock enable */ +#define RCU_PCLKCFG1_QEP1EN_Msk 0x00000800UL /*!< QEP1 clock enable */ +#define RCU_PCLKCFG1_QEP2EN_Msk 0x00001000UL /*!< QEP2 clock enable */ +#define RCU_PCLKCFG1_QEP3EN_Msk 0x00002000UL /*!< QEP3 clock enable */ +#define RCU_PCLKCFG1_LAUEN_Msk 0x00004000UL /*!< LAU clock enable */ +#define RCU_PCLKCFG1_OWI0EN_Msk 0x00008000UL /*!< OWI0 clock enable */ +#define RCU_PCLKCFG1_OWI1EN_Msk 0x00010000UL /*!< OWI1 clock enable */ + +/*-- PRSTCFG0: APB Reset Configuration Register 0 ------------------------------------------------------------*/ +typedef struct { + uint32_t :9; /*!< RESERVED */ + uint32_t TUART0EN :1; /*!< TUART0 reset disable */ + uint32_t TUART1EN :1; /*!< TUART1 reset disable */ + uint32_t I2C0EN :1; /*!< I2C0 reset disable */ + uint32_t I2C1EN :1; /*!< I2C1 reset disable */ + uint32_t :4; /*!< RESERVED */ + uint32_t TMR0EN :1; /*!< TMR0 reset disable */ + uint32_t TMR1EN :1; /*!< TMR1 reset disable */ + uint32_t TMR2EN :1; /*!< TMR2 reset disable */ + uint32_t TMR3EN :1; /*!< TMR3 reset disable */ + uint32_t ETMR0EN :1; /*!< ETMR0 reset disable */ + uint32_t ETMR1EN :1; /*!< ETMR1 reset disable */ + uint32_t ETMR2EN :1; /*!< ETMR2 reset disable */ + uint32_t ETMR3EN :1; /*!< ETMR3 reset disable */ + uint32_t RTCEN :1; /*!< RTC reset disable */ + uint32_t ECAP0EN :1; /*!< CAP0 reset disable */ + uint32_t ECAP1EN :1; /*!< CAP1 reset disable */ + uint32_t ECAP2EN :1; /*!< CAP2 reset disable */ + uint32_t ECAP3EN :1; /*!< CAP3 reset disable */ + uint32_t ECAP4EN :1; /*!< CAP4 reset disable */ + uint32_t ECAP5EN :1; /*!< CAP5 reset disable */ +} _RCU_PRSTCFG0_bits; + +/* Bit field positions: */ +#define RCU_PRSTCFG0_TUART0EN_Pos 9 /*!< TUART0 reset disable */ +#define RCU_PRSTCFG0_TUART1EN_Pos 10 /*!< TUART1 reset disable */ +#define RCU_PRSTCFG0_I2C0EN_Pos 11 /*!< I2C0 reset disable */ +#define RCU_PRSTCFG0_I2C1EN_Pos 12 /*!< I2C1 reset disable */ +#define RCU_PRSTCFG0_TMR0EN_Pos 17 /*!< TMR0 reset disable */ +#define RCU_PRSTCFG0_TMR1EN_Pos 18 /*!< TMR1 reset disable */ +#define RCU_PRSTCFG0_TMR2EN_Pos 19 /*!< TMR2 reset disable */ +#define RCU_PRSTCFG0_TMR3EN_Pos 20 /*!< TMR3 reset disable */ +#define RCU_PRSTCFG0_ETMR0EN_Pos 21 /*!< ETMR0 reset disable */ +#define RCU_PRSTCFG0_ETMR1EN_Pos 22 /*!< ETMR1 reset disable */ +#define RCU_PRSTCFG0_ETMR2EN_Pos 23 /*!< ETMR2 reset disable */ +#define RCU_PRSTCFG0_ETMR3EN_Pos 24 /*!< ETMR3 reset disable */ +#define RCU_PRSTCFG0_RTCEN_Pos 25 /*!< RTC reset disable */ +#define RCU_PRSTCFG0_ECAP0EN_Pos 26 /*!< CAP0 reset disable */ +#define RCU_PRSTCFG0_ECAP1EN_Pos 27 /*!< CAP1 reset disable */ +#define RCU_PRSTCFG0_ECAP2EN_Pos 28 /*!< CAP2 reset disable */ +#define RCU_PRSTCFG0_ECAP3EN_Pos 29 /*!< CAP3 reset disable */ +#define RCU_PRSTCFG0_ECAP4EN_Pos 30 /*!< CAP4 reset disable */ +#define RCU_PRSTCFG0_ECAP5EN_Pos 31 /*!< CAP5 reset disable */ + +/* Bit field masks: */ +#define RCU_PRSTCFG0_TUART0EN_Msk 0x00000200UL /*!< TUART0 reset disable */ +#define RCU_PRSTCFG0_TUART1EN_Msk 0x00000400UL /*!< TUART1 reset disable */ +#define RCU_PRSTCFG0_I2C0EN_Msk 0x00000800UL /*!< I2C0 reset disable */ +#define RCU_PRSTCFG0_I2C1EN_Msk 0x00001000UL /*!< I2C1 reset disable */ +#define RCU_PRSTCFG0_TMR0EN_Msk 0x00020000UL /*!< TMR0 reset disable */ +#define RCU_PRSTCFG0_TMR1EN_Msk 0x00040000UL /*!< TMR1 reset disable */ +#define RCU_PRSTCFG0_TMR2EN_Msk 0x00080000UL /*!< TMR2 reset disable */ +#define RCU_PRSTCFG0_TMR3EN_Msk 0x00100000UL /*!< TMR3 reset disable */ +#define RCU_PRSTCFG0_ETMR0EN_Msk 0x00200000UL /*!< ETMR0 reset disable */ +#define RCU_PRSTCFG0_ETMR1EN_Msk 0x00400000UL /*!< ETMR1 reset disable */ +#define RCU_PRSTCFG0_ETMR2EN_Msk 0x00800000UL /*!< ETMR2 reset disable */ +#define RCU_PRSTCFG0_ETMR3EN_Msk 0x01000000UL /*!< ETMR3 reset disable */ +#define RCU_PRSTCFG0_RTCEN_Msk 0x02000000UL /*!< RTC reset disable */ +#define RCU_PRSTCFG0_ECAP0EN_Msk 0x04000000UL /*!< CAP0 reset disable */ +#define RCU_PRSTCFG0_ECAP1EN_Msk 0x08000000UL /*!< CAP1 reset disable */ +#define RCU_PRSTCFG0_ECAP2EN_Msk 0x10000000UL /*!< CAP2 reset disable */ +#define RCU_PRSTCFG0_ECAP3EN_Msk 0x20000000UL /*!< CAP3 reset disable */ +#define RCU_PRSTCFG0_ECAP4EN_Msk 0x40000000UL /*!< CAP4 reset disable */ +#define RCU_PRSTCFG0_ECAP5EN_Msk 0x80000000UL /*!< CAP5 reset disable */ + +/*-- PRSTCFG1: APB Reset Configuration Register 1 ------------------------------------------------------------*/ +typedef struct { + uint32_t PWM0EN :1; /*!< PWM0 reset disable */ + uint32_t PWM1EN :1; /*!< PWM1 reset disable */ + uint32_t PWM2EN :1; /*!< PWM2 reset disable */ + uint32_t PWM3EN :1; /*!< PWM3 reset disable */ + uint32_t PWM4EN :1; /*!< PWM4 reset disable */ + uint32_t PWM5EN :1; /*!< PWM5 reset disable */ + uint32_t PWM6EN :1; /*!< PWM6 reset disable */ + uint32_t PWM7EN :1; /*!< PWM7 reset disable */ + uint32_t PWM8EN :1; /*!< PWM8 reset disable */ + uint32_t PWM9EN :1; /*!< PWM9 reset disable */ + uint32_t QEP0EN :1; /*!< QEP0 reset disable */ + uint32_t QEP1EN :1; /*!< QEP1 reset disable */ + uint32_t QEP2EN :1; /*!< QEP2 reset disable */ + uint32_t QEP3EN :1; /*!< QEP3 reset disable */ + uint32_t LAUEN :1; /*!< LAU reset disable */ + uint32_t OWI0EN :1; /*!< OWI0 reset disable */ + uint32_t OWI1EN :1; /*!< OWI1 reset disable */ +} _RCU_PRSTCFG1_bits; + +/* Bit field positions: */ +#define RCU_PRSTCFG1_PWM0EN_Pos 0 /*!< PWM0 reset disable */ +#define RCU_PRSTCFG1_PWM1EN_Pos 1 /*!< PWM1 reset disable */ +#define RCU_PRSTCFG1_PWM2EN_Pos 2 /*!< PWM2 reset disable */ +#define RCU_PRSTCFG1_PWM3EN_Pos 3 /*!< PWM3 reset disable */ +#define RCU_PRSTCFG1_PWM4EN_Pos 4 /*!< PWM4 reset disable */ +#define RCU_PRSTCFG1_PWM5EN_Pos 5 /*!< PWM5 reset disable */ +#define RCU_PRSTCFG1_PWM6EN_Pos 6 /*!< PWM6 reset disable */ +#define RCU_PRSTCFG1_PWM7EN_Pos 7 /*!< PWM7 reset disable */ +#define RCU_PRSTCFG1_PWM8EN_Pos 8 /*!< PWM8 reset disable */ +#define RCU_PRSTCFG1_PWM9EN_Pos 9 /*!< PWM9 reset disable */ +#define RCU_PRSTCFG1_QEP0EN_Pos 10 /*!< QEP0 reset disable */ +#define RCU_PRSTCFG1_QEP1EN_Pos 11 /*!< QEP1 reset disable */ +#define RCU_PRSTCFG1_QEP2EN_Pos 12 /*!< QEP2 reset disable */ +#define RCU_PRSTCFG1_QEP3EN_Pos 13 /*!< QEP3 reset disable */ +#define RCU_PRSTCFG1_LAUEN_Pos 14 /*!< LAU reset disable */ +#define RCU_PRSTCFG1_OWI0EN_Pos 15 /*!< OWI0 reset disable */ +#define RCU_PRSTCFG1_OWI1EN_Pos 16 /*!< OWI1 reset disable */ + +/* Bit field masks: */ +#define RCU_PRSTCFG1_PWM0EN_Msk 0x00000001UL /*!< PWM0 reset disable */ +#define RCU_PRSTCFG1_PWM1EN_Msk 0x00000002UL /*!< PWM1 reset disable */ +#define RCU_PRSTCFG1_PWM2EN_Msk 0x00000004UL /*!< PWM2 reset disable */ +#define RCU_PRSTCFG1_PWM3EN_Msk 0x00000008UL /*!< PWM3 reset disable */ +#define RCU_PRSTCFG1_PWM4EN_Msk 0x00000010UL /*!< PWM4 reset disable */ +#define RCU_PRSTCFG1_PWM5EN_Msk 0x00000020UL /*!< PWM5 reset disable */ +#define RCU_PRSTCFG1_PWM6EN_Msk 0x00000040UL /*!< PWM6 reset disable */ +#define RCU_PRSTCFG1_PWM7EN_Msk 0x00000080UL /*!< PWM7 reset disable */ +#define RCU_PRSTCFG1_PWM8EN_Msk 0x00000100UL /*!< PWM8 reset disable */ +#define RCU_PRSTCFG1_PWM9EN_Msk 0x00000200UL /*!< PWM9 reset disable */ +#define RCU_PRSTCFG1_QEP0EN_Msk 0x00000400UL /*!< QEP0 reset disable */ +#define RCU_PRSTCFG1_QEP1EN_Msk 0x00000800UL /*!< QEP1 reset disable */ +#define RCU_PRSTCFG1_QEP2EN_Msk 0x00001000UL /*!< QEP2 reset disable */ +#define RCU_PRSTCFG1_QEP3EN_Msk 0x00002000UL /*!< QEP3 reset disable */ +#define RCU_PRSTCFG1_LAUEN_Msk 0x00004000UL /*!< LAU reset disable */ +#define RCU_PRSTCFG1_OWI0EN_Msk 0x00008000UL /*!< OWI0 reset disable */ +#define RCU_PRSTCFG1_OWI1EN_Msk 0x00010000UL /*!< OWI1 reset disable */ + +/*-- HCLKCFG: AHB Clock Configuration Register ---------------------------------------------------------------*/ +typedef struct { + uint32_t GPIOAEN :1; /*!< Enable clock for GPIOA port */ + uint32_t GPIOBEN :1; /*!< Enable clock for GPIOB port */ + uint32_t GPIOCEN :1; /*!< Enable clock for GPIOC port */ + uint32_t GPIODEN :1; /*!< Enable clock for GPIOD port */ + uint32_t GPIOEEN :1; /*!< Enable clock for GPIOE port */ + uint32_t GPIOFEN :1; /*!< Enable clock for GPIOF port */ + uint32_t GPIOGEN :1; /*!< Enable clock for GPIOG port */ + uint32_t GPIOHEN :1; /*!< Enable clock for GPIOH port */ + uint32_t GPIOJEN :1; /*!< Enable clock for GPIOJ port */ + uint32_t GPIOKEN :1; /*!< Enable clock for GPIOK port */ + uint32_t GPIOLEN :1; /*!< Enable clock for GPIOL port */ + uint32_t GPIOMEN :1; /*!< Enable clock for GPIOM port */ + uint32_t CANEN :1; /*!< Enable clock for CAN interface */ + uint32_t ETHEN :1; /*!< Enable clock for ethernet */ + uint32_t MILSTD0EN :1; /*!< Enable clock for milstd 0 interface */ + uint32_t MILSTD1EN :1; /*!< Enable clock for milstd 1 interface */ + uint32_t SPWR0EN :1; /*!< Enable clock for spacewire 0 interface */ + uint32_t SPWR1EN :1; /*!< Enable clock for spacewire 1 interface */ + uint32_t EXTMEMEN :1; /*!< Enable clock for extmem interface */ + uint32_t SDFMEN :1; /*!< Enable clock for SDFM */ +} _RCU_HCLKCFG_bits; + +/* Bit field positions: */ +#define RCU_HCLKCFG_GPIOAEN_Pos 0 /*!< Enable clock for GPIOA port */ +#define RCU_HCLKCFG_GPIOBEN_Pos 1 /*!< Enable clock for GPIOB port */ +#define RCU_HCLKCFG_GPIOCEN_Pos 2 /*!< Enable clock for GPIOC port */ +#define RCU_HCLKCFG_GPIODEN_Pos 3 /*!< Enable clock for GPIOD port */ +#define RCU_HCLKCFG_GPIOEEN_Pos 4 /*!< Enable clock for GPIOE port */ +#define RCU_HCLKCFG_GPIOFEN_Pos 5 /*!< Enable clock for GPIOF port */ +#define RCU_HCLKCFG_GPIOGEN_Pos 6 /*!< Enable clock for GPIOG port */ +#define RCU_HCLKCFG_GPIOHEN_Pos 7 /*!< Enable clock for GPIOH port */ +#define RCU_HCLKCFG_GPIOJEN_Pos 8 /*!< Enable clock for GPIOJ port */ +#define RCU_HCLKCFG_GPIOKEN_Pos 9 /*!< Enable clock for GPIOK port */ +#define RCU_HCLKCFG_GPIOLEN_Pos 10 /*!< Enable clock for GPIOL port */ +#define RCU_HCLKCFG_GPIOMEN_Pos 11 /*!< Enable clock for GPIOM port */ +#define RCU_HCLKCFG_CANEN_Pos 12 /*!< Enable clock for CAN interface */ +#define RCU_HCLKCFG_ETHEN_Pos 13 /*!< Enable clock for ethernet */ +#define RCU_HCLKCFG_MILSTD0EN_Pos 14 /*!< Enable clock for milstd 0 interface */ +#define RCU_HCLKCFG_MILSTD1EN_Pos 15 /*!< Enable clock for milstd 1 interface */ +#define RCU_HCLKCFG_SPWR0EN_Pos 16 /*!< Enable clock for spacewire 0 interface */ +#define RCU_HCLKCFG_SPWR1EN_Pos 17 /*!< Enable clock for spacewire 1 interface */ +#define RCU_HCLKCFG_EXTMEMEN_Pos 18 /*!< Enable clock for extmem interface */ +#define RCU_HCLKCFG_SDFMEN_Pos 19 /*!< Enable clock for SDFM */ + +/* Bit field masks: */ +#define RCU_HCLKCFG_GPIOAEN_Msk 0x00000001UL /*!< Enable clock for GPIOA port */ +#define RCU_HCLKCFG_GPIOBEN_Msk 0x00000002UL /*!< Enable clock for GPIOB port */ +#define RCU_HCLKCFG_GPIOCEN_Msk 0x00000004UL /*!< Enable clock for GPIOC port */ +#define RCU_HCLKCFG_GPIODEN_Msk 0x00000008UL /*!< Enable clock for GPIOD port */ +#define RCU_HCLKCFG_GPIOEEN_Msk 0x00000010UL /*!< Enable clock for GPIOE port */ +#define RCU_HCLKCFG_GPIOFEN_Msk 0x00000020UL /*!< Enable clock for GPIOF port */ +#define RCU_HCLKCFG_GPIOGEN_Msk 0x00000040UL /*!< Enable clock for GPIOG port */ +#define RCU_HCLKCFG_GPIOHEN_Msk 0x00000080UL /*!< Enable clock for GPIOH port */ +#define RCU_HCLKCFG_GPIOJEN_Msk 0x00000100UL /*!< Enable clock for GPIOJ port */ +#define RCU_HCLKCFG_GPIOKEN_Msk 0x00000200UL /*!< Enable clock for GPIOK port */ +#define RCU_HCLKCFG_GPIOLEN_Msk 0x00000400UL /*!< Enable clock for GPIOL port */ +#define RCU_HCLKCFG_GPIOMEN_Msk 0x00000800UL /*!< Enable clock for GPIOM port */ +#define RCU_HCLKCFG_CANEN_Msk 0x00001000UL /*!< Enable clock for CAN interface */ +#define RCU_HCLKCFG_ETHEN_Msk 0x00002000UL /*!< Enable clock for ethernet */ +#define RCU_HCLKCFG_MILSTD0EN_Msk 0x00004000UL /*!< Enable clock for milstd 0 interface */ +#define RCU_HCLKCFG_MILSTD1EN_Msk 0x00008000UL /*!< Enable clock for milstd 1 interface */ +#define RCU_HCLKCFG_SPWR0EN_Msk 0x00010000UL /*!< Enable clock for spacewire 0 interface */ +#define RCU_HCLKCFG_SPWR1EN_Msk 0x00020000UL /*!< Enable clock for spacewire 1 interface */ +#define RCU_HCLKCFG_EXTMEMEN_Msk 0x00040000UL /*!< Enable clock for extmem interface */ +#define RCU_HCLKCFG_SDFMEN_Msk 0x00080000UL /*!< Enable clock for SDFM */ + +/*-- HRSTCFG: AHB Reset Configuration Register ---------------------------------------------------------------*/ +typedef struct { + uint32_t GPIOAEN :1; /*!< Disable reset from GPIOA port */ + uint32_t GPIOBEN :1; /*!< Disable reset from GPIOB port */ + uint32_t GPIOCEN :1; /*!< Disable reset from GPIOC port */ + uint32_t GPIODEN :1; /*!< Disable reset from GPIOD port */ + uint32_t GPIOEEN :1; /*!< Disable reset from GPIOE port */ + uint32_t GPIOFEN :1; /*!< Disable reset from GPIOF port */ + uint32_t GPIOGEN :1; /*!< Disable reset from GPIOG port */ + uint32_t GPIOHEN :1; /*!< Disable reset from GPIOH port */ + uint32_t GPIOJEN :1; /*!< Disable reset from GPIOJ port */ + uint32_t GPIOKEN :1; /*!< Disable reset from GPIOK port */ + uint32_t GPIOLEN :1; /*!< Disable reset from GPIOL port */ + uint32_t GPIOMEN :1; /*!< Disable reset from GPIOM port */ + uint32_t CANEN :1; /*!< Disable reset from CAN interface */ + uint32_t ETHEN :1; /*!< Disable reset from Ethernet */ + uint32_t MILSTD0EN :1; /*!< Disable reset from milstd 0 interface */ + uint32_t MILSTD1EN :1; /*!< Disable reset from milstd 1 nterface */ + uint32_t SPWR0EN :1; /*!< Disable reset from spacewire 0 interface */ + uint32_t SPWR1EN :1; /*!< Disable reset from spacewire 1 interface */ + uint32_t EXTMEMEN :1; /*!< Disable reset from extmem interface */ + uint32_t SDFMEN :1; /*!< Disable reset from SDFM */ +} _RCU_HRSTCFG_bits; + +/* Bit field positions: */ +#define RCU_HRSTCFG_GPIOAEN_Pos 0 /*!< Disable reset from GPIOA port */ +#define RCU_HRSTCFG_GPIOBEN_Pos 1 /*!< Disable reset from GPIOB port */ +#define RCU_HRSTCFG_GPIOCEN_Pos 2 /*!< Disable reset from GPIOC port */ +#define RCU_HRSTCFG_GPIODEN_Pos 3 /*!< Disable reset from GPIOD port */ +#define RCU_HRSTCFG_GPIOEEN_Pos 4 /*!< Disable reset from GPIOE port */ +#define RCU_HRSTCFG_GPIOFEN_Pos 5 /*!< Disable reset from GPIOF port */ +#define RCU_HRSTCFG_GPIOGEN_Pos 6 /*!< Disable reset from GPIOG port */ +#define RCU_HRSTCFG_GPIOHEN_Pos 7 /*!< Disable reset from GPIOH port */ +#define RCU_HRSTCFG_GPIOJEN_Pos 8 /*!< Disable reset from GPIOJ port */ +#define RCU_HRSTCFG_GPIOKEN_Pos 9 /*!< Disable reset from GPIOK port */ +#define RCU_HRSTCFG_GPIOLEN_Pos 10 /*!< Disable reset from GPIOL port */ +#define RCU_HRSTCFG_GPIOMEN_Pos 11 /*!< Disable reset from GPIOM port */ +#define RCU_HRSTCFG_CANEN_Pos 12 /*!< Disable reset from CAN interface */ +#define RCU_HRSTCFG_ETHEN_Pos 13 /*!< Disable reset from Ethernet */ +#define RCU_HRSTCFG_MILSTD0EN_Pos 14 /*!< Disable reset from milstd 0 interface */ +#define RCU_HRSTCFG_MILSTD1EN_Pos 15 /*!< Disable reset from milstd 1 nterface */ +#define RCU_HRSTCFG_SPWR0EN_Pos 16 /*!< Disable reset from spacewire 0 interface */ +#define RCU_HRSTCFG_SPWR1EN_Pos 17 /*!< Disable reset from spacewire 1 interface */ +#define RCU_HRSTCFG_EXTMEMEN_Pos 18 /*!< Disable reset from extmem interface */ +#define RCU_HRSTCFG_SDFMEN_Pos 19 /*!< Disable reset from SDFM */ + +/* Bit field masks: */ +#define RCU_HRSTCFG_GPIOAEN_Msk 0x00000001UL /*!< Disable reset from GPIOA port */ +#define RCU_HRSTCFG_GPIOBEN_Msk 0x00000002UL /*!< Disable reset from GPIOB port */ +#define RCU_HRSTCFG_GPIOCEN_Msk 0x00000004UL /*!< Disable reset from GPIOC port */ +#define RCU_HRSTCFG_GPIODEN_Msk 0x00000008UL /*!< Disable reset from GPIOD port */ +#define RCU_HRSTCFG_GPIOEEN_Msk 0x00000010UL /*!< Disable reset from GPIOE port */ +#define RCU_HRSTCFG_GPIOFEN_Msk 0x00000020UL /*!< Disable reset from GPIOF port */ +#define RCU_HRSTCFG_GPIOGEN_Msk 0x00000040UL /*!< Disable reset from GPIOG port */ +#define RCU_HRSTCFG_GPIOHEN_Msk 0x00000080UL /*!< Disable reset from GPIOH port */ +#define RCU_HRSTCFG_GPIOJEN_Msk 0x00000100UL /*!< Disable reset from GPIOJ port */ +#define RCU_HRSTCFG_GPIOKEN_Msk 0x00000200UL /*!< Disable reset from GPIOK port */ +#define RCU_HRSTCFG_GPIOLEN_Msk 0x00000400UL /*!< Disable reset from GPIOL port */ +#define RCU_HRSTCFG_GPIOMEN_Msk 0x00000800UL /*!< Disable reset from GPIOM port */ +#define RCU_HRSTCFG_CANEN_Msk 0x00001000UL /*!< Disable reset from CAN interface */ +#define RCU_HRSTCFG_ETHEN_Msk 0x00002000UL /*!< Disable reset from Ethernet */ +#define RCU_HRSTCFG_MILSTD0EN_Msk 0x00004000UL /*!< Disable reset from milstd 0 interface */ +#define RCU_HRSTCFG_MILSTD1EN_Msk 0x00008000UL /*!< Disable reset from milstd 1 nterface */ +#define RCU_HRSTCFG_SPWR0EN_Msk 0x00010000UL /*!< Disable reset from spacewire 0 interface */ +#define RCU_HRSTCFG_SPWR1EN_Msk 0x00020000UL /*!< Disable reset from spacewire 1 interface */ +#define RCU_HRSTCFG_EXTMEMEN_Msk 0x00040000UL /*!< Disable reset from extmem interface */ +#define RCU_HRSTCFG_SDFMEN_Msk 0x00080000UL /*!< Disable reset from SDFM */ + +//Cluster MILSTDCFG: +typedef struct { + union { + /*!< MILSTD Codec Clock and Reset Configuration Register */ + __IO uint32_t MILSTDCFG; /*!< MILSTDCFG : type used for word access */ + __IO _RCU_MILSTDCFG_MILSTDCFG_bits MILSTDCFG_bit; /*!< MILSTDCFG_bit: structure used for bit access */ + }; +} _RCU_MILSTDCFG_TypeDef; +//Cluster SPWRCFG: +typedef struct { + union { + /*!< SPWR TX Clock Configuration Register */ + __IO uint32_t SPWRCFG; /*!< SPWRCFG : type used for word access */ + __IO _RCU_SPWRCFG_SPWRCFG_bits SPWRCFG_bit; /*!< SPWRCFG_bit: structure used for bit access */ + }; +} _RCU_SPWRCFG_TypeDef; +//Cluster UARTCFG: +typedef struct { + union { + /*!< UART Clock and Reset Configuration Register */ + __IO uint32_t UARTCFG; /*!< UARTCFG : type used for word access */ + __IO _RCU_UARTCFG_UARTCFG_bits UARTCFG_bit; /*!< UARTCFG_bit: structure used for bit access */ + }; +} _RCU_UARTCFG_TypeDef; +//Cluster SPICFG: +typedef struct { + union { + /*!< SPI Clock and Reset Configuration Register */ + __IO uint32_t SPICFG; /*!< SPICFG : type used for word access */ + __IO _RCU_SPICFG_SPICFG_bits SPICFG_bit; /*!< SPICFG_bit: structure used for bit access */ + }; +} _RCU_SPICFG_TypeDef; +typedef struct { + __IO uint32_t Reserved0[2]; + union { /*!< PLL Configuration Register */ + __IO uint32_t PLLCFG; /*!< PLLCFG : type used for word access */ + __IO _RCU_PLLCFG_bits PLLCFG_bit; /*!< PLLCFG_bit: structure used for bit access */ + }; + union { /*!< PLL Divider Register */ + __IO uint32_t PLLDIV; /*!< PLLDIV : type used for word access */ + __IO _RCU_PLLDIV_bits PLLDIV_bit; /*!< PLLDIV_bit: structure used for bit access */ + }; + union { /*!< System Clock Configuration Register */ + __IO uint32_t SYSCLKCFG; /*!< SYSCLKCFG : type used for word access */ + __IO _RCU_SYSCLKCFG_bits SYSCLKCFG_bit; /*!< SYSCLKCFG_bit: structure used for bit access */ + }; + union { /*!< System Clock Status Register */ + __I uint32_t SYSCLKSTAT; /*!< SYSCLKSTAT : type used for word access */ + __I _RCU_SYSCLKSTAT_bits SYSCLKSTAT_bit; /*!< SYSCLKSTAT_bit: structure used for bit access */ + }; + union { /*!< Security Sysytem Clock Period Register 0 */ + __IO uint32_t SECPRD; /*!< SECPRD : type used for word access */ + __IO _RCU_SECPRD_bits SECPRD_bit; /*!< SECPRD_bit: structure used for bit access */ + }; + union { /*!< System Reset Configuration Register */ + __IO uint32_t SYSRSTCFG; /*!< SYSRSTCFG : type used for word access */ + __IO _RCU_SYSRSTCFG_bits SYSRSTCFG_bit; /*!< SYSRSTCFG_bit: structure used for bit access */ + }; + union { /*!< Reset Status Register */ + __IO uint32_t SYSRSTSTAT; /*!< SYSRSTSTAT : type used for word access */ + __IO _RCU_SYSRSTSTAT_bits SYSRSTSTAT_bit; /*!< SYSRSTSTAT_bit: structure used for bit access */ + }; + union { /*!< Interrupt Enable Register */ + __IO uint32_t INTEN; /*!< INTEN : type used for word access */ + __IO _RCU_INTEN_bits INTEN_bit; /*!< INTEN_bit: structure used for bit access */ + }; + union { /*!< Interrupt Status Register */ + __IO uint32_t INTSTAT; /*!< INTSTAT : type used for word access */ + __IO _RCU_INTSTAT_bits INTSTAT_bit; /*!< INTSTAT_bit: structure used for bit access */ + }; + union { /*!< Trace Clock Configuration Register */ + __IO uint32_t TRACECFG; /*!< TRACECFG : type used for word access */ + __IO _RCU_TRACECFG_bits TRACECFG_bit; /*!< TRACECFG_bit: structure used for bit access */ + }; + union { /*!< Clockout Configuration Register */ + __IO uint32_t CLKOUTCFG; /*!< CLKOUTCFG : type used for word access */ + __IO _RCU_CLKOUTCFG_bits CLKOUTCFG_bit; /*!< CLKOUTCFG_bit: structure used for bit access */ + }; + union { /*!< WatchDog Configuration Register */ + __IO uint32_t WDTCFG; /*!< WDTCFG : type used for word access */ + __IO _RCU_WDTCFG_bits WDTCFG_bit; /*!< WDTCFG_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1[2]; + _RCU_MILSTDCFG_TypeDef MILSTDCFG[2]; + __IO uint32_t Reserved2[2]; + _RCU_SPWRCFG_TypeDef SPWRCFG[2]; + __IO uint32_t Reserved3[2]; + _RCU_UARTCFG_TypeDef UARTCFG[4]; + __IO uint32_t Reserved4[4]; + _RCU_SPICFG_TypeDef SPICFG[4]; + __IO uint32_t Reserved5[4]; + union { /*!< ADC Clock and Reset Configuration Register */ + __IO uint32_t ADCCFG; /*!< ADCCFG : type used for word access */ + __IO _RCU_ADCCFG_bits ADCCFG_bit; /*!< ADCCFG_bit: structure used for bit access */ + }; + __IO uint32_t Reserved6[7]; + union { /*!< APB Clock Configuraton Register */ + __IO uint32_t APBCFG; /*!< APBCFG : type used for word access */ + __IO _RCU_APBCFG_bits APBCFG_bit; /*!< APBCFG_bit: structure used for bit access */ + }; + __IO uint32_t Reserved7[7]; + union { /*!< APB Clock Configuration Register 0 */ + __IO uint32_t PCLKCFG0; /*!< PCLKCFG0 : type used for word access */ + __IO _RCU_PCLKCFG0_bits PCLKCFG0_bit; /*!< PCLKCFG0_bit: structure used for bit access */ + }; + union { /*!< APB Clock Configuration Register 1 */ + __IO uint32_t PCLKCFG1; /*!< PCLKCFG1 : type used for word access */ + __IO _RCU_PCLKCFG1_bits PCLKCFG1_bit; /*!< PCLKCFG1_bit: structure used for bit access */ + }; + __IO uint32_t Reserved8[2]; + union { /*!< APB Reset Configuration Register 0 */ + __IO uint32_t PRSTCFG0; /*!< PRSTCFG0 : type used for word access */ + __IO _RCU_PRSTCFG0_bits PRSTCFG0_bit; /*!< PRSTCFG0_bit: structure used for bit access */ + }; + union { /*!< APB Reset Configuration Register 1 */ + __IO uint32_t PRSTCFG1; /*!< PRSTCFG1 : type used for word access */ + __IO _RCU_PRSTCFG1_bits PRSTCFG1_bit; /*!< PRSTCFG1_bit: structure used for bit access */ + }; + __IO uint32_t Reserved9[2]; + union { /*!< AHB Clock Configuration Register */ + __IO uint32_t HCLKCFG; /*!< HCLKCFG : type used for word access */ + __IO _RCU_HCLKCFG_bits HCLKCFG_bit; /*!< HCLKCFG_bit: structure used for bit access */ + }; + union { /*!< AHB Reset Configuration Register */ + __IO uint32_t HRSTCFG; /*!< HRSTCFG : type used for word access */ + __IO _RCU_HRSTCFG_bits HRSTCFG_bit; /*!< HRSTCFG_bit: structure used for bit access */ + }; +} RCU_TypeDef; + + +/******************************************************************************/ +/* SIU registers */ +/******************************************************************************/ + +/*-- PWMSYNC: PWM syncronization control register ------------------------------------------------------------*/ +typedef struct { + uint32_t SYNCSEL :2; /*!< PWM sync scheme control */ + uint32_t SWSYNC :1; /*!< SYNCI pulse software emulation on PWM0 */ + uint32_t :1; /*!< RESERVED */ + uint32_t CAPSYNCSEL :1; /*!< CAP sync scheme control */ + uint32_t :3; /*!< RESERVED */ + uint32_t PRESCRST :10; /*!< PWM prescalers reset control */ +} _SIU_PWMSYNC_bits; + +/* Bit field positions: */ +#define SIU_PWMSYNC_SYNCSEL_Pos 0 /*!< PWM sync scheme control */ +#define SIU_PWMSYNC_SWSYNC_Pos 2 /*!< SYNCI pulse software emulation on PWM0 */ +#define SIU_PWMSYNC_CAPSYNCSEL_Pos 4 /*!< CAP sync scheme control */ +#define SIU_PWMSYNC_PRESCRST_Pos 8 /*!< PWM prescalers reset control */ + +/* Bit field masks: */ +#define SIU_PWMSYNC_SYNCSEL_Msk 0x00000003UL /*!< PWM sync scheme control */ +#define SIU_PWMSYNC_SWSYNC_Msk 0x00000004UL /*!< SYNCI pulse software emulation on PWM0 */ +#define SIU_PWMSYNC_CAPSYNCSEL_Msk 0x00000010UL /*!< CAP sync scheme control */ +#define SIU_PWMSYNC_PRESCRST_Msk 0x0003FF00UL /*!< PWM prescalers reset control */ + +/*-- SERVCTL: Service mode control register ------------------------------------------------------------------*/ +typedef struct { + uint32_t CHIPCLR :1; /*!< On-chip memories full clear task start */ + uint32_t DONE :1; /*!< Status of clear task */ + uint32_t :29; /*!< RESERVED */ + uint32_t SERVEN :1; /*!< Service mode enable status */ +} _SIU_SERVCTL_bits; + +/* Bit field positions: */ +#define SIU_SERVCTL_CHIPCLR_Pos 0 /*!< On-chip memories full clear task start */ +#define SIU_SERVCTL_DONE_Pos 1 /*!< Status of clear task */ +#define SIU_SERVCTL_SERVEN_Pos 31 /*!< Service mode enable status */ + +/* Bit field masks: */ +#define SIU_SERVCTL_CHIPCLR_Msk 0x00000001UL /*!< On-chip memories full clear task start */ +#define SIU_SERVCTL_DONE_Msk 0x00000002UL /*!< Status of clear task */ +#define SIU_SERVCTL_SERVEN_Msk 0x80000000UL /*!< Service mode enable status */ + +/*-- DMAMUX: DMA external requests mux control register ------------------------------------------------------*/ +typedef struct { + uint32_t SRCSEL24 :3; /*!< Request source select for DMA channel 24 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL25 :3; /*!< Request source select for DMA channel 25 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL26 :3; /*!< Request source select for DMA channel 26 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL27 :3; /*!< Request source select for DMA channel 27 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL28 :3; /*!< Request source select for DMA channel 28 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL29 :3; /*!< Request source select for DMA channel 29 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL30 :3; /*!< Request source select for DMA channel 30 */ + uint32_t :1; /*!< RESERVED */ + uint32_t SRCSEL31 :3; /*!< Request source select for DMA channel 31 */ +} _SIU_DMAMUX_bits; + +/* Bit field positions: */ +#define SIU_DMAMUX_SRCSEL24_Pos 0 /*!< Request source select for DMA channel 24 */ +#define SIU_DMAMUX_SRCSEL25_Pos 4 /*!< Request source select for DMA channel 25 */ +#define SIU_DMAMUX_SRCSEL26_Pos 8 /*!< Request source select for DMA channel 26 */ +#define SIU_DMAMUX_SRCSEL27_Pos 12 /*!< Request source select for DMA channel 27 */ +#define SIU_DMAMUX_SRCSEL28_Pos 16 /*!< Request source select for DMA channel 28 */ +#define SIU_DMAMUX_SRCSEL29_Pos 20 /*!< Request source select for DMA channel 29 */ +#define SIU_DMAMUX_SRCSEL30_Pos 24 /*!< Request source select for DMA channel 30 */ +#define SIU_DMAMUX_SRCSEL31_Pos 28 /*!< Request source select for DMA channel 31 */ + +/* Bit field masks: */ +#define SIU_DMAMUX_SRCSEL24_Msk 0x00000007UL /*!< Request source select for DMA channel 24 */ +#define SIU_DMAMUX_SRCSEL25_Msk 0x00000070UL /*!< Request source select for DMA channel 25 */ +#define SIU_DMAMUX_SRCSEL26_Msk 0x00000700UL /*!< Request source select for DMA channel 26 */ +#define SIU_DMAMUX_SRCSEL27_Msk 0x00007000UL /*!< Request source select for DMA channel 27 */ +#define SIU_DMAMUX_SRCSEL28_Msk 0x00070000UL /*!< Request source select for DMA channel 28 */ +#define SIU_DMAMUX_SRCSEL29_Msk 0x00700000UL /*!< Request source select for DMA channel 29 */ +#define SIU_DMAMUX_SRCSEL30_Msk 0x07000000UL /*!< Request source select for DMA channel 30 */ +#define SIU_DMAMUX_SRCSEL31_Msk 0x70000000UL /*!< Request source select for DMA channel 31 */ + +/* Bit field enums: */ +typedef enum { + SIU_DMAMUX_SRCSEL24_GPIOA = 0x0UL, /*!< request by GPIOA */ + SIU_DMAMUX_SRCSEL24_TMR0 = 0x1UL, /*!< request by TMR0 */ + SIU_DMAMUX_SRCSEL24_PWM0A = 0x2UL, /*!< request by PWM0A */ + SIU_DMAMUX_SRCSEL24_PWM1A = 0x3UL, /*!< request by PWM1A */ + SIU_DMAMUX_SRCSEL24_PWM8A = 0x4UL, /*!< request by PWM8A */ + SIU_DMAMUX_SRCSEL24_PWM9A = 0x5UL, /*!< request by PWM9A */ +} SIU_DMAMUX_SRCSEL24_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL25_GPIOB = 0x0UL, /*!< request by GPIOB */ + SIU_DMAMUX_SRCSEL25_TMR1 = 0x1UL, /*!< request by TMR1 */ + SIU_DMAMUX_SRCSEL25_PWM2A = 0x2UL, /*!< request by PWM2A */ + SIU_DMAMUX_SRCSEL25_PWM3A = 0x3UL, /*!< request by PWM3A */ + SIU_DMAMUX_SRCSEL25_QEP0 = 0x4UL, /*!< request by QEP0 */ + SIU_DMAMUX_SRCSEL25_SDFM0 = 0x5UL, /*!< request by SDFM0 */ +} SIU_DMAMUX_SRCSEL25_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL26_GPIOC = 0x0UL, /*!< request by GPIOC */ + SIU_DMAMUX_SRCSEL26_TMR2 = 0x1UL, /*!< request by TMR2 */ + SIU_DMAMUX_SRCSEL26_PWM4A = 0x2UL, /*!< request by PWM4A */ + SIU_DMAMUX_SRCSEL26_PWM5A = 0x3UL, /*!< request by PWM5A */ + SIU_DMAMUX_SRCSEL26_QEP1 = 0x4UL, /*!< request by QEP1 */ + SIU_DMAMUX_SRCSEL26_SDFM1 = 0x5UL, /*!< request by SDFM1 */ +} SIU_DMAMUX_SRCSEL26_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL27_GPIOD = 0x0UL, /*!< request by GPIOD */ + SIU_DMAMUX_SRCSEL27_TMR3 = 0x1UL, /*!< request by TMR3 */ + SIU_DMAMUX_SRCSEL27_PWM6A = 0x2UL, /*!< request by PWM6A */ + SIU_DMAMUX_SRCSEL27_PWM7A = 0x3UL, /*!< request by PWM7A */ + SIU_DMAMUX_SRCSEL27_GPIOJ = 0x4UL, /*!< request by GPIOJ */ + SIU_DMAMUX_SRCSEL27_GPIOK = 0x5UL, /*!< request by GPIOK */ +} SIU_DMAMUX_SRCSEL27_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL28_GPIOE = 0x0UL, /*!< request by GPIOE */ + SIU_DMAMUX_SRCSEL28_ETMR0 = 0x1UL, /*!< request by ETMR0 */ + SIU_DMAMUX_SRCSEL28_PWM0B = 0x2UL, /*!< request by PWM0B */ + SIU_DMAMUX_SRCSEL28_PWM1B = 0x3UL, /*!< request by PWM1B */ + SIU_DMAMUX_SRCSEL28_PWM8B = 0x4UL, /*!< request by PWM8B */ + SIU_DMAMUX_SRCSEL28_PWM9B = 0x5UL, /*!< request by PWM9B */ +} SIU_DMAMUX_SRCSEL28_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL29_GPIOF = 0x0UL, /*!< request by GPIOF */ + SIU_DMAMUX_SRCSEL29_ETMR1 = 0x1UL, /*!< request by ETMR1 */ + SIU_DMAMUX_SRCSEL29_PWM2B = 0x2UL, /*!< request by PWM2B */ + SIU_DMAMUX_SRCSEL29_PWM3B = 0x3UL, /*!< request by PWM3B */ + SIU_DMAMUX_SRCSEL29_QEP2 = 0x4UL, /*!< request by QEP2 */ + SIU_DMAMUX_SRCSEL29_SDFM2 = 0x5UL, /*!< request by SDFM2 */ +} SIU_DMAMUX_SRCSEL29_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL30_GPIOG = 0x0UL, /*!< request by GPIOG */ + SIU_DMAMUX_SRCSEL30_ETMR2 = 0x1UL, /*!< request by ETMR2 */ + SIU_DMAMUX_SRCSEL30_PWM4B = 0x2UL, /*!< request by PWM4B */ + SIU_DMAMUX_SRCSEL30_PWM5B = 0x3UL, /*!< request by PWM5B */ + SIU_DMAMUX_SRCSEL30_QEP3 = 0x4UL, /*!< request by QEP3 */ + SIU_DMAMUX_SRCSEL30_SDFM3 = 0x5UL, /*!< request by SDFM3 */ +} SIU_DMAMUX_SRCSEL30_Enum; + +typedef enum { + SIU_DMAMUX_SRCSEL31_GPIOH = 0x0UL, /*!< request by GPIOH */ + SIU_DMAMUX_SRCSEL31_ETMR3 = 0x1UL, /*!< request by ETMR3 */ + SIU_DMAMUX_SRCSEL31_PWM6B = 0x2UL, /*!< request by PWM6B */ + SIU_DMAMUX_SRCSEL31_PWM7B = 0x3UL, /*!< request by PWM7B */ + SIU_DMAMUX_SRCSEL31_GPIOL = 0x4UL, /*!< request by GPIOL */ + SIU_DMAMUX_SRCSEL31_GPIOM = 0x5UL, /*!< request by GPIOM */ +} SIU_DMAMUX_SRCSEL31_Enum; + +/*-- TMRMUX: TMR external clock mux control register ---------------------------------------------------------*/ +typedef struct { + uint32_t EXTINSEL0 :1; /*!< Select external input source for TMR0 */ + uint32_t EXTINSEL1 :1; /*!< Select external input source for TMR1 */ + uint32_t EXTINSEL2 :1; /*!< Select external input source for TMR2 */ + uint32_t EXTINSEL3 :1; /*!< Select external input source for TMR3 */ +} _SIU_TMRMUX_bits; + +/* Bit field positions: */ +#define SIU_TMRMUX_EXTINSEL0_Pos 0 /*!< Select external input source for TMR0 */ +#define SIU_TMRMUX_EXTINSEL1_Pos 1 /*!< Select external input source for TMR1 */ +#define SIU_TMRMUX_EXTINSEL2_Pos 2 /*!< Select external input source for TMR2 */ +#define SIU_TMRMUX_EXTINSEL3_Pos 3 /*!< Select external input source for TMR3 */ + +/* Bit field masks: */ +#define SIU_TMRMUX_EXTINSEL0_Msk 0x00000001UL /*!< Select external input source for TMR0 */ +#define SIU_TMRMUX_EXTINSEL1_Msk 0x00000002UL /*!< Select external input source for TMR1 */ +#define SIU_TMRMUX_EXTINSEL2_Msk 0x00000004UL /*!< Select external input source for TMR2 */ +#define SIU_TMRMUX_EXTINSEL3_Msk 0x00000008UL /*!< Select external input source for TMR3 */ + +/*-- CAPMUX: CAP input mux control register ------------------------------------------------------------------*/ +typedef struct { + uint32_t CAPINSEL0 :4; /*!< Select input source for CAP0 */ + uint32_t CAPINSEL1 :4; /*!< Select input source for CAP1 */ + uint32_t CAPINSEL2 :4; /*!< Select input source for CAP2 */ + uint32_t CAPINSEL3 :4; /*!< Select input source for CAP3 */ + uint32_t CAPINSEL4 :4; /*!< Select input source for CAP4 */ + uint32_t CAPINSEL5 :4; /*!< Select input source for CAP5 */ +} _SIU_CAPMUX_bits; + +/* Bit field positions: */ +#define SIU_CAPMUX_CAPINSEL0_Pos 0 /*!< Select input source for CAP0 */ +#define SIU_CAPMUX_CAPINSEL1_Pos 4 /*!< Select input source for CAP1 */ +#define SIU_CAPMUX_CAPINSEL2_Pos 8 /*!< Select input source for CAP2 */ +#define SIU_CAPMUX_CAPINSEL3_Pos 12 /*!< Select input source for CAP3 */ +#define SIU_CAPMUX_CAPINSEL4_Pos 16 /*!< Select input source for CAP4 */ +#define SIU_CAPMUX_CAPINSEL5_Pos 20 /*!< Select input source for CAP5 */ + +/* Bit field masks: */ +#define SIU_CAPMUX_CAPINSEL0_Msk 0x0000000FUL /*!< Select input source for CAP0 */ +#define SIU_CAPMUX_CAPINSEL1_Msk 0x000000F0UL /*!< Select input source for CAP1 */ +#define SIU_CAPMUX_CAPINSEL2_Msk 0x00000F00UL /*!< Select input source for CAP2 */ +#define SIU_CAPMUX_CAPINSEL3_Msk 0x0000F000UL /*!< Select input source for CAP3 */ +#define SIU_CAPMUX_CAPINSEL4_Msk 0x000F0000UL /*!< Select input source for CAP4 */ +#define SIU_CAPMUX_CAPINSEL5_Msk 0x00F00000UL /*!< Select input source for CAP5 */ + +/* Bit field enums: */ +typedef enum { + SIU_CAPMUX_CAPINSEL0_CAP0 = 0x0UL, /*!< default CAP0 input */ + SIU_CAPMUX_CAPINSEL0_SDFMCHZ0 = 0x8UL, /*!< SDFM comparator 0 HZ output */ + SIU_CAPMUX_CAPINSEL0_SDFMCHZ1 = 0x9UL, /*!< SDFM comparator 1 HZ output */ + SIU_CAPMUX_CAPINSEL0_SDFMCHZ2 = 0xAUL, /*!< SDFM comparator 2 HZ output */ + SIU_CAPMUX_CAPINSEL0_SDFMCHZ3 = 0xBUL, /*!< SDFM comparator 3 HZ output */ + SIU_CAPMUX_CAPINSEL0_QEPA0 = 0xCUL, /*!< QEP0 A input */ + SIU_CAPMUX_CAPINSEL0_QEPA1 = 0xDUL, /*!< QEP1 A input */ + SIU_CAPMUX_CAPINSEL0_QEPA2 = 0xEUL, /*!< QEP2 A input */ + SIU_CAPMUX_CAPINSEL0_QEPA3 = 0xFUL, /*!< QEP3 A input */ +} SIU_CAPMUX_CAPINSEL0_Enum; + +typedef enum { + SIU_CAPMUX_CAPINSEL1_CAP1 = 0x0UL, /*!< default CAP1 input */ + SIU_CAPMUX_CAPINSEL1_SDFMCHZ0 = 0x8UL, /*!< SDFM comparator 0 HZ output */ + SIU_CAPMUX_CAPINSEL1_SDFMCHZ1 = 0x9UL, /*!< SDFM comparator 1 HZ output */ + SIU_CAPMUX_CAPINSEL1_SDFMCHZ2 = 0xAUL, /*!< SDFM comparator 2 HZ output */ + SIU_CAPMUX_CAPINSEL1_SDFMCHZ3 = 0xBUL, /*!< SDFM comparator 3 HZ output */ + SIU_CAPMUX_CAPINSEL1_QEPB0 = 0xCUL, /*!< QEP0 B input */ + SIU_CAPMUX_CAPINSEL1_QEPB1 = 0xDUL, /*!< QEP1 B input */ + SIU_CAPMUX_CAPINSEL1_QEPB2 = 0xEUL, /*!< QEP2 B input */ + SIU_CAPMUX_CAPINSEL1_QEPB3 = 0xFUL, /*!< QEP3 B input */ +} SIU_CAPMUX_CAPINSEL1_Enum; + +typedef enum { + SIU_CAPMUX_CAPINSEL2_CAP2 = 0x0UL, /*!< default CAP2 input */ + SIU_CAPMUX_CAPINSEL2_SDFMCHZ0 = 0x8UL, /*!< SDFM comparator 0 HZ output */ + SIU_CAPMUX_CAPINSEL2_SDFMCHZ1 = 0x9UL, /*!< SDFM comparator 1 HZ output */ + SIU_CAPMUX_CAPINSEL2_SDFMCHZ2 = 0xAUL, /*!< SDFM comparator 2 HZ output */ + SIU_CAPMUX_CAPINSEL2_SDFMCHZ3 = 0xBUL, /*!< SDFM comparator 3 HZ output */ + SIU_CAPMUX_CAPINSEL2_QEPI0 = 0xCUL, /*!< QEP0 I input */ + SIU_CAPMUX_CAPINSEL2_QEPI1 = 0xDUL, /*!< QEP1 I input */ + SIU_CAPMUX_CAPINSEL2_QEPI2 = 0xEUL, /*!< QEP2 I input */ + SIU_CAPMUX_CAPINSEL2_QEPI3 = 0xFUL, /*!< QEP3 I input */ +} SIU_CAPMUX_CAPINSEL2_Enum; + +typedef enum { + SIU_CAPMUX_CAPINSEL3_CAP3 = 0x0UL, /*!< default CAP3 input */ + SIU_CAPMUX_CAPINSEL3_SDFMCHZ0 = 0x8UL, /*!< SDFM comparator 0 HZ output */ + SIU_CAPMUX_CAPINSEL3_SDFMCHZ1 = 0x9UL, /*!< SDFM comparator 1 HZ output */ + SIU_CAPMUX_CAPINSEL3_SDFMCHZ2 = 0xAUL, /*!< SDFM comparator 2 HZ output */ + SIU_CAPMUX_CAPINSEL3_SDFMCHZ3 = 0xBUL, /*!< SDFM comparator 3 HZ output */ + SIU_CAPMUX_CAPINSEL3_QEPA0 = 0xCUL, /*!< QEP0 A input */ + SIU_CAPMUX_CAPINSEL3_QEPA1 = 0xDUL, /*!< QEP1 A input */ + SIU_CAPMUX_CAPINSEL3_QEPA2 = 0xEUL, /*!< QEP2 A input */ + SIU_CAPMUX_CAPINSEL3_QEPA3 = 0xFUL, /*!< QEP3 A input */ +} SIU_CAPMUX_CAPINSEL3_Enum; + +typedef enum { + SIU_CAPMUX_CAPINSEL4_CAP4 = 0x0UL, /*!< default CAP4 input */ + SIU_CAPMUX_CAPINSEL4_SDFMCHZ0 = 0x8UL, /*!< SDFM comparator 0 HZ output */ + SIU_CAPMUX_CAPINSEL4_SDFMCHZ1 = 0x9UL, /*!< SDFM comparator 1 HZ output */ + SIU_CAPMUX_CAPINSEL4_SDFMCHZ2 = 0xAUL, /*!< SDFM comparator 2 HZ output */ + SIU_CAPMUX_CAPINSEL4_SDFMCHZ3 = 0xBUL, /*!< SDFM comparator 3 HZ output */ + SIU_CAPMUX_CAPINSEL4_QEPB0 = 0xCUL, /*!< QEP0 B input */ + SIU_CAPMUX_CAPINSEL4_QEPB1 = 0xDUL, /*!< QEP1 B input */ + SIU_CAPMUX_CAPINSEL4_QEPB2 = 0xEUL, /*!< QEP2 B input */ + SIU_CAPMUX_CAPINSEL4_QEPB3 = 0xFUL, /*!< QEP3 B input */ +} SIU_CAPMUX_CAPINSEL4_Enum; + +typedef enum { + SIU_CAPMUX_CAPINSEL5_CAP5 = 0x0UL, /*!< default CAP5 input */ + SIU_CAPMUX_CAPINSEL5_SDFMCHZ0 = 0x8UL, /*!< SDFM comparator 0 HZ output */ + SIU_CAPMUX_CAPINSEL5_SDFMCHZ1 = 0x9UL, /*!< SDFM comparator 1 HZ output */ + SIU_CAPMUX_CAPINSEL5_SDFMCHZ2 = 0xAUL, /*!< SDFM comparator 2 HZ output */ + SIU_CAPMUX_CAPINSEL5_SDFMCHZ3 = 0xBUL, /*!< SDFM comparator 3 HZ output */ + SIU_CAPMUX_CAPINSEL5_QEPI0 = 0xCUL, /*!< QEP0 I input */ + SIU_CAPMUX_CAPINSEL5_QEPI1 = 0xDUL, /*!< QEP1 I input */ + SIU_CAPMUX_CAPINSEL5_QEPI2 = 0xEUL, /*!< QEP2 I input */ + SIU_CAPMUX_CAPINSEL5_QEPI3 = 0xFUL, /*!< QEP3 I input */ +} SIU_CAPMUX_CAPINSEL5_Enum; + +/*-- QCQUALCTL: QEP and CAP qualifier control register -------------------------------------------------------*/ +typedef struct { + uint32_t CAPEN0 :1; /*!< Enable qualifier for CAP0 */ + uint32_t CAPEN1 :1; /*!< Enable qualifier for CAP1 */ + uint32_t CAPEN2 :1; /*!< Enable qualifier for CAP2 */ + uint32_t CAPEN3 :1; /*!< Enable qualifier for CAP3 */ + uint32_t CAPEN4 :1; /*!< Enable qualifier for CAP4 */ + uint32_t CAPEN5 :1; /*!< Enable qualifier for CAP5 */ + uint32_t :2; /*!< RESERVED */ + uint32_t CAPMODE0 :1; /*!< Select mode of qualifier for CAP0 */ + uint32_t CAPMODE1 :1; /*!< Select mode of qualifier for CAP1 */ + uint32_t CAPMODE2 :1; /*!< Select mode of qualifier for CAP2 */ + uint32_t CAPMODE3 :1; /*!< Select mode of qualifier for CAP3 */ + uint32_t CAPMODE4 :1; /*!< Select mode of qualifier for CAP4 */ + uint32_t CAPMODE5 :1; /*!< Select mode of qualifier for CAP5 */ + uint32_t :2; /*!< RESERVED */ + uint32_t QEPEN0 :1; /*!< Enable qualifier for QEP0 */ + uint32_t QEPEN1 :1; /*!< Enable qualifier for QEP1 */ + uint32_t QEPEN2 :1; /*!< Enable qualifier for QEP2 */ + uint32_t QEPEN3 :1; /*!< Enable qualifier for QEP3 */ + uint32_t :4; /*!< RESERVED */ + uint32_t QEPMODE0 :1; /*!< Select mode of qualifier for QEP0 */ + uint32_t QEPMODE1 :1; /*!< Select mode of qualifier for QEP1 */ + uint32_t QEPMODE2 :1; /*!< Select mode of qualifier for QEP2 */ + uint32_t QEPMODE3 :1; /*!< Select mode of qualifier for QEP3 */ +} _SIU_QCQUALCTL_bits; + +/* Bit field positions: */ +#define SIU_QCQUALCTL_CAPEN0_Pos 0 /*!< Enable qualifier for CAP0 */ +#define SIU_QCQUALCTL_CAPEN1_Pos 1 /*!< Enable qualifier for CAP1 */ +#define SIU_QCQUALCTL_CAPEN2_Pos 2 /*!< Enable qualifier for CAP2 */ +#define SIU_QCQUALCTL_CAPEN3_Pos 3 /*!< Enable qualifier for CAP3 */ +#define SIU_QCQUALCTL_CAPEN4_Pos 4 /*!< Enable qualifier for CAP4 */ +#define SIU_QCQUALCTL_CAPEN5_Pos 5 /*!< Enable qualifier for CAP5 */ +#define SIU_QCQUALCTL_CAPMODE0_Pos 8 /*!< Select mode of qualifier for CAP0 */ +#define SIU_QCQUALCTL_CAPMODE1_Pos 9 /*!< Select mode of qualifier for CAP1 */ +#define SIU_QCQUALCTL_CAPMODE2_Pos 10 /*!< Select mode of qualifier for CAP2 */ +#define SIU_QCQUALCTL_CAPMODE3_Pos 11 /*!< Select mode of qualifier for CAP3 */ +#define SIU_QCQUALCTL_CAPMODE4_Pos 12 /*!< Select mode of qualifier for CAP4 */ +#define SIU_QCQUALCTL_CAPMODE5_Pos 13 /*!< Select mode of qualifier for CAP5 */ +#define SIU_QCQUALCTL_QEPEN0_Pos 16 /*!< Enable qualifier for QEP0 */ +#define SIU_QCQUALCTL_QEPEN1_Pos 17 /*!< Enable qualifier for QEP1 */ +#define SIU_QCQUALCTL_QEPEN2_Pos 18 /*!< Enable qualifier for QEP2 */ +#define SIU_QCQUALCTL_QEPEN3_Pos 19 /*!< Enable qualifier for QEP3 */ +#define SIU_QCQUALCTL_QEPMODE0_Pos 24 /*!< Select mode of qualifier for QEP0 */ +#define SIU_QCQUALCTL_QEPMODE1_Pos 25 /*!< Select mode of qualifier for QEP1 */ +#define SIU_QCQUALCTL_QEPMODE2_Pos 26 /*!< Select mode of qualifier for QEP2 */ +#define SIU_QCQUALCTL_QEPMODE3_Pos 27 /*!< Select mode of qualifier for QEP3 */ + +/* Bit field masks: */ +#define SIU_QCQUALCTL_CAPEN0_Msk 0x00000001UL /*!< Enable qualifier for CAP0 */ +#define SIU_QCQUALCTL_CAPEN1_Msk 0x00000002UL /*!< Enable qualifier for CAP1 */ +#define SIU_QCQUALCTL_CAPEN2_Msk 0x00000004UL /*!< Enable qualifier for CAP2 */ +#define SIU_QCQUALCTL_CAPEN3_Msk 0x00000008UL /*!< Enable qualifier for CAP3 */ +#define SIU_QCQUALCTL_CAPEN4_Msk 0x00000010UL /*!< Enable qualifier for CAP4 */ +#define SIU_QCQUALCTL_CAPEN5_Msk 0x00000020UL /*!< Enable qualifier for CAP5 */ +#define SIU_QCQUALCTL_CAPMODE0_Msk 0x00000100UL /*!< Select mode of qualifier for CAP0 */ +#define SIU_QCQUALCTL_CAPMODE1_Msk 0x00000200UL /*!< Select mode of qualifier for CAP1 */ +#define SIU_QCQUALCTL_CAPMODE2_Msk 0x00000400UL /*!< Select mode of qualifier for CAP2 */ +#define SIU_QCQUALCTL_CAPMODE3_Msk 0x00000800UL /*!< Select mode of qualifier for CAP3 */ +#define SIU_QCQUALCTL_CAPMODE4_Msk 0x00001000UL /*!< Select mode of qualifier for CAP4 */ +#define SIU_QCQUALCTL_CAPMODE5_Msk 0x00002000UL /*!< Select mode of qualifier for CAP5 */ +#define SIU_QCQUALCTL_QEPEN0_Msk 0x00010000UL /*!< Enable qualifier for QEP0 */ +#define SIU_QCQUALCTL_QEPEN1_Msk 0x00020000UL /*!< Enable qualifier for QEP1 */ +#define SIU_QCQUALCTL_QEPEN2_Msk 0x00040000UL /*!< Enable qualifier for QEP2 */ +#define SIU_QCQUALCTL_QEPEN3_Msk 0x00080000UL /*!< Enable qualifier for QEP3 */ +#define SIU_QCQUALCTL_QEPMODE0_Msk 0x01000000UL /*!< Select mode of qualifier for QEP0 */ +#define SIU_QCQUALCTL_QEPMODE1_Msk 0x02000000UL /*!< Select mode of qualifier for QEP1 */ +#define SIU_QCQUALCTL_QEPMODE2_Msk 0x04000000UL /*!< Select mode of qualifier for QEP2 */ +#define SIU_QCQUALCTL_QEPMODE3_Msk 0x08000000UL /*!< Select mode of qualifier for QEP3 */ + +/*-- QCQUALSAMPLE: QEP and CAP qualifier sample period set register ------------------------------------------*/ +typedef struct { + uint32_t CAPVAL :16; /*!< Set sample period of qualifer for all CAPs */ + uint32_t QEPVAL :16; /*!< Set sample period of qualifer for all QEPs */ +} _SIU_QCQUALSAMPLE_bits; + +/* Bit field positions: */ +#define SIU_QCQUALSAMPLE_CAPVAL_Pos 0 /*!< Set sample period of qualifer for all CAPs */ +#define SIU_QCQUALSAMPLE_QEPVAL_Pos 16 /*!< Set sample period of qualifer for all QEPs */ + +/* Bit field masks: */ +#define SIU_QCQUALSAMPLE_CAPVAL_Msk 0x0000FFFFUL /*!< Set sample period of qualifer for all CAPs */ +#define SIU_QCQUALSAMPLE_QEPVAL_Msk 0xFFFF0000UL /*!< Set sample period of qualifer for all QEPs */ + +/*-- RAMWSCTL: RAM waitstates control register ---------------------------------------------------------------*/ +typedef struct { + uint32_t WSEN0 :1; /*!< RAM0 additional waitstate */ + uint32_t WSEN1 :1; /*!< RAM1 additional waitstate */ + uint32_t WSEN2 :1; /*!< RAM2 additional waitstate */ +} _SIU_RAMWSCTL_bits; + +/* Bit field positions: */ +#define SIU_RAMWSCTL_WSEN0_Pos 0 /*!< RAM0 additional waitstate */ +#define SIU_RAMWSCTL_WSEN1_Pos 1 /*!< RAM1 additional waitstate */ +#define SIU_RAMWSCTL_WSEN2_Pos 2 /*!< RAM2 additional waitstate */ + +/* Bit field masks: */ +#define SIU_RAMWSCTL_WSEN0_Msk 0x00000001UL /*!< RAM0 additional waitstate */ +#define SIU_RAMWSCTL_WSEN1_Msk 0x00000002UL /*!< RAM1 additional waitstate */ +#define SIU_RAMWSCTL_WSEN2_Msk 0x00000004UL /*!< RAM2 additional waitstate */ + +/*-- CHIPID: Chip identifier ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t REV :4; /*!< Revision number */ + uint32_t ID :28; /*!< Model ID */ +} _SIU_CHIPID_bits; + +/* Bit field positions: */ +#define SIU_CHIPID_REV_Pos 0 /*!< Revision number */ +#define SIU_CHIPID_ID_Pos 4 /*!< Model ID */ + +/* Bit field masks: */ +#define SIU_CHIPID_REV_Msk 0x0000000FUL /*!< Revision number */ +#define SIU_CHIPID_ID_Msk 0xFFFFFFF0UL /*!< Model ID */ + +typedef struct { + __IO uint32_t Reserved0[4]; + union { /*!< PWM syncronization control register */ + __IO uint32_t PWMSYNC; /*!< PWMSYNC : type used for word access */ + __IO _SIU_PWMSYNC_bits PWMSYNC_bit; /*!< PWMSYNC_bit: structure used for bit access */ + }; + union { /*!< Service mode control register */ + __IO uint32_t SERVCTL; /*!< SERVCTL : type used for word access */ + __IO _SIU_SERVCTL_bits SERVCTL_bit; /*!< SERVCTL_bit: structure used for bit access */ + }; + union { /*!< DMA external requests mux control register */ + __IO uint32_t DMAMUX; /*!< DMAMUX : type used for word access */ + __IO _SIU_DMAMUX_bits DMAMUX_bit; /*!< DMAMUX_bit: structure used for bit access */ + }; + union { /*!< TMR external clock mux control register */ + __IO uint32_t TMRMUX; /*!< TMRMUX : type used for word access */ + __IO _SIU_TMRMUX_bits TMRMUX_bit; /*!< TMRMUX_bit: structure used for bit access */ + }; + union { /*!< CAP input mux control register */ + __IO uint32_t CAPMUX; /*!< CAPMUX : type used for word access */ + __IO _SIU_CAPMUX_bits CAPMUX_bit; /*!< CAPMUX_bit: structure used for bit access */ + }; + union { /*!< QEP and CAP qualifier control register */ + __IO uint32_t QCQUALCTL; /*!< QCQUALCTL : type used for word access */ + __IO _SIU_QCQUALCTL_bits QCQUALCTL_bit; /*!< QCQUALCTL_bit: structure used for bit access */ + }; + union { /*!< QEP and CAP qualifier sample period set register */ + __IO uint32_t QCQUALSAMPLE; /*!< QCQUALSAMPLE : type used for word access */ + __IO _SIU_QCQUALSAMPLE_bits QCQUALSAMPLE_bit; /*!< QCQUALSAMPLE_bit: structure used for bit access */ + }; + union { /*!< RAM waitstates control register */ + __IO uint32_t RAMWSCTL; /*!< RAMWSCTL : type used for word access */ + __IO _SIU_RAMWSCTL_bits RAMWSCTL_bit; /*!< RAMWSCTL_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1[1011]; + union { /*!< Chip identifier */ + __I uint32_t CHIPID; /*!< CHIPID : type used for word access */ + __I _SIU_CHIPID_bits CHIPID_bit; /*!< CHIPID_bit: structure used for bit access */ + }; +} SIU_TypeDef; + + +/******************************************************************************/ +/* PMU registers */ +/******************************************************************************/ + +/*-- CFG: PMU Configuration Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable PMU */ +} _PMU_CFG_bits; + +/* Bit field positions: */ +#define PMU_CFG_EN_Pos 0 /*!< Enable PMU */ + +/* Bit field masks: */ +#define PMU_CFG_EN_Msk 0x00000001UL /*!< Enable PMU */ + +/*-- PUDEL: PMU Powerup Delay Value --------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :16; /*!< Delay value for powerup peripheral blocks (in REFCLK ticks) */ +} _PMU_PUDEL_bits; + +/* Bit field positions: */ +#define PMU_PUDEL_VAL_Pos 0 /*!< Delay value for powerup peripheral blocks (in REFCLK ticks) */ + +/* Bit field masks: */ +#define PMU_PUDEL_VAL_Msk 0x0000FFFFUL /*!< Delay value for powerup peripheral blocks (in REFCLK ticks) */ + +/*-- PDEN: PMU Enable Powerdown for peripheral ---------------------------------------------------------------*/ +typedef struct { + uint32_t PLLPD :1; /*!< Enable powerdown for PLL */ + uint32_t MFLASHPD :1; /*!< Enable powerdown for MFLASH */ + uint32_t BFLASHPD :1; /*!< Enable powerdown for BFLASH */ + uint32_t OSEPD :1; /*!< Enable powerdown for external oscillator */ +} _PMU_PDEN_bits; + +/* Bit field positions: */ +#define PMU_PDEN_PLLPD_Pos 0 /*!< Enable powerdown for PLL */ +#define PMU_PDEN_MFLASHPD_Pos 1 /*!< Enable powerdown for MFLASH */ +#define PMU_PDEN_BFLASHPD_Pos 2 /*!< Enable powerdown for BFLASH */ +#define PMU_PDEN_OSEPD_Pos 3 /*!< Enable powerdown for external oscillator */ + +/* Bit field masks: */ +#define PMU_PDEN_PLLPD_Msk 0x00000001UL /*!< Enable powerdown for PLL */ +#define PMU_PDEN_MFLASHPD_Msk 0x00000002UL /*!< Enable powerdown for MFLASH */ +#define PMU_PDEN_BFLASHPD_Msk 0x00000004UL /*!< Enable powerdown for BFLASH */ +#define PMU_PDEN_OSEPD_Msk 0x00000008UL /*!< Enable powerdown for external oscillator */ + +/*-- RXEVEN: PMU RX Event generation enable register ---------------------------------------------------------*/ +typedef struct { + uint32_t GPIOAEV :1; /*!< Enable RX event from GPIOA pins */ + uint32_t GPIOBEV :1; /*!< Enable RX event from GPIOB pins */ + uint32_t GPIOCEV :1; /*!< Enable RX event from GPIOC pins */ + uint32_t GPIODEV :1; /*!< Enable RX event from GPIOD pins */ + uint32_t GPIOEEV :1; /*!< Enable RX event from GPIOE pins */ + uint32_t GPIOFEV :1; /*!< Enable RX event from GPIOF pins */ + uint32_t GPIOGEV :1; /*!< Enable RX event from GPIOG pins */ + uint32_t GPIOHEV :1; /*!< Enable RX event from GPIOH pins */ + uint32_t GPIOJEV :1; /*!< Enable RX event from GPIOJ pins */ + uint32_t GPIOKEV :1; /*!< Enable RX event from GPIOK pins */ + uint32_t GPIOLEV :1; /*!< Enable RX event from GPIOL pins */ + uint32_t GPIOMEV :1; /*!< Enable RX event from GPIOM pins */ +} _PMU_RXEVEN_bits; + +/* Bit field positions: */ +#define PMU_RXEVEN_GPIOAEV_Pos 0 /*!< Enable RX event from GPIOA pins */ +#define PMU_RXEVEN_GPIOBEV_Pos 1 /*!< Enable RX event from GPIOB pins */ +#define PMU_RXEVEN_GPIOCEV_Pos 2 /*!< Enable RX event from GPIOC pins */ +#define PMU_RXEVEN_GPIODEV_Pos 3 /*!< Enable RX event from GPIOD pins */ +#define PMU_RXEVEN_GPIOEEV_Pos 4 /*!< Enable RX event from GPIOE pins */ +#define PMU_RXEVEN_GPIOFEV_Pos 5 /*!< Enable RX event from GPIOF pins */ +#define PMU_RXEVEN_GPIOGEV_Pos 6 /*!< Enable RX event from GPIOG pins */ +#define PMU_RXEVEN_GPIOHEV_Pos 7 /*!< Enable RX event from GPIOH pins */ +#define PMU_RXEVEN_GPIOJEV_Pos 8 /*!< Enable RX event from GPIOJ pins */ +#define PMU_RXEVEN_GPIOKEV_Pos 9 /*!< Enable RX event from GPIOK pins */ +#define PMU_RXEVEN_GPIOLEV_Pos 10 /*!< Enable RX event from GPIOL pins */ +#define PMU_RXEVEN_GPIOMEV_Pos 11 /*!< Enable RX event from GPIOM pins */ + +/* Bit field masks: */ +#define PMU_RXEVEN_GPIOAEV_Msk 0x00000001UL /*!< Enable RX event from GPIOA pins */ +#define PMU_RXEVEN_GPIOBEV_Msk 0x00000002UL /*!< Enable RX event from GPIOB pins */ +#define PMU_RXEVEN_GPIOCEV_Msk 0x00000004UL /*!< Enable RX event from GPIOC pins */ +#define PMU_RXEVEN_GPIODEV_Msk 0x00000008UL /*!< Enable RX event from GPIOD pins */ +#define PMU_RXEVEN_GPIOEEV_Msk 0x00000010UL /*!< Enable RX event from GPIOE pins */ +#define PMU_RXEVEN_GPIOFEV_Msk 0x00000020UL /*!< Enable RX event from GPIOF pins */ +#define PMU_RXEVEN_GPIOGEV_Msk 0x00000040UL /*!< Enable RX event from GPIOG pins */ +#define PMU_RXEVEN_GPIOHEV_Msk 0x00000080UL /*!< Enable RX event from GPIOH pins */ +#define PMU_RXEVEN_GPIOJEV_Msk 0x00000100UL /*!< Enable RX event from GPIOJ pins */ +#define PMU_RXEVEN_GPIOKEV_Msk 0x00000200UL /*!< Enable RX event from GPIOK pins */ +#define PMU_RXEVEN_GPIOLEV_Msk 0x00000400UL /*!< Enable RX event from GPIOL pins */ +#define PMU_RXEVEN_GPIOMEV_Msk 0x00000800UL /*!< Enable RX event from GPIOM pins */ + +/*-- ADCPC: ADC Power Control --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t LDOEN0 :1; /*!< Enable LDO of ADC0 */ + uint32_t LDOEN1 :1; /*!< Enable LDO of ADC1 */ + uint32_t LDOEN2 :1; /*!< Enable LDO of ADC2 */ + uint32_t LDOEN3 :1; /*!< Enable LDO of ADC3 */ + uint32_t :4; /*!< RESERVED */ + uint32_t LDORDY0 :1; /*!< ADC0 LDO ready status */ + uint32_t LDORDY1 :1; /*!< ADC1 LDO ready status */ + uint32_t LDORDY2 :1; /*!< ADC2 LDO ready status */ + uint32_t LDORDY3 :1; /*!< ADC3 LDO ready status */ +} _PMU_ADCPC_bits; + +/* Bit field positions: */ +#define PMU_ADCPC_LDOEN0_Pos 0 /*!< Enable LDO of ADC0 */ +#define PMU_ADCPC_LDOEN1_Pos 1 /*!< Enable LDO of ADC1 */ +#define PMU_ADCPC_LDOEN2_Pos 2 /*!< Enable LDO of ADC2 */ +#define PMU_ADCPC_LDOEN3_Pos 3 /*!< Enable LDO of ADC3 */ +#define PMU_ADCPC_LDORDY0_Pos 8 /*!< ADC0 LDO ready status */ +#define PMU_ADCPC_LDORDY1_Pos 9 /*!< ADC1 LDO ready status */ +#define PMU_ADCPC_LDORDY2_Pos 10 /*!< ADC2 LDO ready status */ +#define PMU_ADCPC_LDORDY3_Pos 11 /*!< ADC3 LDO ready status */ + +/* Bit field masks: */ +#define PMU_ADCPC_LDOEN0_Msk 0x00000001UL /*!< Enable LDO of ADC0 */ +#define PMU_ADCPC_LDOEN1_Msk 0x00000002UL /*!< Enable LDO of ADC1 */ +#define PMU_ADCPC_LDOEN2_Msk 0x00000004UL /*!< Enable LDO of ADC2 */ +#define PMU_ADCPC_LDOEN3_Msk 0x00000008UL /*!< Enable LDO of ADC3 */ +#define PMU_ADCPC_LDORDY0_Msk 0x00000100UL /*!< ADC0 LDO ready status */ +#define PMU_ADCPC_LDORDY1_Msk 0x00000200UL /*!< ADC1 LDO ready status */ +#define PMU_ADCPC_LDORDY2_Msk 0x00000400UL /*!< ADC2 LDO ready status */ +#define PMU_ADCPC_LDORDY3_Msk 0x00000800UL /*!< ADC3 LDO ready status */ + +typedef struct { + union { /*!< PMU Configuration Register */ + __IO uint32_t CFG; /*!< CFG : type used for word access */ + __IO _PMU_CFG_bits CFG_bit; /*!< CFG_bit: structure used for bit access */ + }; + union { /*!< PMU Powerup Delay Value */ + __IO uint32_t PUDEL; /*!< PUDEL : type used for word access */ + __IO _PMU_PUDEL_bits PUDEL_bit; /*!< PUDEL_bit: structure used for bit access */ + }; + union { /*!< PMU Enable Powerdown for peripheral */ + __IO uint32_t PDEN; /*!< PDEN : type used for word access */ + __IO _PMU_PDEN_bits PDEN_bit; /*!< PDEN_bit: structure used for bit access */ + }; + union { /*!< PMU RX Event generation enable register */ + __IO uint32_t RXEVEN; /*!< RXEVEN : type used for word access */ + __IO _PMU_RXEVEN_bits RXEVEN_bit; /*!< RXEVEN_bit: structure used for bit access */ + }; + union { /*!< ADC Power Control */ + __IO uint32_t ADCPC; /*!< ADCPC : type used for word access */ + __IO _PMU_ADCPC_bits ADCPC_bit; /*!< ADCPC_bit: structure used for bit access */ + }; +} PMU_TypeDef; + + +/******************************************************************************/ +/* WDT registers */ +/******************************************************************************/ + +/*-- LOAD: Watchdog Load Register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Begin value counter */ +} _WDT_LOAD_bits; + +/* Bit field positions: */ +#define WDT_LOAD_VAL_Pos 0 /*!< Begin value counter */ + +/* Bit field masks: */ +#define WDT_LOAD_VAL_Msk 0xFFFFFFFFUL /*!< Begin value counter */ + +/*-- VALUE: Watchdog Value Register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Current value counter */ +} _WDT_VALUE_bits; + +/* Bit field positions: */ +#define WDT_VALUE_VAL_Pos 0 /*!< Current value counter */ + +/* Bit field masks: */ +#define WDT_VALUE_VAL_Msk 0xFFFFFFFFUL /*!< Current value counter */ + +/*-- CTRL: Watchdog Control Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t INTEN :1; /*!< Enable the interrupt event */ + uint32_t RESEN :1; /*!< Enable watchdog reset output */ +} _WDT_CTRL_bits; + +/* Bit field positions: */ +#define WDT_CTRL_INTEN_Pos 0 /*!< Enable the interrupt event */ +#define WDT_CTRL_RESEN_Pos 1 /*!< Enable watchdog reset output */ + +/* Bit field masks: */ +#define WDT_CTRL_INTEN_Msk 0x00000001UL /*!< Enable the interrupt event */ +#define WDT_CTRL_RESEN_Msk 0x00000002UL /*!< Enable watchdog reset output */ + +/*-- INTCLR: Watchdog Clear Interrupt Register ---------------------------------------------------------------*/ +typedef struct { + uint32_t WDTCLR :32; /*!< Reset interrupt WDT */ +} _WDT_INTCLR_bits; + +/* Bit field positions: */ +#define WDT_INTCLR_WDTCLR_Pos 0 /*!< Reset interrupt WDT */ + +/* Bit field masks: */ +#define WDT_INTCLR_WDTCLR_Msk 0xFFFFFFFFUL /*!< Reset interrupt WDT */ + +/*-- RIS: Watchdog Raw Interrupt Status Register -------------------------------------------------------------*/ +typedef struct { + uint32_t RAWWDTINT :1; /*!< Raw interrupt status from the counter */ +} _WDT_RIS_bits; + +/* Bit field positions: */ +#define WDT_RIS_RAWWDTINT_Pos 0 /*!< Raw interrupt status from the counter */ + +/* Bit field masks: */ +#define WDT_RIS_RAWWDTINT_Msk 0x00000001UL /*!< Raw interrupt status from the counter */ + +/*-- MIS: Watchdog Interrupt Status Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t WDTINT :1; /*!< Enabled interrupt status from the counter */ +} _WDT_MIS_bits; + +/* Bit field positions: */ +#define WDT_MIS_WDTINT_Pos 0 /*!< Enabled interrupt status from the counter */ + +/* Bit field masks: */ +#define WDT_MIS_WDTINT_Msk 0x00000001UL /*!< Enabled interrupt status from the counter */ + +/*-- LOCK: Watchdog Lock Register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t REGWRDIS :1; /*!< Disable write to all registers Watchdog */ +} _WDT_LOCK_bits; + +/* Bit field positions: */ +#define WDT_LOCK_REGWRDIS_Pos 0 /*!< Disable write to all registers Watchdog */ + +/* Bit field masks: */ +#define WDT_LOCK_REGWRDIS_Msk 0x00000001UL /*!< Disable write to all registers Watchdog */ + +typedef struct { + union { /*!< Watchdog Load Register */ + __IO uint32_t LOAD; /*!< LOAD : type used for word access */ + __IO _WDT_LOAD_bits LOAD_bit; /*!< LOAD_bit: structure used for bit access */ + }; + union { /*!< Watchdog Value Register */ + __I uint32_t VALUE; /*!< VALUE : type used for word access */ + __I _WDT_VALUE_bits VALUE_bit; /*!< VALUE_bit: structure used for bit access */ + }; + union { /*!< Watchdog Control Register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _WDT_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; + union { /*!< Watchdog Clear Interrupt Register */ + __O uint32_t INTCLR; /*!< INTCLR : type used for word access */ + __O _WDT_INTCLR_bits INTCLR_bit; /*!< INTCLR_bit: structure used for bit access */ + }; + union { /*!< Watchdog Raw Interrupt Status Register */ + __I uint32_t RIS; /*!< RIS : type used for word access */ + __I _WDT_RIS_bits RIS_bit; /*!< RIS_bit: structure used for bit access */ + }; + union { /*!< Watchdog Interrupt Status Register */ + __I uint32_t MIS; /*!< MIS : type used for word access */ + __I _WDT_MIS_bits MIS_bit; /*!< MIS_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[762]; + union { /*!< Watchdog Lock Register */ + __O uint32_t LOCK; /*!< LOCK : type used for word access */ + __O _WDT_LOCK_bits LOCK_bit; /*!< LOCK_bit: structure used for bit access */ + }; +} WDT_TypeDef; + + +/******************************************************************************/ +/* TMR registers */ +/******************************************************************************/ + +/*-- CTRL: Control Timer register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t ON :1; /*!< Enable Timer */ + uint32_t EXTINEN :1; /*!< Enable external input as ENABLE */ + uint32_t EXTINCLK :1; /*!< Enable external input as CLK */ + uint32_t INTEN :1; /*!< Enable Timer interrupt */ +} _TMR_CTRL_bits; + +/* Bit field positions: */ +#define TMR_CTRL_ON_Pos 0 /*!< Enable Timer */ +#define TMR_CTRL_EXTINEN_Pos 1 /*!< Enable external input as ENABLE */ +#define TMR_CTRL_EXTINCLK_Pos 2 /*!< Enable external input as CLK */ +#define TMR_CTRL_INTEN_Pos 3 /*!< Enable Timer interrupt */ + +/* Bit field masks: */ +#define TMR_CTRL_ON_Msk 0x00000001UL /*!< Enable Timer */ +#define TMR_CTRL_EXTINEN_Msk 0x00000002UL /*!< Enable external input as ENABLE */ +#define TMR_CTRL_EXTINCLK_Msk 0x00000004UL /*!< Enable external input as CLK */ +#define TMR_CTRL_INTEN_Msk 0x00000008UL /*!< Enable Timer interrupt */ + +/*-- VALUE: Current value timer register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Current value timer */ +} _TMR_VALUE_bits; + +/* Bit field positions: */ +#define TMR_VALUE_VAL_Pos 0 /*!< Current value timer */ + +/* Bit field masks: */ +#define TMR_VALUE_VAL_Msk 0xFFFFFFFFUL /*!< Current value timer */ + +/*-- LOAD: Reload value timer register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Reload value. A write to this register sets the current value */ +} _TMR_LOAD_bits; + +/* Bit field positions: */ +#define TMR_LOAD_VAL_Pos 0 /*!< Reload value. A write to this register sets the current value */ + +/* Bit field masks: */ +#define TMR_LOAD_VAL_Msk 0xFFFFFFFFUL /*!< Reload value. A write to this register sets the current value */ + +/*-- INTSTATUS: Interrupt status register --------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Timer interrupt flag */ +} _TMR_INTSTATUS_bits; + +/* Bit field positions: */ +#define TMR_INTSTATUS_INT_Pos 0 /*!< Timer interrupt flag */ + +/* Bit field masks: */ +#define TMR_INTSTATUS_INT_Msk 0x00000001UL /*!< Timer interrupt flag */ + +/*-- DMAREQ: DMA request register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< */ +} _TMR_DMAREQ_bits; + +/* Bit field positions: */ +#define TMR_DMAREQ_EN_Pos 0 /*!< */ + +/* Bit field masks: */ +#define TMR_DMAREQ_EN_Msk 0x00000001UL /*!< */ + +/*-- ADCSOC: ADC start of conversion register ----------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< */ +} _TMR_ADCSOC_bits; + +/* Bit field positions: */ +#define TMR_ADCSOC_EN_Pos 0 /*!< */ + +/* Bit field masks: */ +#define TMR_ADCSOC_EN_Msk 0x00000001UL /*!< */ + +typedef struct { + union { /*!< Control Timer register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _TMR_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; + union { /*!< Current value timer register */ + __IO uint32_t VALUE; /*!< VALUE : type used for word access */ + __IO _TMR_VALUE_bits VALUE_bit; /*!< VALUE_bit: structure used for bit access */ + }; + union { /*!< Reload value timer register */ + __IO uint32_t LOAD; /*!< LOAD : type used for word access */ + __IO _TMR_LOAD_bits LOAD_bit; /*!< LOAD_bit: structure used for bit access */ + }; + union { /*!< Interrupt status register */ + __IO uint32_t INTSTATUS; /*!< INTSTATUS : type used for word access */ + __IO _TMR_INTSTATUS_bits INTSTATUS_bit; /*!< INTSTATUS_bit: structure used for bit access */ + }; + union { /*!< DMA request register */ + __IO uint32_t DMAREQ; /*!< DMAREQ : type used for word access */ + __IO _TMR_DMAREQ_bits DMAREQ_bit; /*!< DMAREQ_bit: structure used for bit access */ + }; + union { /*!< ADC start of conversion register */ + __IO uint32_t ADCSOC; /*!< ADCSOC : type used for word access */ + __IO _TMR_ADCSOC_bits ADCSOC_bit; /*!< ADCSOC_bit: structure used for bit access */ + }; +} TMR_TypeDef; + + +/******************************************************************************/ +/* ETMR registers */ +/******************************************************************************/ + +/*-- LOAD: Load register -------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Load register */ +} _ETMR_LOAD_bits; + +/* Bit field positions: */ +#define ETMR_LOAD_VAL_Pos 0 /*!< Load register */ + +/* Bit field masks: */ +#define ETMR_LOAD_VAL_Msk 0xFFFFFFFFUL /*!< Load register */ + +/*-- VALUE: Current value timer register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Current value timer */ +} _ETMR_VALUE_bits; + +/* Bit field positions: */ +#define ETMR_VALUE_VAL_Pos 0 /*!< Current value timer */ + +/* Bit field masks: */ +#define ETMR_VALUE_VAL_Msk 0xFFFFFFFFUL /*!< Current value timer */ + +/*-- CTRL: Timer control register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t ONESH :1; /*!< One-shot count */ + uint32_t SIZE32 :1; /*!< Select size if counter: 16 or 32 bit */ + uint32_t PRESC :2; /*!< Precaler select */ + uint32_t :1; /*!< RESERVED */ + uint32_t INTEN :1; /*!< Interrupt enable */ + uint32_t PERMODE :1; /*!< Select timer mode: free-run or periodic */ + uint32_t ON :1; /*!< Enable timer */ +} _ETMR_CTRL_bits; + +/* Bit field positions: */ +#define ETMR_CTRL_ONESH_Pos 0 /*!< One-shot count */ +#define ETMR_CTRL_SIZE32_Pos 1 /*!< Select size if counter: 16 or 32 bit */ +#define ETMR_CTRL_PRESC_Pos 2 /*!< Precaler select */ +#define ETMR_CTRL_INTEN_Pos 5 /*!< Interrupt enable */ +#define ETMR_CTRL_PERMODE_Pos 6 /*!< Select timer mode: free-run or periodic */ +#define ETMR_CTRL_ON_Pos 7 /*!< Enable timer */ + +/* Bit field masks: */ +#define ETMR_CTRL_ONESH_Msk 0x00000001UL /*!< One-shot count */ +#define ETMR_CTRL_SIZE32_Msk 0x00000002UL /*!< Select size if counter: 16 or 32 bit */ +#define ETMR_CTRL_PRESC_Msk 0x0000000CUL /*!< Precaler select */ +#define ETMR_CTRL_INTEN_Msk 0x00000020UL /*!< Interrupt enable */ +#define ETMR_CTRL_PERMODE_Msk 0x00000040UL /*!< Select timer mode: free-run or periodic */ +#define ETMR_CTRL_ON_Msk 0x00000080UL /*!< Enable timer */ + +/*-- INTCLR: Interrupt clear register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t INTCLR :1; /*!< Clear timer interrupt */ +} _ETMR_INTCLR_bits; + +/* Bit field positions: */ +#define ETMR_INTCLR_INTCLR_Pos 0 /*!< Clear timer interrupt */ + +/* Bit field masks: */ +#define ETMR_INTCLR_INTCLR_Msk 0x00000001UL /*!< Clear timer interrupt */ + +/*-- RIS: Raw interrupt status register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t RINT :1; /*!< Raw interrupt status flag */ +} _ETMR_RIS_bits; + +/* Bit field positions: */ +#define ETMR_RIS_RINT_Pos 0 /*!< Raw interrupt status flag */ + +/* Bit field masks: */ +#define ETMR_RIS_RINT_Msk 0x00000001UL /*!< Raw interrupt status flag */ + +/*-- MIS: Interrupt status register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Timer interrupt flag */ +} _ETMR_MIS_bits; + +/* Bit field positions: */ +#define ETMR_MIS_INT_Pos 0 /*!< Timer interrupt flag */ + +/* Bit field masks: */ +#define ETMR_MIS_INT_Msk 0x00000001UL /*!< Timer interrupt flag */ + +/*-- BGLOAD: Background load register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Background load register */ +} _ETMR_BGLOAD_bits; + +/* Bit field positions: */ +#define ETMR_BGLOAD_VAL_Pos 0 /*!< Background load register */ + +/* Bit field masks: */ +#define ETMR_BGLOAD_VAL_Msk 0xFFFFFFFFUL /*!< Background load register */ + +/*-- DMAREQ: DMA request register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< */ +} _ETMR_DMAREQ_bits; + +/* Bit field positions: */ +#define ETMR_DMAREQ_EN_Pos 0 /*!< */ + +/* Bit field masks: */ +#define ETMR_DMAREQ_EN_Msk 0x00000001UL /*!< */ + +typedef struct { + union { /*!< Load register */ + __IO uint32_t LOAD; /*!< LOAD : type used for word access */ + __IO _ETMR_LOAD_bits LOAD_bit; /*!< LOAD_bit: structure used for bit access */ + }; + union { /*!< Current value timer register */ + __I uint32_t VALUE; /*!< VALUE : type used for word access */ + __I _ETMR_VALUE_bits VALUE_bit; /*!< VALUE_bit: structure used for bit access */ + }; + union { /*!< Timer control register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _ETMR_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; + union { /*!< Interrupt clear register */ + __O uint32_t INTCLR; /*!< INTCLR : type used for word access */ + __O _ETMR_INTCLR_bits INTCLR_bit; /*!< INTCLR_bit: structure used for bit access */ + }; + union { /*!< Raw interrupt status register */ + __I uint32_t RIS; /*!< RIS : type used for word access */ + __I _ETMR_RIS_bits RIS_bit; /*!< RIS_bit: structure used for bit access */ + }; + union { /*!< Interrupt status register */ + __I uint32_t MIS; /*!< MIS : type used for word access */ + __I _ETMR_MIS_bits MIS_bit; /*!< MIS_bit: structure used for bit access */ + }; + union { /*!< Background load register */ + __IO uint32_t BGLOAD; /*!< BGLOAD : type used for word access */ + __IO _ETMR_BGLOAD_bits BGLOAD_bit; /*!< BGLOAD_bit: structure used for bit access */ + }; + union { /*!< DMA request register */ + __IO uint32_t DMAREQ; /*!< DMAREQ : type used for word access */ + __IO _ETMR_DMAREQ_bits DMAREQ_bit; /*!< DMAREQ_bit: structure used for bit access */ + }; +} ETMR_TypeDef; + + +/******************************************************************************/ +/* TMU registers */ +/******************************************************************************/ + +/*-- XIN: X input register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< X input value */ +} _TMU_XIN_bits; + +/* Bit field positions: */ +#define TMU_XIN_VAL_Pos 0 /*!< X input value */ + +/* Bit field masks: */ +#define TMU_XIN_VAL_Msk 0xFFFFFFFFUL /*!< X input value */ + +/*-- YIN: Y input register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Y input value */ +} _TMU_YIN_bits; + +/* Bit field positions: */ +#define TMU_YIN_VAL_Pos 0 /*!< Y input value */ + +/* Bit field masks: */ +#define TMU_YIN_VAL_Msk 0xFFFFFFFFUL /*!< Y input value */ + +/*-- PHIN: Phase input register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Phase input value */ +} _TMU_PHIN_bits; + +/* Bit field positions: */ +#define TMU_PHIN_VAL_Pos 0 /*!< Phase input value */ + +/* Bit field masks: */ +#define TMU_PHIN_VAL_Msk 0xFFFFFFFFUL /*!< Phase input value */ + +/*-- CMD: Command register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t START :1; /*!< Start calculations */ + uint32_t :3; /*!< RESERVED */ + uint32_t FUNC :4; /*!< Select function to compute */ + uint32_t ARGT :5; /*!< Input and output argument type: 0-Q28, 1-Q27, . . ., 20-Q8, 31-FP */ + uint32_t :3; /*!< RESERVED */ + uint32_t WAITRD :1; /*!< Wait calculation complete when any output register read */ + uint32_t DONEIRQ :1; /*!< Generate interrupt when calculation done */ + uint32_t EXCIRQ :1; /*!< Generate interrupt when any exception happend */ + uint32_t DMAREQ :1; /*!< Generate DMA request when calculation done */ +} _TMU_CMD_bits; + +/* Bit field positions: */ +#define TMU_CMD_START_Pos 0 /*!< Start calculations */ +#define TMU_CMD_FUNC_Pos 4 /*!< Select function to compute */ +#define TMU_CMD_ARGT_Pos 8 /*!< Input and output argument type: 0-Q28, 1-Q27, . . ., 20-Q8, 31-FP */ +#define TMU_CMD_WAITRD_Pos 16 /*!< Wait calculation complete when any output register read */ +#define TMU_CMD_DONEIRQ_Pos 17 /*!< Generate interrupt when calculation done */ +#define TMU_CMD_EXCIRQ_Pos 18 /*!< Generate interrupt when any exception happend */ +#define TMU_CMD_DMAREQ_Pos 19 /*!< Generate DMA request when calculation done */ + +/* Bit field masks: */ +#define TMU_CMD_START_Msk 0x00000001UL /*!< Start calculations */ +#define TMU_CMD_FUNC_Msk 0x000000F0UL /*!< Select function to compute */ +#define TMU_CMD_ARGT_Msk 0x00001F00UL /*!< Input and output argument type: 0-Q28, 1-Q27, . . ., 20-Q8, 31-FP */ +#define TMU_CMD_WAITRD_Msk 0x00010000UL /*!< Wait calculation complete when any output register read */ +#define TMU_CMD_DONEIRQ_Msk 0x00020000UL /*!< Generate interrupt when calculation done */ +#define TMU_CMD_EXCIRQ_Msk 0x00040000UL /*!< Generate interrupt when any exception happend */ +#define TMU_CMD_DMAREQ_Msk 0x00080000UL /*!< Generate DMA request when calculation done */ + +/* Bit field enums: */ +typedef enum { + TMU_CMD_FUNC_SinCos = 0x0UL, /*!< sine and cosine functions */ + TMU_CMD_FUNC_Rect2Pol = 0x1UL, /*!< rectangular to polar coordinates */ + TMU_CMD_FUNC_Pol2Rect = 0x2UL, /*!< polar to rectangular coordinates */ + TMU_CMD_FUNC_Rot = 0x3UL, /*!< Vector rotation */ +} TMU_CMD_FUNC_Enum; + +/*-- XOUT: X output register ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< X output value */ +} _TMU_XOUT_bits; + +/* Bit field positions: */ +#define TMU_XOUT_VAL_Pos 0 /*!< X output value */ + +/* Bit field masks: */ +#define TMU_XOUT_VAL_Msk 0xFFFFFFFFUL /*!< X output value */ + +/*-- YOUT: Y output register ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Y output value */ +} _TMU_YOUT_bits; + +/* Bit field positions: */ +#define TMU_YOUT_VAL_Pos 0 /*!< Y output value */ + +/* Bit field masks: */ +#define TMU_YOUT_VAL_Msk 0xFFFFFFFFUL /*!< Y output value */ + +/*-- PHOUT: Phase output register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Phase output value */ +} _TMU_PHOUT_bits; + +/* Bit field positions: */ +#define TMU_PHOUT_VAL_Pos 0 /*!< Phase output value */ + +/* Bit field masks: */ +#define TMU_PHOUT_VAL_Msk 0xFFFFFFFFUL /*!< Phase output value */ + +/*-- STAT: Status register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DONE :1; /*!< Calculation done status */ + uint32_t :3; /*!< RESERVED */ + uint32_t XNAN :1; /*!< XIN value is NaN exception status */ + uint32_t XINF :1; /*!< XIN value is INF exception status */ + uint32_t XUNF :1; /*!< XIN value is few than min alowed number exception status */ + uint32_t XOVF :1; /*!< XIN value is bigger than max alowed number exception status */ + uint32_t YNAN :1; /*!< YIN value is NaN exception status */ + uint32_t YINF :1; /*!< YIN value is INF exception status */ + uint32_t YUNF :1; /*!< YIN value is few than min alowed number exception status */ + uint32_t YOVF :1; /*!< YIN value is bigger than max alowed number exception status */ + uint32_t PHNAN :1; /*!< PHIN value is NaN exception status */ + uint32_t PHINF :1; /*!< PHIN value is INF exception status */ + uint32_t PHUNF :1; /*!< PHIN value is few than min alowed number exception status */ + uint32_t PHOVF :1; /*!< PHIN value is bigger than max alowed number exception status */ +} _TMU_STAT_bits; + +/* Bit field positions: */ +#define TMU_STAT_DONE_Pos 0 /*!< Calculation done status */ +#define TMU_STAT_XNAN_Pos 4 /*!< XIN value is NaN exception status */ +#define TMU_STAT_XINF_Pos 5 /*!< XIN value is INF exception status */ +#define TMU_STAT_XUNF_Pos 6 /*!< XIN value is few than min alowed number exception status */ +#define TMU_STAT_XOVF_Pos 7 /*!< XIN value is bigger than max alowed number exception status */ +#define TMU_STAT_YNAN_Pos 8 /*!< YIN value is NaN exception status */ +#define TMU_STAT_YINF_Pos 9 /*!< YIN value is INF exception status */ +#define TMU_STAT_YUNF_Pos 10 /*!< YIN value is few than min alowed number exception status */ +#define TMU_STAT_YOVF_Pos 11 /*!< YIN value is bigger than max alowed number exception status */ +#define TMU_STAT_PHNAN_Pos 12 /*!< PHIN value is NaN exception status */ +#define TMU_STAT_PHINF_Pos 13 /*!< PHIN value is INF exception status */ +#define TMU_STAT_PHUNF_Pos 14 /*!< PHIN value is few than min alowed number exception status */ +#define TMU_STAT_PHOVF_Pos 15 /*!< PHIN value is bigger than max alowed number exception status */ + +/* Bit field masks: */ +#define TMU_STAT_DONE_Msk 0x00000001UL /*!< Calculation done status */ +#define TMU_STAT_XNAN_Msk 0x00000010UL /*!< XIN value is NaN exception status */ +#define TMU_STAT_XINF_Msk 0x00000020UL /*!< XIN value is INF exception status */ +#define TMU_STAT_XUNF_Msk 0x00000040UL /*!< XIN value is few than min alowed number exception status */ +#define TMU_STAT_XOVF_Msk 0x00000080UL /*!< XIN value is bigger than max alowed number exception status */ +#define TMU_STAT_YNAN_Msk 0x00000100UL /*!< YIN value is NaN exception status */ +#define TMU_STAT_YINF_Msk 0x00000200UL /*!< YIN value is INF exception status */ +#define TMU_STAT_YUNF_Msk 0x00000400UL /*!< YIN value is few than min alowed number exception status */ +#define TMU_STAT_YOVF_Msk 0x00000800UL /*!< YIN value is bigger than max alowed number exception status */ +#define TMU_STAT_PHNAN_Msk 0x00001000UL /*!< PHIN value is NaN exception status */ +#define TMU_STAT_PHINF_Msk 0x00002000UL /*!< PHIN value is INF exception status */ +#define TMU_STAT_PHUNF_Msk 0x00004000UL /*!< PHIN value is few than min alowed number exception status */ +#define TMU_STAT_PHOVF_Msk 0x00008000UL /*!< PHIN value is bigger than max alowed number exception status */ + +typedef struct { + union { /*!< X input register */ + __IO uint32_t XIN; /*!< XIN : type used for word access */ + __IO _TMU_XIN_bits XIN_bit; /*!< XIN_bit: structure used for bit access */ + }; + union { /*!< Y input register */ + __IO uint32_t YIN; /*!< YIN : type used for word access */ + __IO _TMU_YIN_bits YIN_bit; /*!< YIN_bit: structure used for bit access */ + }; + union { /*!< Phase input register */ + __IO uint32_t PHIN; /*!< PHIN : type used for word access */ + __IO _TMU_PHIN_bits PHIN_bit; /*!< PHIN_bit: structure used for bit access */ + }; + union { /*!< Command register */ + __IO uint32_t CMD; /*!< CMD : type used for word access */ + __IO _TMU_CMD_bits CMD_bit; /*!< CMD_bit: structure used for bit access */ + }; + union { /*!< X output register */ + __IO uint32_t XOUT; /*!< XOUT : type used for word access */ + __IO _TMU_XOUT_bits XOUT_bit; /*!< XOUT_bit: structure used for bit access */ + }; + union { /*!< Y output register */ + __IO uint32_t YOUT; /*!< YOUT : type used for word access */ + __IO _TMU_YOUT_bits YOUT_bit; /*!< YOUT_bit: structure used for bit access */ + }; + union { /*!< Phase output register */ + __IO uint32_t PHOUT; /*!< PHOUT : type used for word access */ + __IO _TMU_PHOUT_bits PHOUT_bit; /*!< PHOUT_bit: structure used for bit access */ + }; + union { /*!< Status register */ + __IO uint32_t STAT; /*!< STAT : type used for word access */ + __IO _TMU_STAT_bits STAT_bit; /*!< STAT_bit: structure used for bit access */ + }; +} TMU_TypeDef; + + +/******************************************************************************/ +/* ADC registers */ +/******************************************************************************/ + +/*-- SEQEN: Enable sequencer register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t SEQEN0 :1; /*!< Enable sequencer 0 */ + uint32_t SEQEN1 :1; /*!< Enable sequencer 1 */ + uint32_t SEQEN2 :1; /*!< Enable sequencer 2 */ + uint32_t SEQEN3 :1; /*!< Enable sequencer 3 */ + uint32_t SEQEN4 :1; /*!< Enable sequencer 4 */ + uint32_t SEQEN5 :1; /*!< Enable sequencer 5 */ + uint32_t SEQEN6 :1; /*!< Enable sequencer 6 */ + uint32_t SEQEN7 :1; /*!< Enable sequencer 7 */ +} _ADC_SEQEN_bits; + +/* Bit field positions: */ +#define ADC_SEQEN_SEQEN0_Pos 0 /*!< Enable sequencer 0 */ +#define ADC_SEQEN_SEQEN1_Pos 1 /*!< Enable sequencer 1 */ +#define ADC_SEQEN_SEQEN2_Pos 2 /*!< Enable sequencer 2 */ +#define ADC_SEQEN_SEQEN3_Pos 3 /*!< Enable sequencer 3 */ +#define ADC_SEQEN_SEQEN4_Pos 4 /*!< Enable sequencer 4 */ +#define ADC_SEQEN_SEQEN5_Pos 5 /*!< Enable sequencer 5 */ +#define ADC_SEQEN_SEQEN6_Pos 6 /*!< Enable sequencer 6 */ +#define ADC_SEQEN_SEQEN7_Pos 7 /*!< Enable sequencer 7 */ + +/* Bit field masks: */ +#define ADC_SEQEN_SEQEN0_Msk 0x00000001UL /*!< Enable sequencer 0 */ +#define ADC_SEQEN_SEQEN1_Msk 0x00000002UL /*!< Enable sequencer 1 */ +#define ADC_SEQEN_SEQEN2_Msk 0x00000004UL /*!< Enable sequencer 2 */ +#define ADC_SEQEN_SEQEN3_Msk 0x00000008UL /*!< Enable sequencer 3 */ +#define ADC_SEQEN_SEQEN4_Msk 0x00000010UL /*!< Enable sequencer 4 */ +#define ADC_SEQEN_SEQEN5_Msk 0x00000020UL /*!< Enable sequencer 5 */ +#define ADC_SEQEN_SEQEN6_Msk 0x00000040UL /*!< Enable sequencer 6 */ +#define ADC_SEQEN_SEQEN7_Msk 0x00000080UL /*!< Enable sequencer 7 */ + +/*-- SEQSYNC: Sequencer sync register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t SYNC0 :1; /*!< Enable sequencer 0 software sync */ + uint32_t SYNC1 :1; /*!< Enable sequencer 1 software sync */ + uint32_t SYNC2 :1; /*!< Enable sequencer 2 software sync */ + uint32_t SYNC3 :1; /*!< Enable sequencer 3 software sync */ + uint32_t SYNC4 :1; /*!< Enable sequencer 4 software sync */ + uint32_t SYNC5 :1; /*!< Enable sequencer 5 software sync */ + uint32_t SYNC6 :1; /*!< Enable sequencer 6 software sync */ + uint32_t SYNC7 :1; /*!< Enable sequencer 7 software sync */ + uint32_t :23; /*!< RESERVED */ + uint32_t GSYNC :1; /*!< Sync all sequencers */ +} _ADC_SEQSYNC_bits; + +/* Bit field positions: */ +#define ADC_SEQSYNC_SYNC0_Pos 0 /*!< Enable sequencer 0 software sync */ +#define ADC_SEQSYNC_SYNC1_Pos 1 /*!< Enable sequencer 1 software sync */ +#define ADC_SEQSYNC_SYNC2_Pos 2 /*!< Enable sequencer 2 software sync */ +#define ADC_SEQSYNC_SYNC3_Pos 3 /*!< Enable sequencer 3 software sync */ +#define ADC_SEQSYNC_SYNC4_Pos 4 /*!< Enable sequencer 4 software sync */ +#define ADC_SEQSYNC_SYNC5_Pos 5 /*!< Enable sequencer 5 software sync */ +#define ADC_SEQSYNC_SYNC6_Pos 6 /*!< Enable sequencer 6 software sync */ +#define ADC_SEQSYNC_SYNC7_Pos 7 /*!< Enable sequencer 7 software sync */ +#define ADC_SEQSYNC_GSYNC_Pos 31 /*!< Sync all sequencers */ + +/* Bit field masks: */ +#define ADC_SEQSYNC_SYNC0_Msk 0x00000001UL /*!< Enable sequencer 0 software sync */ +#define ADC_SEQSYNC_SYNC1_Msk 0x00000002UL /*!< Enable sequencer 1 software sync */ +#define ADC_SEQSYNC_SYNC2_Msk 0x00000004UL /*!< Enable sequencer 2 software sync */ +#define ADC_SEQSYNC_SYNC3_Msk 0x00000008UL /*!< Enable sequencer 3 software sync */ +#define ADC_SEQSYNC_SYNC4_Msk 0x00000010UL /*!< Enable sequencer 4 software sync */ +#define ADC_SEQSYNC_SYNC5_Msk 0x00000020UL /*!< Enable sequencer 5 software sync */ +#define ADC_SEQSYNC_SYNC6_Msk 0x00000040UL /*!< Enable sequencer 6 software sync */ +#define ADC_SEQSYNC_SYNC7_Msk 0x00000080UL /*!< Enable sequencer 7 software sync */ +#define ADC_SEQSYNC_GSYNC_Msk 0x80000000UL /*!< Sync all sequencers */ + +/*-- FSTAT: FIFO overflow status register --------------------------------------------------------------------*/ +typedef struct { + uint32_t OV0 :1; /*!< Sequencer 0 FIFO overflow */ + uint32_t OV1 :1; /*!< Sequencer 1 FIFO overflow */ + uint32_t OV2 :1; /*!< Sequencer 2 FIFO overflow */ + uint32_t OV3 :1; /*!< Sequencer 3 FIFO overflow */ + uint32_t OV4 :1; /*!< Sequencer 4 FIFO overflow */ + uint32_t OV5 :1; /*!< Sequencer 5 FIFO overflow */ + uint32_t OV6 :1; /*!< Sequencer 6 FIFO overflow */ + uint32_t OV7 :1; /*!< Sequencer 7 FIFO overflow */ + uint32_t UN0 :1; /*!< Sequencer 0 FIFO underflow */ + uint32_t UN1 :1; /*!< Sequencer 1 FIFO underflow */ + uint32_t UN2 :1; /*!< Sequencer 2 FIFO underflow */ + uint32_t UN3 :1; /*!< Sequencer 3 FIFO underflow */ + uint32_t UN4 :1; /*!< Sequencer 4 FIFO underflow */ + uint32_t UN5 :1; /*!< Sequencer 5 FIFO underflow */ + uint32_t UN6 :1; /*!< Sequencer 6 FIFO underflow */ + uint32_t UN7 :1; /*!< Sequencer 7 FIFO underflow */ + uint32_t DOV0 :1; /*!< Sequencer 0 FIFO DMA request overflow */ + uint32_t DOV1 :1; /*!< Sequencer 1 FIFO DMA request overflow */ + uint32_t DOV2 :1; /*!< Sequencer 2 FIFO DMA request overflow */ + uint32_t DOV3 :1; /*!< Sequencer 3 FIFO DMA request overflow */ + uint32_t DOV4 :1; /*!< Sequencer 4 FIFO DMA request overflow */ + uint32_t DOV5 :1; /*!< Sequencer 5 FIFO DMA request overflow */ + uint32_t DOV6 :1; /*!< Sequencer 6 FIFO DMA request overflow */ + uint32_t DOV7 :1; /*!< Sequencer 7 FIFO DMA request overflow */ +} _ADC_FSTAT_bits; + +/* Bit field positions: */ +#define ADC_FSTAT_OV0_Pos 0 /*!< Sequencer 0 FIFO overflow */ +#define ADC_FSTAT_OV1_Pos 1 /*!< Sequencer 1 FIFO overflow */ +#define ADC_FSTAT_OV2_Pos 2 /*!< Sequencer 2 FIFO overflow */ +#define ADC_FSTAT_OV3_Pos 3 /*!< Sequencer 3 FIFO overflow */ +#define ADC_FSTAT_OV4_Pos 4 /*!< Sequencer 4 FIFO overflow */ +#define ADC_FSTAT_OV5_Pos 5 /*!< Sequencer 5 FIFO overflow */ +#define ADC_FSTAT_OV6_Pos 6 /*!< Sequencer 6 FIFO overflow */ +#define ADC_FSTAT_OV7_Pos 7 /*!< Sequencer 7 FIFO overflow */ +#define ADC_FSTAT_UN0_Pos 8 /*!< Sequencer 0 FIFO underflow */ +#define ADC_FSTAT_UN1_Pos 9 /*!< Sequencer 1 FIFO underflow */ +#define ADC_FSTAT_UN2_Pos 10 /*!< Sequencer 2 FIFO underflow */ +#define ADC_FSTAT_UN3_Pos 11 /*!< Sequencer 3 FIFO underflow */ +#define ADC_FSTAT_UN4_Pos 12 /*!< Sequencer 4 FIFO underflow */ +#define ADC_FSTAT_UN5_Pos 13 /*!< Sequencer 5 FIFO underflow */ +#define ADC_FSTAT_UN6_Pos 14 /*!< Sequencer 6 FIFO underflow */ +#define ADC_FSTAT_UN7_Pos 15 /*!< Sequencer 7 FIFO underflow */ +#define ADC_FSTAT_DOV0_Pos 16 /*!< Sequencer 0 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV1_Pos 17 /*!< Sequencer 1 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV2_Pos 18 /*!< Sequencer 2 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV3_Pos 19 /*!< Sequencer 3 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV4_Pos 20 /*!< Sequencer 4 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV5_Pos 21 /*!< Sequencer 5 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV6_Pos 22 /*!< Sequencer 6 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV7_Pos 23 /*!< Sequencer 7 FIFO DMA request overflow */ + +/* Bit field masks: */ +#define ADC_FSTAT_OV0_Msk 0x00000001UL /*!< Sequencer 0 FIFO overflow */ +#define ADC_FSTAT_OV1_Msk 0x00000002UL /*!< Sequencer 1 FIFO overflow */ +#define ADC_FSTAT_OV2_Msk 0x00000004UL /*!< Sequencer 2 FIFO overflow */ +#define ADC_FSTAT_OV3_Msk 0x00000008UL /*!< Sequencer 3 FIFO overflow */ +#define ADC_FSTAT_OV4_Msk 0x00000010UL /*!< Sequencer 4 FIFO overflow */ +#define ADC_FSTAT_OV5_Msk 0x00000020UL /*!< Sequencer 5 FIFO overflow */ +#define ADC_FSTAT_OV6_Msk 0x00000040UL /*!< Sequencer 6 FIFO overflow */ +#define ADC_FSTAT_OV7_Msk 0x00000080UL /*!< Sequencer 7 FIFO overflow */ +#define ADC_FSTAT_UN0_Msk 0x00000100UL /*!< Sequencer 0 FIFO underflow */ +#define ADC_FSTAT_UN1_Msk 0x00000200UL /*!< Sequencer 1 FIFO underflow */ +#define ADC_FSTAT_UN2_Msk 0x00000400UL /*!< Sequencer 2 FIFO underflow */ +#define ADC_FSTAT_UN3_Msk 0x00000800UL /*!< Sequencer 3 FIFO underflow */ +#define ADC_FSTAT_UN4_Msk 0x00001000UL /*!< Sequencer 4 FIFO underflow */ +#define ADC_FSTAT_UN5_Msk 0x00002000UL /*!< Sequencer 5 FIFO underflow */ +#define ADC_FSTAT_UN6_Msk 0x00004000UL /*!< Sequencer 6 FIFO underflow */ +#define ADC_FSTAT_UN7_Msk 0x00008000UL /*!< Sequencer 7 FIFO underflow */ +#define ADC_FSTAT_DOV0_Msk 0x00010000UL /*!< Sequencer 0 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV1_Msk 0x00020000UL /*!< Sequencer 1 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV2_Msk 0x00040000UL /*!< Sequencer 2 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV3_Msk 0x00080000UL /*!< Sequencer 3 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV4_Msk 0x00100000UL /*!< Sequencer 4 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV5_Msk 0x00200000UL /*!< Sequencer 5 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV6_Msk 0x00400000UL /*!< Sequencer 6 FIFO DMA request overflow */ +#define ADC_FSTAT_DOV7_Msk 0x00800000UL /*!< Sequencer 7 FIFO DMA request overflow */ + +/*-- BSTAT: Busy status register -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t SEQBUSY0 :1; /*!< Sequencer 0 busy */ + uint32_t SEQBUSY1 :1; /*!< Sequencer 1 busy */ + uint32_t SEQBUSY2 :1; /*!< Sequencer 2 busy */ + uint32_t SEQBUSY3 :1; /*!< Sequencer 3 busy */ + uint32_t SEQBUSY4 :1; /*!< Sequencer 4 busy */ + uint32_t SEQBUSY5 :1; /*!< Sequencer 5 busy */ + uint32_t SEQBUSY6 :1; /*!< Sequencer 6 busy */ + uint32_t SEQBUSY7 :1; /*!< Sequencer 7 busy */ + uint32_t :8; /*!< RESERVED */ + uint32_t ADCBUSY0 :1; /*!< ADC module 0 conversion busy */ + uint32_t ADCBUSY1 :1; /*!< ADC module 1 conversion busy */ + uint32_t ADCBUSY2 :1; /*!< ADC module 2 conversion busy */ + uint32_t ADCBUSY3 :1; /*!< ADC module 3 conversion busy */ +} _ADC_BSTAT_bits; + +/* Bit field positions: */ +#define ADC_BSTAT_SEQBUSY0_Pos 0 /*!< Sequencer 0 busy */ +#define ADC_BSTAT_SEQBUSY1_Pos 1 /*!< Sequencer 1 busy */ +#define ADC_BSTAT_SEQBUSY2_Pos 2 /*!< Sequencer 2 busy */ +#define ADC_BSTAT_SEQBUSY3_Pos 3 /*!< Sequencer 3 busy */ +#define ADC_BSTAT_SEQBUSY4_Pos 4 /*!< Sequencer 4 busy */ +#define ADC_BSTAT_SEQBUSY5_Pos 5 /*!< Sequencer 5 busy */ +#define ADC_BSTAT_SEQBUSY6_Pos 6 /*!< Sequencer 6 busy */ +#define ADC_BSTAT_SEQBUSY7_Pos 7 /*!< Sequencer 7 busy */ +#define ADC_BSTAT_ADCBUSY0_Pos 16 /*!< ADC module 0 conversion busy */ +#define ADC_BSTAT_ADCBUSY1_Pos 17 /*!< ADC module 1 conversion busy */ +#define ADC_BSTAT_ADCBUSY2_Pos 18 /*!< ADC module 2 conversion busy */ +#define ADC_BSTAT_ADCBUSY3_Pos 19 /*!< ADC module 3 conversion busy */ + +/* Bit field masks: */ +#define ADC_BSTAT_SEQBUSY0_Msk 0x00000001UL /*!< Sequencer 0 busy */ +#define ADC_BSTAT_SEQBUSY1_Msk 0x00000002UL /*!< Sequencer 1 busy */ +#define ADC_BSTAT_SEQBUSY2_Msk 0x00000004UL /*!< Sequencer 2 busy */ +#define ADC_BSTAT_SEQBUSY3_Msk 0x00000008UL /*!< Sequencer 3 busy */ +#define ADC_BSTAT_SEQBUSY4_Msk 0x00000010UL /*!< Sequencer 4 busy */ +#define ADC_BSTAT_SEQBUSY5_Msk 0x00000020UL /*!< Sequencer 5 busy */ +#define ADC_BSTAT_SEQBUSY6_Msk 0x00000040UL /*!< Sequencer 6 busy */ +#define ADC_BSTAT_SEQBUSY7_Msk 0x00000080UL /*!< Sequencer 7 busy */ +#define ADC_BSTAT_ADCBUSY0_Msk 0x00010000UL /*!< ADC module 0 conversion busy */ +#define ADC_BSTAT_ADCBUSY1_Msk 0x00020000UL /*!< ADC module 1 conversion busy */ +#define ADC_BSTAT_ADCBUSY2_Msk 0x00040000UL /*!< ADC module 2 conversion busy */ +#define ADC_BSTAT_ADCBUSY3_Msk 0x00080000UL /*!< ADC module 3 conversion busy */ + +/*-- DCTRIG: Digital comparator output trigger status register -----------------------------------------------*/ +typedef struct { + uint32_t TOS0 :1; /*!< DC 0 output trigger status */ + uint32_t TOS1 :1; /*!< DC 1 output trigger status */ + uint32_t TOS2 :1; /*!< DC 2 output trigger status */ + uint32_t TOS3 :1; /*!< DC 3 output trigger status */ + uint32_t TOS4 :1; /*!< DC 4 output trigger status */ + uint32_t TOS5 :1; /*!< DC 5 output trigger status */ + uint32_t TOS6 :1; /*!< DC 6 output trigger status */ + uint32_t TOS7 :1; /*!< DC 7 output trigger status */ + uint32_t TOS8 :1; /*!< DC 8 output trigger status */ + uint32_t TOS9 :1; /*!< DC 9 output trigger status */ + uint32_t TOS10 :1; /*!< DC 10 output trigger status */ + uint32_t TOS11 :1; /*!< DC 11 output trigger status */ + uint32_t TOS12 :1; /*!< DC 12 output trigger status */ + uint32_t TOS13 :1; /*!< DC 13 output trigger status */ + uint32_t TOS14 :1; /*!< DC 14 output trigger status */ + uint32_t TOS15 :1; /*!< DC 15 output trigger status */ + uint32_t TOS16 :1; /*!< DC 16 output trigger status */ + uint32_t TOS17 :1; /*!< DC 17 output trigger status */ + uint32_t TOS18 :1; /*!< DC 18 output trigger status */ + uint32_t TOS19 :1; /*!< DC 19 output trigger status */ + uint32_t TOS20 :1; /*!< DC 20 output trigger status */ + uint32_t TOS21 :1; /*!< DC 21 output trigger status */ + uint32_t TOS22 :1; /*!< DC 22 output trigger status */ + uint32_t TOS23 :1; /*!< DC 23 output trigger status */ +} _ADC_DCTRIG_bits; + +/* Bit field positions: */ +#define ADC_DCTRIG_TOS0_Pos 0 /*!< DC 0 output trigger status */ +#define ADC_DCTRIG_TOS1_Pos 1 /*!< DC 1 output trigger status */ +#define ADC_DCTRIG_TOS2_Pos 2 /*!< DC 2 output trigger status */ +#define ADC_DCTRIG_TOS3_Pos 3 /*!< DC 3 output trigger status */ +#define ADC_DCTRIG_TOS4_Pos 4 /*!< DC 4 output trigger status */ +#define ADC_DCTRIG_TOS5_Pos 5 /*!< DC 5 output trigger status */ +#define ADC_DCTRIG_TOS6_Pos 6 /*!< DC 6 output trigger status */ +#define ADC_DCTRIG_TOS7_Pos 7 /*!< DC 7 output trigger status */ +#define ADC_DCTRIG_TOS8_Pos 8 /*!< DC 8 output trigger status */ +#define ADC_DCTRIG_TOS9_Pos 9 /*!< DC 9 output trigger status */ +#define ADC_DCTRIG_TOS10_Pos 10 /*!< DC 10 output trigger status */ +#define ADC_DCTRIG_TOS11_Pos 11 /*!< DC 11 output trigger status */ +#define ADC_DCTRIG_TOS12_Pos 12 /*!< DC 12 output trigger status */ +#define ADC_DCTRIG_TOS13_Pos 13 /*!< DC 13 output trigger status */ +#define ADC_DCTRIG_TOS14_Pos 14 /*!< DC 14 output trigger status */ +#define ADC_DCTRIG_TOS15_Pos 15 /*!< DC 15 output trigger status */ +#define ADC_DCTRIG_TOS16_Pos 16 /*!< DC 16 output trigger status */ +#define ADC_DCTRIG_TOS17_Pos 17 /*!< DC 17 output trigger status */ +#define ADC_DCTRIG_TOS18_Pos 18 /*!< DC 18 output trigger status */ +#define ADC_DCTRIG_TOS19_Pos 19 /*!< DC 19 output trigger status */ +#define ADC_DCTRIG_TOS20_Pos 20 /*!< DC 20 output trigger status */ +#define ADC_DCTRIG_TOS21_Pos 21 /*!< DC 21 output trigger status */ +#define ADC_DCTRIG_TOS22_Pos 22 /*!< DC 22 output trigger status */ +#define ADC_DCTRIG_TOS23_Pos 23 /*!< DC 23 output trigger status */ + +/* Bit field masks: */ +#define ADC_DCTRIG_TOS0_Msk 0x00000001UL /*!< DC 0 output trigger status */ +#define ADC_DCTRIG_TOS1_Msk 0x00000002UL /*!< DC 1 output trigger status */ +#define ADC_DCTRIG_TOS2_Msk 0x00000004UL /*!< DC 2 output trigger status */ +#define ADC_DCTRIG_TOS3_Msk 0x00000008UL /*!< DC 3 output trigger status */ +#define ADC_DCTRIG_TOS4_Msk 0x00000010UL /*!< DC 4 output trigger status */ +#define ADC_DCTRIG_TOS5_Msk 0x00000020UL /*!< DC 5 output trigger status */ +#define ADC_DCTRIG_TOS6_Msk 0x00000040UL /*!< DC 6 output trigger status */ +#define ADC_DCTRIG_TOS7_Msk 0x00000080UL /*!< DC 7 output trigger status */ +#define ADC_DCTRIG_TOS8_Msk 0x00000100UL /*!< DC 8 output trigger status */ +#define ADC_DCTRIG_TOS9_Msk 0x00000200UL /*!< DC 9 output trigger status */ +#define ADC_DCTRIG_TOS10_Msk 0x00000400UL /*!< DC 10 output trigger status */ +#define ADC_DCTRIG_TOS11_Msk 0x00000800UL /*!< DC 11 output trigger status */ +#define ADC_DCTRIG_TOS12_Msk 0x00001000UL /*!< DC 12 output trigger status */ +#define ADC_DCTRIG_TOS13_Msk 0x00002000UL /*!< DC 13 output trigger status */ +#define ADC_DCTRIG_TOS14_Msk 0x00004000UL /*!< DC 14 output trigger status */ +#define ADC_DCTRIG_TOS15_Msk 0x00008000UL /*!< DC 15 output trigger status */ +#define ADC_DCTRIG_TOS16_Msk 0x00010000UL /*!< DC 16 output trigger status */ +#define ADC_DCTRIG_TOS17_Msk 0x00020000UL /*!< DC 17 output trigger status */ +#define ADC_DCTRIG_TOS18_Msk 0x00040000UL /*!< DC 18 output trigger status */ +#define ADC_DCTRIG_TOS19_Msk 0x00080000UL /*!< DC 19 output trigger status */ +#define ADC_DCTRIG_TOS20_Msk 0x00100000UL /*!< DC 20 output trigger status */ +#define ADC_DCTRIG_TOS21_Msk 0x00200000UL /*!< DC 21 output trigger status */ +#define ADC_DCTRIG_TOS22_Msk 0x00400000UL /*!< DC 22 output trigger status */ +#define ADC_DCTRIG_TOS23_Msk 0x00800000UL /*!< DC 23 output trigger status */ + +/*-- DCEV: Digital comparator compare event status register --------------------------------------------------*/ +typedef struct { + uint32_t DCEV0 :1; /*!< Digital compare event 0 */ + uint32_t DCEV1 :1; /*!< Digital compare event 1 */ + uint32_t DCEV2 :1; /*!< Digital compare event 2 */ + uint32_t DCEV3 :1; /*!< Digital compare event 3 */ + uint32_t DCEV4 :1; /*!< Digital compare event 4 */ + uint32_t DCEV5 :1; /*!< Digital compare event 5 */ + uint32_t DCEV6 :1; /*!< Digital compare event 6 */ + uint32_t DCEV7 :1; /*!< Digital compare event 7 */ + uint32_t DCEV8 :1; /*!< Digital compare event 8 */ + uint32_t DCEV9 :1; /*!< Digital compare event 9 */ + uint32_t DCEV10 :1; /*!< Digital compare event 10 */ + uint32_t DCEV11 :1; /*!< Digital compare event 11 */ + uint32_t DCEV12 :1; /*!< Digital compare event 12 */ + uint32_t DCEV13 :1; /*!< Digital compare event 13 */ + uint32_t DCEV14 :1; /*!< Digital compare event 14 */ + uint32_t DCEV15 :1; /*!< Digital compare event 15 */ + uint32_t DCEV16 :1; /*!< Digital compare event 16 */ + uint32_t DCEV17 :1; /*!< Digital compare event 17 */ + uint32_t DCEV18 :1; /*!< Digital compare event 18 */ + uint32_t DCEV19 :1; /*!< Digital compare event 19 */ + uint32_t DCEV20 :1; /*!< Digital compare event 20 */ + uint32_t DCEV21 :1; /*!< Digital compare event 21 */ + uint32_t DCEV22 :1; /*!< Digital compare event 22 */ + uint32_t DCEV23 :1; /*!< Digital compare event 23 */ +} _ADC_DCEV_bits; + +/* Bit field positions: */ +#define ADC_DCEV_DCEV0_Pos 0 /*!< Digital compare event 0 */ +#define ADC_DCEV_DCEV1_Pos 1 /*!< Digital compare event 1 */ +#define ADC_DCEV_DCEV2_Pos 2 /*!< Digital compare event 2 */ +#define ADC_DCEV_DCEV3_Pos 3 /*!< Digital compare event 3 */ +#define ADC_DCEV_DCEV4_Pos 4 /*!< Digital compare event 4 */ +#define ADC_DCEV_DCEV5_Pos 5 /*!< Digital compare event 5 */ +#define ADC_DCEV_DCEV6_Pos 6 /*!< Digital compare event 6 */ +#define ADC_DCEV_DCEV7_Pos 7 /*!< Digital compare event 7 */ +#define ADC_DCEV_DCEV8_Pos 8 /*!< Digital compare event 8 */ +#define ADC_DCEV_DCEV9_Pos 9 /*!< Digital compare event 9 */ +#define ADC_DCEV_DCEV10_Pos 10 /*!< Digital compare event 10 */ +#define ADC_DCEV_DCEV11_Pos 11 /*!< Digital compare event 11 */ +#define ADC_DCEV_DCEV12_Pos 12 /*!< Digital compare event 12 */ +#define ADC_DCEV_DCEV13_Pos 13 /*!< Digital compare event 13 */ +#define ADC_DCEV_DCEV14_Pos 14 /*!< Digital compare event 14 */ +#define ADC_DCEV_DCEV15_Pos 15 /*!< Digital compare event 15 */ +#define ADC_DCEV_DCEV16_Pos 16 /*!< Digital compare event 16 */ +#define ADC_DCEV_DCEV17_Pos 17 /*!< Digital compare event 17 */ +#define ADC_DCEV_DCEV18_Pos 18 /*!< Digital compare event 18 */ +#define ADC_DCEV_DCEV19_Pos 19 /*!< Digital compare event 19 */ +#define ADC_DCEV_DCEV20_Pos 20 /*!< Digital compare event 20 */ +#define ADC_DCEV_DCEV21_Pos 21 /*!< Digital compare event 21 */ +#define ADC_DCEV_DCEV22_Pos 22 /*!< Digital compare event 22 */ +#define ADC_DCEV_DCEV23_Pos 23 /*!< Digital compare event 23 */ + +/* Bit field masks: */ +#define ADC_DCEV_DCEV0_Msk 0x00000001UL /*!< Digital compare event 0 */ +#define ADC_DCEV_DCEV1_Msk 0x00000002UL /*!< Digital compare event 1 */ +#define ADC_DCEV_DCEV2_Msk 0x00000004UL /*!< Digital compare event 2 */ +#define ADC_DCEV_DCEV3_Msk 0x00000008UL /*!< Digital compare event 3 */ +#define ADC_DCEV_DCEV4_Msk 0x00000010UL /*!< Digital compare event 4 */ +#define ADC_DCEV_DCEV5_Msk 0x00000020UL /*!< Digital compare event 5 */ +#define ADC_DCEV_DCEV6_Msk 0x00000040UL /*!< Digital compare event 6 */ +#define ADC_DCEV_DCEV7_Msk 0x00000080UL /*!< Digital compare event 7 */ +#define ADC_DCEV_DCEV8_Msk 0x00000100UL /*!< Digital compare event 8 */ +#define ADC_DCEV_DCEV9_Msk 0x00000200UL /*!< Digital compare event 9 */ +#define ADC_DCEV_DCEV10_Msk 0x00000400UL /*!< Digital compare event 10 */ +#define ADC_DCEV_DCEV11_Msk 0x00000800UL /*!< Digital compare event 11 */ +#define ADC_DCEV_DCEV12_Msk 0x00001000UL /*!< Digital compare event 12 */ +#define ADC_DCEV_DCEV13_Msk 0x00002000UL /*!< Digital compare event 13 */ +#define ADC_DCEV_DCEV14_Msk 0x00004000UL /*!< Digital compare event 14 */ +#define ADC_DCEV_DCEV15_Msk 0x00008000UL /*!< Digital compare event 15 */ +#define ADC_DCEV_DCEV16_Msk 0x00010000UL /*!< Digital compare event 16 */ +#define ADC_DCEV_DCEV17_Msk 0x00020000UL /*!< Digital compare event 17 */ +#define ADC_DCEV_DCEV18_Msk 0x00040000UL /*!< Digital compare event 18 */ +#define ADC_DCEV_DCEV19_Msk 0x00080000UL /*!< Digital compare event 19 */ +#define ADC_DCEV_DCEV20_Msk 0x00100000UL /*!< Digital compare event 20 */ +#define ADC_DCEV_DCEV21_Msk 0x00200000UL /*!< Digital compare event 21 */ +#define ADC_DCEV_DCEV22_Msk 0x00400000UL /*!< Digital compare event 22 */ +#define ADC_DCEV_DCEV23_Msk 0x00800000UL /*!< Digital compare event 23 */ + +/*-- CICNT: Interrupt counter clear control ------------------------------------------------------------------*/ +typedef struct { + uint32_t ICNT0 :1; /*!< Clear interrupt counter on sequencer 0 start */ + uint32_t ICNT1 :1; /*!< Clear interrupt counter on sequencer 1 start */ + uint32_t ICNT2 :1; /*!< Clear interrupt counter on sequencer 2 start */ + uint32_t ICNT3 :1; /*!< Clear interrupt counter on sequencer 3 start */ + uint32_t ICNT4 :1; /*!< Clear interrupt counter on sequencer 4 start */ + uint32_t ICNT5 :1; /*!< Clear interrupt counter on sequencer 5 start */ + uint32_t ICNT6 :1; /*!< Clear interrupt counter on sequencer 6 start */ + uint32_t ICNT7 :1; /*!< Clear interrupt counter on sequencer 7 start */ +} _ADC_CICNT_bits; + +/* Bit field positions: */ +#define ADC_CICNT_ICNT0_Pos 0 /*!< Clear interrupt counter on sequencer 0 start */ +#define ADC_CICNT_ICNT1_Pos 1 /*!< Clear interrupt counter on sequencer 1 start */ +#define ADC_CICNT_ICNT2_Pos 2 /*!< Clear interrupt counter on sequencer 2 start */ +#define ADC_CICNT_ICNT3_Pos 3 /*!< Clear interrupt counter on sequencer 3 start */ +#define ADC_CICNT_ICNT4_Pos 4 /*!< Clear interrupt counter on sequencer 4 start */ +#define ADC_CICNT_ICNT5_Pos 5 /*!< Clear interrupt counter on sequencer 5 start */ +#define ADC_CICNT_ICNT6_Pos 6 /*!< Clear interrupt counter on sequencer 6 start */ +#define ADC_CICNT_ICNT7_Pos 7 /*!< Clear interrupt counter on sequencer 7 start */ + +/* Bit field masks: */ +#define ADC_CICNT_ICNT0_Msk 0x00000001UL /*!< Clear interrupt counter on sequencer 0 start */ +#define ADC_CICNT_ICNT1_Msk 0x00000002UL /*!< Clear interrupt counter on sequencer 1 start */ +#define ADC_CICNT_ICNT2_Msk 0x00000004UL /*!< Clear interrupt counter on sequencer 2 start */ +#define ADC_CICNT_ICNT3_Msk 0x00000008UL /*!< Clear interrupt counter on sequencer 3 start */ +#define ADC_CICNT_ICNT4_Msk 0x00000010UL /*!< Clear interrupt counter on sequencer 4 start */ +#define ADC_CICNT_ICNT5_Msk 0x00000020UL /*!< Clear interrupt counter on sequencer 5 start */ +#define ADC_CICNT_ICNT6_Msk 0x00000040UL /*!< Clear interrupt counter on sequencer 6 start */ +#define ADC_CICNT_ICNT7_Msk 0x00000080UL /*!< Clear interrupt counter on sequencer 7 start */ + +/*-- EMUX: Sequencer start event selection register ----------------------------------------------------------*/ +typedef struct { + uint32_t EM0 :4; /*!< Select start event for sequencer 0 */ + uint32_t EM1 :4; /*!< Select start event for sequencer 1 */ + uint32_t EM2 :4; /*!< Select start event for sequencer 2 */ + uint32_t EM3 :4; /*!< Select start event for sequencer 3 */ + uint32_t EM4 :4; /*!< Select start event for sequencer 4 */ + uint32_t EM5 :4; /*!< Select start event for sequencer 5 */ + uint32_t EM6 :4; /*!< Select start event for sequencer 6 */ + uint32_t EM7 :4; /*!< Select start event for sequencer 7 */ +} _ADC_EMUX_bits; + +/* Bit field positions: */ +#define ADC_EMUX_EM0_Pos 0 /*!< Select start event for sequencer 0 */ +#define ADC_EMUX_EM1_Pos 4 /*!< Select start event for sequencer 1 */ +#define ADC_EMUX_EM2_Pos 8 /*!< Select start event for sequencer 2 */ +#define ADC_EMUX_EM3_Pos 12 /*!< Select start event for sequencer 3 */ +#define ADC_EMUX_EM4_Pos 16 /*!< Select start event for sequencer 4 */ +#define ADC_EMUX_EM5_Pos 20 /*!< Select start event for sequencer 5 */ +#define ADC_EMUX_EM6_Pos 24 /*!< Select start event for sequencer 6 */ +#define ADC_EMUX_EM7_Pos 28 /*!< Select start event for sequencer 7 */ + +/* Bit field masks: */ +#define ADC_EMUX_EM0_Msk 0x0000000FUL /*!< Select start event for sequencer 0 */ +#define ADC_EMUX_EM1_Msk 0x000000F0UL /*!< Select start event for sequencer 1 */ +#define ADC_EMUX_EM2_Msk 0x00000F00UL /*!< Select start event for sequencer 2 */ +#define ADC_EMUX_EM3_Msk 0x0000F000UL /*!< Select start event for sequencer 3 */ +#define ADC_EMUX_EM4_Msk 0x000F0000UL /*!< Select start event for sequencer 4 */ +#define ADC_EMUX_EM5_Msk 0x00F00000UL /*!< Select start event for sequencer 5 */ +#define ADC_EMUX_EM6_Msk 0x0F000000UL /*!< Select start event for sequencer 6 */ +#define ADC_EMUX_EM7_Msk 0xF0000000UL /*!< Select start event for sequencer 7 */ + +/* Bit field enums: */ +typedef enum { + ADC_EMUX_EM0_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM0_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM0_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM0_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM0_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM0_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM0_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM0_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM0_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM0_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM0_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM0_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM0_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM0_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM0_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM0_Enum; + +typedef enum { + ADC_EMUX_EM1_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM1_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM1_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM1_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM1_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM1_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM1_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM1_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM1_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM1_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM1_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM1_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM1_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM1_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM1_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM1_Enum; + +typedef enum { + ADC_EMUX_EM2_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM2_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM2_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM2_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM2_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM2_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM2_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM2_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM2_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM2_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM2_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM2_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM2_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM2_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM2_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM2_Enum; + +typedef enum { + ADC_EMUX_EM3_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM3_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM3_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM3_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM3_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM3_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM3_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM3_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM3_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM3_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM3_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM3_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM3_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM3_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM3_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM3_Enum; + +typedef enum { + ADC_EMUX_EM4_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM4_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM4_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM4_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM4_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM4_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM4_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM4_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM4_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM4_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM4_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM4_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM4_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM4_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM4_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM4_Enum; + +typedef enum { + ADC_EMUX_EM5_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM5_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM5_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM5_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM5_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM5_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM5_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM5_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM5_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM5_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM5_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM5_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM5_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM5_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM5_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM5_Enum; + +typedef enum { + ADC_EMUX_EM6_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM6_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM6_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM6_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM6_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM6_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM6_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM6_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM6_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM6_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM6_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM6_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM6_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM6_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM6_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM6_Enum; + +typedef enum { + ADC_EMUX_EM7_SwReq = 0x0UL, /*!< software request by GSYNC bit */ + ADC_EMUX_EM7_GPIOABCD = 0x1UL, /*!< GPIOA or GPIOB or GPIOC or GPIOD interrupt */ + ADC_EMUX_EM7_GPIOEFGH = 0x2UL, /*!< GPIOE or GPIOF or GPIOG or GPIOH interrupt */ + ADC_EMUX_EM7_GPIOJKLM = 0x3UL, /*!< GPIOJ or GPIOK or GPIOL or GPIOM interrupt */ + ADC_EMUX_EM7_TMR0 = 0x5UL, /*!< Timer 0 request */ + ADC_EMUX_EM7_TMR1 = 0x6UL, /*!< Timer 1 request */ + ADC_EMUX_EM7_TMR2 = 0x7UL, /*!< Timer 2 request */ + ADC_EMUX_EM7_TMR3 = 0x8UL, /*!< Timer 3 request */ + ADC_EMUX_EM7_PWM012A = 0x9UL, /*!< PWM0,1,2 A channel request */ + ADC_EMUX_EM7_PWM012B = 0xAUL, /*!< PWM0,1,2 B channel request */ + ADC_EMUX_EM7_PWM345A = 0xBUL, /*!< PWM3,4,5 A channel request */ + ADC_EMUX_EM7_PWM345B = 0xCUL, /*!< PWM3,4,5 B channel request */ + ADC_EMUX_EM7_PWM6789A = 0xDUL, /*!< PWM6,7,8,9 A channel request */ + ADC_EMUX_EM7_PWM6789B = 0xEUL, /*!< PWM6,7,8,9 B channel request */ + ADC_EMUX_EM7_Cycle = 0xFUL, /*!< Cycle mode */ +} ADC_EMUX_EM7_Enum; + +/*-- RIS: Raw interrupt status register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t SEQRIS0 :1; /*!< Sequencer 0 raw interrupt status */ + uint32_t SEQRIS1 :1; /*!< Sequencer 1 raw interrupt status */ + uint32_t SEQRIS2 :1; /*!< Sequencer 2 raw interrupt status */ + uint32_t SEQRIS3 :1; /*!< Sequencer 3 raw interrupt status */ + uint32_t SEQRIS4 :1; /*!< Sequencer 4 raw interrupt status */ + uint32_t SEQRIS5 :1; /*!< Sequencer 5 raw interrupt status */ + uint32_t SEQRIS6 :1; /*!< Sequencer 6 raw interrupt status */ + uint32_t SEQRIS7 :1; /*!< Sequencer 7 raw interrupt status */ + uint32_t DCRIS0 :1; /*!< Raw interrupt status of Digital Comparator 0 */ + uint32_t DCRIS1 :1; /*!< Raw interrupt status of Digital Comparator 1 */ + uint32_t DCRIS2 :1; /*!< Raw interrupt status of Digital Comparator 2 */ + uint32_t DCRIS3 :1; /*!< Raw interrupt status of Digital Comparator 3 */ + uint32_t DCRIS4 :1; /*!< Raw interrupt status of Digital Comparator 4 */ + uint32_t DCRIS5 :1; /*!< Raw interrupt status of Digital Comparator 5 */ + uint32_t DCRIS6 :1; /*!< Raw interrupt status of Digital Comparator 6 */ + uint32_t DCRIS7 :1; /*!< Raw interrupt status of Digital Comparator 7 */ + uint32_t DCRIS8 :1; /*!< Raw interrupt status of Digital Comparator 8 */ + uint32_t DCRIS9 :1; /*!< Raw interrupt status of Digital Comparator 9 */ + uint32_t DCRIS10 :1; /*!< Raw interrupt status of Digital Comparator 10 */ + uint32_t DCRIS11 :1; /*!< Raw interrupt status of Digital Comparator 11 */ + uint32_t DCRIS12 :1; /*!< Raw interrupt status of Digital Comparator 12 */ + uint32_t DCRIS13 :1; /*!< Raw interrupt status of Digital Comparator 13 */ + uint32_t DCRIS14 :1; /*!< Raw interrupt status of Digital Comparator 14 */ + uint32_t DCRIS15 :1; /*!< Raw interrupt status of Digital Comparator 15 */ + uint32_t DCRIS16 :1; /*!< Raw interrupt status of Digital Comparator 16 */ + uint32_t DCRIS17 :1; /*!< Raw interrupt status of Digital Comparator 17 */ + uint32_t DCRIS18 :1; /*!< Raw interrupt status of Digital Comparator 18 */ + uint32_t DCRIS19 :1; /*!< Raw interrupt status of Digital Comparator 19 */ + uint32_t DCRIS20 :1; /*!< Raw interrupt status of Digital Comparator 20 */ + uint32_t DCRIS21 :1; /*!< Raw interrupt status of Digital Comparator 21 */ + uint32_t DCRIS22 :1; /*!< Raw interrupt status of Digital Comparator 22 */ + uint32_t DCRIS23 :1; /*!< Raw interrupt status of Digital Comparator 23 */ +} _ADC_RIS_bits; + +/* Bit field positions: */ +#define ADC_RIS_SEQRIS0_Pos 0 /*!< Sequencer 0 raw interrupt status */ +#define ADC_RIS_SEQRIS1_Pos 1 /*!< Sequencer 1 raw interrupt status */ +#define ADC_RIS_SEQRIS2_Pos 2 /*!< Sequencer 2 raw interrupt status */ +#define ADC_RIS_SEQRIS3_Pos 3 /*!< Sequencer 3 raw interrupt status */ +#define ADC_RIS_SEQRIS4_Pos 4 /*!< Sequencer 4 raw interrupt status */ +#define ADC_RIS_SEQRIS5_Pos 5 /*!< Sequencer 5 raw interrupt status */ +#define ADC_RIS_SEQRIS6_Pos 6 /*!< Sequencer 6 raw interrupt status */ +#define ADC_RIS_SEQRIS7_Pos 7 /*!< Sequencer 7 raw interrupt status */ +#define ADC_RIS_DCRIS0_Pos 8 /*!< Raw interrupt status of Digital Comparator 0 */ +#define ADC_RIS_DCRIS1_Pos 9 /*!< Raw interrupt status of Digital Comparator 1 */ +#define ADC_RIS_DCRIS2_Pos 10 /*!< Raw interrupt status of Digital Comparator 2 */ +#define ADC_RIS_DCRIS3_Pos 11 /*!< Raw interrupt status of Digital Comparator 3 */ +#define ADC_RIS_DCRIS4_Pos 12 /*!< Raw interrupt status of Digital Comparator 4 */ +#define ADC_RIS_DCRIS5_Pos 13 /*!< Raw interrupt status of Digital Comparator 5 */ +#define ADC_RIS_DCRIS6_Pos 14 /*!< Raw interrupt status of Digital Comparator 6 */ +#define ADC_RIS_DCRIS7_Pos 15 /*!< Raw interrupt status of Digital Comparator 7 */ +#define ADC_RIS_DCRIS8_Pos 16 /*!< Raw interrupt status of Digital Comparator 8 */ +#define ADC_RIS_DCRIS9_Pos 17 /*!< Raw interrupt status of Digital Comparator 9 */ +#define ADC_RIS_DCRIS10_Pos 18 /*!< Raw interrupt status of Digital Comparator 10 */ +#define ADC_RIS_DCRIS11_Pos 19 /*!< Raw interrupt status of Digital Comparator 11 */ +#define ADC_RIS_DCRIS12_Pos 20 /*!< Raw interrupt status of Digital Comparator 12 */ +#define ADC_RIS_DCRIS13_Pos 21 /*!< Raw interrupt status of Digital Comparator 13 */ +#define ADC_RIS_DCRIS14_Pos 22 /*!< Raw interrupt status of Digital Comparator 14 */ +#define ADC_RIS_DCRIS15_Pos 23 /*!< Raw interrupt status of Digital Comparator 15 */ +#define ADC_RIS_DCRIS16_Pos 24 /*!< Raw interrupt status of Digital Comparator 16 */ +#define ADC_RIS_DCRIS17_Pos 25 /*!< Raw interrupt status of Digital Comparator 17 */ +#define ADC_RIS_DCRIS18_Pos 26 /*!< Raw interrupt status of Digital Comparator 18 */ +#define ADC_RIS_DCRIS19_Pos 27 /*!< Raw interrupt status of Digital Comparator 19 */ +#define ADC_RIS_DCRIS20_Pos 28 /*!< Raw interrupt status of Digital Comparator 20 */ +#define ADC_RIS_DCRIS21_Pos 29 /*!< Raw interrupt status of Digital Comparator 21 */ +#define ADC_RIS_DCRIS22_Pos 30 /*!< Raw interrupt status of Digital Comparator 22 */ +#define ADC_RIS_DCRIS23_Pos 31 /*!< Raw interrupt status of Digital Comparator 23 */ + +/* Bit field masks: */ +#define ADC_RIS_SEQRIS0_Msk 0x00000001UL /*!< Sequencer 0 raw interrupt status */ +#define ADC_RIS_SEQRIS1_Msk 0x00000002UL /*!< Sequencer 1 raw interrupt status */ +#define ADC_RIS_SEQRIS2_Msk 0x00000004UL /*!< Sequencer 2 raw interrupt status */ +#define ADC_RIS_SEQRIS3_Msk 0x00000008UL /*!< Sequencer 3 raw interrupt status */ +#define ADC_RIS_SEQRIS4_Msk 0x00000010UL /*!< Sequencer 4 raw interrupt status */ +#define ADC_RIS_SEQRIS5_Msk 0x00000020UL /*!< Sequencer 5 raw interrupt status */ +#define ADC_RIS_SEQRIS6_Msk 0x00000040UL /*!< Sequencer 6 raw interrupt status */ +#define ADC_RIS_SEQRIS7_Msk 0x00000080UL /*!< Sequencer 7 raw interrupt status */ +#define ADC_RIS_DCRIS0_Msk 0x00000100UL /*!< Raw interrupt status of Digital Comparator 0 */ +#define ADC_RIS_DCRIS1_Msk 0x00000200UL /*!< Raw interrupt status of Digital Comparator 1 */ +#define ADC_RIS_DCRIS2_Msk 0x00000400UL /*!< Raw interrupt status of Digital Comparator 2 */ +#define ADC_RIS_DCRIS3_Msk 0x00000800UL /*!< Raw interrupt status of Digital Comparator 3 */ +#define ADC_RIS_DCRIS4_Msk 0x00001000UL /*!< Raw interrupt status of Digital Comparator 4 */ +#define ADC_RIS_DCRIS5_Msk 0x00002000UL /*!< Raw interrupt status of Digital Comparator 5 */ +#define ADC_RIS_DCRIS6_Msk 0x00004000UL /*!< Raw interrupt status of Digital Comparator 6 */ +#define ADC_RIS_DCRIS7_Msk 0x00008000UL /*!< Raw interrupt status of Digital Comparator 7 */ +#define ADC_RIS_DCRIS8_Msk 0x00010000UL /*!< Raw interrupt status of Digital Comparator 8 */ +#define ADC_RIS_DCRIS9_Msk 0x00020000UL /*!< Raw interrupt status of Digital Comparator 9 */ +#define ADC_RIS_DCRIS10_Msk 0x00040000UL /*!< Raw interrupt status of Digital Comparator 10 */ +#define ADC_RIS_DCRIS11_Msk 0x00080000UL /*!< Raw interrupt status of Digital Comparator 11 */ +#define ADC_RIS_DCRIS12_Msk 0x00100000UL /*!< Raw interrupt status of Digital Comparator 12 */ +#define ADC_RIS_DCRIS13_Msk 0x00200000UL /*!< Raw interrupt status of Digital Comparator 13 */ +#define ADC_RIS_DCRIS14_Msk 0x00400000UL /*!< Raw interrupt status of Digital Comparator 14 */ +#define ADC_RIS_DCRIS15_Msk 0x00800000UL /*!< Raw interrupt status of Digital Comparator 15 */ +#define ADC_RIS_DCRIS16_Msk 0x01000000UL /*!< Raw interrupt status of Digital Comparator 16 */ +#define ADC_RIS_DCRIS17_Msk 0x02000000UL /*!< Raw interrupt status of Digital Comparator 17 */ +#define ADC_RIS_DCRIS18_Msk 0x04000000UL /*!< Raw interrupt status of Digital Comparator 18 */ +#define ADC_RIS_DCRIS19_Msk 0x08000000UL /*!< Raw interrupt status of Digital Comparator 19 */ +#define ADC_RIS_DCRIS20_Msk 0x10000000UL /*!< Raw interrupt status of Digital Comparator 20 */ +#define ADC_RIS_DCRIS21_Msk 0x20000000UL /*!< Raw interrupt status of Digital Comparator 21 */ +#define ADC_RIS_DCRIS22_Msk 0x40000000UL /*!< Raw interrupt status of Digital Comparator 22 */ +#define ADC_RIS_DCRIS23_Msk 0x80000000UL /*!< Raw interrupt status of Digital Comparator 23 */ + +/*-- IM: Interrupt mask register -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t SEQIM0 :1; /*!< Sequencer 0 interrupt mask */ + uint32_t SEQIM1 :1; /*!< Sequencer 1 interrupt mask */ + uint32_t SEQIM2 :1; /*!< Sequencer 2 interrupt mask */ + uint32_t SEQIM3 :1; /*!< Sequencer 3 interrupt mask */ + uint32_t SEQIM4 :1; /*!< Sequencer 4 interrupt mask */ + uint32_t SEQIM5 :1; /*!< Sequencer 5 interrupt mask */ + uint32_t SEQIM6 :1; /*!< Sequencer 6 interrupt mask */ + uint32_t SEQIM7 :1; /*!< Sequencer 7 interrupt mask */ + uint32_t DCIM0 :1; /*!< Interrupt mask of Digital Comparator 0 */ + uint32_t DCIM1 :1; /*!< Interrupt mask of Digital Comparator 1 */ + uint32_t DCIM2 :1; /*!< Interrupt mask of Digital Comparator 2 */ + uint32_t DCIM3 :1; /*!< Interrupt mask of Digital Comparator 3 */ + uint32_t DCIM4 :1; /*!< Interrupt mask of Digital Comparator 4 */ + uint32_t DCIM5 :1; /*!< Interrupt mask of Digital Comparator 5 */ + uint32_t DCIM6 :1; /*!< Interrupt mask of Digital Comparator 6 */ + uint32_t DCIM7 :1; /*!< Interrupt mask of Digital Comparator 7 */ + uint32_t DCIM8 :1; /*!< Interrupt mask of Digital Comparator 8 */ + uint32_t DCIM9 :1; /*!< Interrupt mask of Digital Comparator 9 */ + uint32_t DCIM10 :1; /*!< Interrupt mask of Digital Comparator 10 */ + uint32_t DCIM11 :1; /*!< Interrupt mask of Digital Comparator 11 */ + uint32_t DCIM12 :1; /*!< Interrupt mask of Digital Comparator 12 */ + uint32_t DCIM13 :1; /*!< Interrupt mask of Digital Comparator 13 */ + uint32_t DCIM14 :1; /*!< Interrupt mask of Digital Comparator 14 */ + uint32_t DCIM15 :1; /*!< Interrupt mask of Digital Comparator 15 */ + uint32_t DCIM16 :1; /*!< Interrupt mask of Digital Comparator 16 */ + uint32_t DCIM17 :1; /*!< Interrupt mask of Digital Comparator 17 */ + uint32_t DCIM18 :1; /*!< Interrupt mask of Digital Comparator 18 */ + uint32_t DCIM19 :1; /*!< Interrupt mask of Digital Comparator 19 */ + uint32_t DCIM20 :1; /*!< Interrupt mask of Digital Comparator 20 */ + uint32_t DCIM21 :1; /*!< Interrupt mask of Digital Comparator 21 */ + uint32_t DCIM22 :1; /*!< Interrupt mask of Digital Comparator 22 */ + uint32_t DCIM23 :1; /*!< Interrupt mask of Digital Comparator 23 */ +} _ADC_IM_bits; + +/* Bit field positions: */ +#define ADC_IM_SEQIM0_Pos 0 /*!< Sequencer 0 interrupt mask */ +#define ADC_IM_SEQIM1_Pos 1 /*!< Sequencer 1 interrupt mask */ +#define ADC_IM_SEQIM2_Pos 2 /*!< Sequencer 2 interrupt mask */ +#define ADC_IM_SEQIM3_Pos 3 /*!< Sequencer 3 interrupt mask */ +#define ADC_IM_SEQIM4_Pos 4 /*!< Sequencer 4 interrupt mask */ +#define ADC_IM_SEQIM5_Pos 5 /*!< Sequencer 5 interrupt mask */ +#define ADC_IM_SEQIM6_Pos 6 /*!< Sequencer 6 interrupt mask */ +#define ADC_IM_SEQIM7_Pos 7 /*!< Sequencer 7 interrupt mask */ +#define ADC_IM_DCIM0_Pos 8 /*!< Interrupt mask of Digital Comparator 0 */ +#define ADC_IM_DCIM1_Pos 9 /*!< Interrupt mask of Digital Comparator 1 */ +#define ADC_IM_DCIM2_Pos 10 /*!< Interrupt mask of Digital Comparator 2 */ +#define ADC_IM_DCIM3_Pos 11 /*!< Interrupt mask of Digital Comparator 3 */ +#define ADC_IM_DCIM4_Pos 12 /*!< Interrupt mask of Digital Comparator 4 */ +#define ADC_IM_DCIM5_Pos 13 /*!< Interrupt mask of Digital Comparator 5 */ +#define ADC_IM_DCIM6_Pos 14 /*!< Interrupt mask of Digital Comparator 6 */ +#define ADC_IM_DCIM7_Pos 15 /*!< Interrupt mask of Digital Comparator 7 */ +#define ADC_IM_DCIM8_Pos 16 /*!< Interrupt mask of Digital Comparator 8 */ +#define ADC_IM_DCIM9_Pos 17 /*!< Interrupt mask of Digital Comparator 9 */ +#define ADC_IM_DCIM10_Pos 18 /*!< Interrupt mask of Digital Comparator 10 */ +#define ADC_IM_DCIM11_Pos 19 /*!< Interrupt mask of Digital Comparator 11 */ +#define ADC_IM_DCIM12_Pos 20 /*!< Interrupt mask of Digital Comparator 12 */ +#define ADC_IM_DCIM13_Pos 21 /*!< Interrupt mask of Digital Comparator 13 */ +#define ADC_IM_DCIM14_Pos 22 /*!< Interrupt mask of Digital Comparator 14 */ +#define ADC_IM_DCIM15_Pos 23 /*!< Interrupt mask of Digital Comparator 15 */ +#define ADC_IM_DCIM16_Pos 24 /*!< Interrupt mask of Digital Comparator 16 */ +#define ADC_IM_DCIM17_Pos 25 /*!< Interrupt mask of Digital Comparator 17 */ +#define ADC_IM_DCIM18_Pos 26 /*!< Interrupt mask of Digital Comparator 18 */ +#define ADC_IM_DCIM19_Pos 27 /*!< Interrupt mask of Digital Comparator 19 */ +#define ADC_IM_DCIM20_Pos 28 /*!< Interrupt mask of Digital Comparator 20 */ +#define ADC_IM_DCIM21_Pos 29 /*!< Interrupt mask of Digital Comparator 21 */ +#define ADC_IM_DCIM22_Pos 30 /*!< Interrupt mask of Digital Comparator 22 */ +#define ADC_IM_DCIM23_Pos 31 /*!< Interrupt mask of Digital Comparator 23 */ + +/* Bit field masks: */ +#define ADC_IM_SEQIM0_Msk 0x00000001UL /*!< Sequencer 0 interrupt mask */ +#define ADC_IM_SEQIM1_Msk 0x00000002UL /*!< Sequencer 1 interrupt mask */ +#define ADC_IM_SEQIM2_Msk 0x00000004UL /*!< Sequencer 2 interrupt mask */ +#define ADC_IM_SEQIM3_Msk 0x00000008UL /*!< Sequencer 3 interrupt mask */ +#define ADC_IM_SEQIM4_Msk 0x00000010UL /*!< Sequencer 4 interrupt mask */ +#define ADC_IM_SEQIM5_Msk 0x00000020UL /*!< Sequencer 5 interrupt mask */ +#define ADC_IM_SEQIM6_Msk 0x00000040UL /*!< Sequencer 6 interrupt mask */ +#define ADC_IM_SEQIM7_Msk 0x00000080UL /*!< Sequencer 7 interrupt mask */ +#define ADC_IM_DCIM0_Msk 0x00000100UL /*!< Interrupt mask of Digital Comparator 0 */ +#define ADC_IM_DCIM1_Msk 0x00000200UL /*!< Interrupt mask of Digital Comparator 1 */ +#define ADC_IM_DCIM2_Msk 0x00000400UL /*!< Interrupt mask of Digital Comparator 2 */ +#define ADC_IM_DCIM3_Msk 0x00000800UL /*!< Interrupt mask of Digital Comparator 3 */ +#define ADC_IM_DCIM4_Msk 0x00001000UL /*!< Interrupt mask of Digital Comparator 4 */ +#define ADC_IM_DCIM5_Msk 0x00002000UL /*!< Interrupt mask of Digital Comparator 5 */ +#define ADC_IM_DCIM6_Msk 0x00004000UL /*!< Interrupt mask of Digital Comparator 6 */ +#define ADC_IM_DCIM7_Msk 0x00008000UL /*!< Interrupt mask of Digital Comparator 7 */ +#define ADC_IM_DCIM8_Msk 0x00010000UL /*!< Interrupt mask of Digital Comparator 8 */ +#define ADC_IM_DCIM9_Msk 0x00020000UL /*!< Interrupt mask of Digital Comparator 9 */ +#define ADC_IM_DCIM10_Msk 0x00040000UL /*!< Interrupt mask of Digital Comparator 10 */ +#define ADC_IM_DCIM11_Msk 0x00080000UL /*!< Interrupt mask of Digital Comparator 11 */ +#define ADC_IM_DCIM12_Msk 0x00100000UL /*!< Interrupt mask of Digital Comparator 12 */ +#define ADC_IM_DCIM13_Msk 0x00200000UL /*!< Interrupt mask of Digital Comparator 13 */ +#define ADC_IM_DCIM14_Msk 0x00400000UL /*!< Interrupt mask of Digital Comparator 14 */ +#define ADC_IM_DCIM15_Msk 0x00800000UL /*!< Interrupt mask of Digital Comparator 15 */ +#define ADC_IM_DCIM16_Msk 0x01000000UL /*!< Interrupt mask of Digital Comparator 16 */ +#define ADC_IM_DCIM17_Msk 0x02000000UL /*!< Interrupt mask of Digital Comparator 17 */ +#define ADC_IM_DCIM18_Msk 0x04000000UL /*!< Interrupt mask of Digital Comparator 18 */ +#define ADC_IM_DCIM19_Msk 0x08000000UL /*!< Interrupt mask of Digital Comparator 19 */ +#define ADC_IM_DCIM20_Msk 0x10000000UL /*!< Interrupt mask of Digital Comparator 20 */ +#define ADC_IM_DCIM21_Msk 0x20000000UL /*!< Interrupt mask of Digital Comparator 21 */ +#define ADC_IM_DCIM22_Msk 0x40000000UL /*!< Interrupt mask of Digital Comparator 22 */ +#define ADC_IM_DCIM23_Msk 0x80000000UL /*!< Interrupt mask of Digital Comparator 23 */ + +/*-- MIS: Masked interrupt status and clear register ---------------------------------------------------------*/ +typedef struct { + uint32_t SEQMIS0 :1; /*!< Sequencer 0 masked interrupt status */ + uint32_t SEQMIS1 :1; /*!< Sequencer 1 masked interrupt status */ + uint32_t SEQMIS2 :1; /*!< Sequencer 2 masked interrupt status */ + uint32_t SEQMIS3 :1; /*!< Sequencer 3 masked interrupt status */ + uint32_t SEQMIS4 :1; /*!< Sequencer 4 masked interrupt status */ + uint32_t SEQMIS5 :1; /*!< Sequencer 5 masked interrupt status */ + uint32_t SEQMIS6 :1; /*!< Sequencer 6 masked interrupt status */ + uint32_t SEQMIS7 :1; /*!< Sequencer 7 masked interrupt status */ + uint32_t DCMIS0 :1; /*!< DC 0 masked interrupt status */ + uint32_t DCMIS1 :1; /*!< DC 1 masked interrupt status */ + uint32_t DCMIS2 :1; /*!< DC 2 masked interrupt status */ + uint32_t DCMIS3 :1; /*!< DC 3 masked interrupt status */ + uint32_t DCMIS4 :1; /*!< DC 4 masked interrupt status */ + uint32_t DCMIS5 :1; /*!< DC 5 masked interrupt status */ + uint32_t DCMIS6 :1; /*!< DC 6 masked interrupt status */ + uint32_t DCMIS7 :1; /*!< DC 7 masked interrupt status */ + uint32_t DCMIS8 :1; /*!< DC 8 masked interrupt status */ + uint32_t DCMIS9 :1; /*!< DC 9 masked interrupt status */ + uint32_t DCMIS10 :1; /*!< DC 10 masked interrupt status */ + uint32_t DCMIS11 :1; /*!< DC 11 masked interrupt status */ + uint32_t DCMIS12 :1; /*!< DC 12 masked interrupt status */ + uint32_t DCMIS13 :1; /*!< DC 13 masked interrupt status */ + uint32_t DCMIS14 :1; /*!< DC 14 masked interrupt status */ + uint32_t DCMIS15 :1; /*!< DC 15 masked interrupt status */ + uint32_t DCMIS16 :1; /*!< DC 16 masked interrupt status */ + uint32_t DCMIS17 :1; /*!< DC 17 masked interrupt status */ + uint32_t DCMIS18 :1; /*!< DC 18 masked interrupt status */ + uint32_t DCMIS19 :1; /*!< DC 19 masked interrupt status */ + uint32_t DCMIS20 :1; /*!< DC 20 masked interrupt status */ + uint32_t DCMIS21 :1; /*!< DC 21 masked interrupt status */ + uint32_t DCMIS22 :1; /*!< DC 22 masked interrupt status */ + uint32_t DCMIS23 :1; /*!< DC 23 masked interrupt status */ +} _ADC_MIS_bits; + +/* Bit field positions: */ +#define ADC_MIS_SEQMIS0_Pos 0 /*!< Sequencer 0 masked interrupt status */ +#define ADC_MIS_SEQMIS1_Pos 1 /*!< Sequencer 1 masked interrupt status */ +#define ADC_MIS_SEQMIS2_Pos 2 /*!< Sequencer 2 masked interrupt status */ +#define ADC_MIS_SEQMIS3_Pos 3 /*!< Sequencer 3 masked interrupt status */ +#define ADC_MIS_SEQMIS4_Pos 4 /*!< Sequencer 4 masked interrupt status */ +#define ADC_MIS_SEQMIS5_Pos 5 /*!< Sequencer 5 masked interrupt status */ +#define ADC_MIS_SEQMIS6_Pos 6 /*!< Sequencer 6 masked interrupt status */ +#define ADC_MIS_SEQMIS7_Pos 7 /*!< Sequencer 7 masked interrupt status */ +#define ADC_MIS_DCMIS0_Pos 8 /*!< DC 0 masked interrupt status */ +#define ADC_MIS_DCMIS1_Pos 9 /*!< DC 1 masked interrupt status */ +#define ADC_MIS_DCMIS2_Pos 10 /*!< DC 2 masked interrupt status */ +#define ADC_MIS_DCMIS3_Pos 11 /*!< DC 3 masked interrupt status */ +#define ADC_MIS_DCMIS4_Pos 12 /*!< DC 4 masked interrupt status */ +#define ADC_MIS_DCMIS5_Pos 13 /*!< DC 5 masked interrupt status */ +#define ADC_MIS_DCMIS6_Pos 14 /*!< DC 6 masked interrupt status */ +#define ADC_MIS_DCMIS7_Pos 15 /*!< DC 7 masked interrupt status */ +#define ADC_MIS_DCMIS8_Pos 16 /*!< DC 8 masked interrupt status */ +#define ADC_MIS_DCMIS9_Pos 17 /*!< DC 9 masked interrupt status */ +#define ADC_MIS_DCMIS10_Pos 18 /*!< DC 10 masked interrupt status */ +#define ADC_MIS_DCMIS11_Pos 19 /*!< DC 11 masked interrupt status */ +#define ADC_MIS_DCMIS12_Pos 20 /*!< DC 12 masked interrupt status */ +#define ADC_MIS_DCMIS13_Pos 21 /*!< DC 13 masked interrupt status */ +#define ADC_MIS_DCMIS14_Pos 22 /*!< DC 14 masked interrupt status */ +#define ADC_MIS_DCMIS15_Pos 23 /*!< DC 15 masked interrupt status */ +#define ADC_MIS_DCMIS16_Pos 24 /*!< DC 16 masked interrupt status */ +#define ADC_MIS_DCMIS17_Pos 25 /*!< DC 17 masked interrupt status */ +#define ADC_MIS_DCMIS18_Pos 26 /*!< DC 18 masked interrupt status */ +#define ADC_MIS_DCMIS19_Pos 27 /*!< DC 19 masked interrupt status */ +#define ADC_MIS_DCMIS20_Pos 28 /*!< DC 20 masked interrupt status */ +#define ADC_MIS_DCMIS21_Pos 29 /*!< DC 21 masked interrupt status */ +#define ADC_MIS_DCMIS22_Pos 30 /*!< DC 22 masked interrupt status */ +#define ADC_MIS_DCMIS23_Pos 31 /*!< DC 23 masked interrupt status */ + +/* Bit field masks: */ +#define ADC_MIS_SEQMIS0_Msk 0x00000001UL /*!< Sequencer 0 masked interrupt status */ +#define ADC_MIS_SEQMIS1_Msk 0x00000002UL /*!< Sequencer 1 masked interrupt status */ +#define ADC_MIS_SEQMIS2_Msk 0x00000004UL /*!< Sequencer 2 masked interrupt status */ +#define ADC_MIS_SEQMIS3_Msk 0x00000008UL /*!< Sequencer 3 masked interrupt status */ +#define ADC_MIS_SEQMIS4_Msk 0x00000010UL /*!< Sequencer 4 masked interrupt status */ +#define ADC_MIS_SEQMIS5_Msk 0x00000020UL /*!< Sequencer 5 masked interrupt status */ +#define ADC_MIS_SEQMIS6_Msk 0x00000040UL /*!< Sequencer 6 masked interrupt status */ +#define ADC_MIS_SEQMIS7_Msk 0x00000080UL /*!< Sequencer 7 masked interrupt status */ +#define ADC_MIS_DCMIS0_Msk 0x00000100UL /*!< DC 0 masked interrupt status */ +#define ADC_MIS_DCMIS1_Msk 0x00000200UL /*!< DC 1 masked interrupt status */ +#define ADC_MIS_DCMIS2_Msk 0x00000400UL /*!< DC 2 masked interrupt status */ +#define ADC_MIS_DCMIS3_Msk 0x00000800UL /*!< DC 3 masked interrupt status */ +#define ADC_MIS_DCMIS4_Msk 0x00001000UL /*!< DC 4 masked interrupt status */ +#define ADC_MIS_DCMIS5_Msk 0x00002000UL /*!< DC 5 masked interrupt status */ +#define ADC_MIS_DCMIS6_Msk 0x00004000UL /*!< DC 6 masked interrupt status */ +#define ADC_MIS_DCMIS7_Msk 0x00008000UL /*!< DC 7 masked interrupt status */ +#define ADC_MIS_DCMIS8_Msk 0x00010000UL /*!< DC 8 masked interrupt status */ +#define ADC_MIS_DCMIS9_Msk 0x00020000UL /*!< DC 9 masked interrupt status */ +#define ADC_MIS_DCMIS10_Msk 0x00040000UL /*!< DC 10 masked interrupt status */ +#define ADC_MIS_DCMIS11_Msk 0x00080000UL /*!< DC 11 masked interrupt status */ +#define ADC_MIS_DCMIS12_Msk 0x00100000UL /*!< DC 12 masked interrupt status */ +#define ADC_MIS_DCMIS13_Msk 0x00200000UL /*!< DC 13 masked interrupt status */ +#define ADC_MIS_DCMIS14_Msk 0x00400000UL /*!< DC 14 masked interrupt status */ +#define ADC_MIS_DCMIS15_Msk 0x00800000UL /*!< DC 15 masked interrupt status */ +#define ADC_MIS_DCMIS16_Msk 0x01000000UL /*!< DC 16 masked interrupt status */ +#define ADC_MIS_DCMIS17_Msk 0x02000000UL /*!< DC 17 masked interrupt status */ +#define ADC_MIS_DCMIS18_Msk 0x04000000UL /*!< DC 18 masked interrupt status */ +#define ADC_MIS_DCMIS19_Msk 0x08000000UL /*!< DC 19 masked interrupt status */ +#define ADC_MIS_DCMIS20_Msk 0x10000000UL /*!< DC 20 masked interrupt status */ +#define ADC_MIS_DCMIS21_Msk 0x20000000UL /*!< DC 21 masked interrupt status */ +#define ADC_MIS_DCMIS22_Msk 0x40000000UL /*!< DC 22 masked interrupt status */ +#define ADC_MIS_DCMIS23_Msk 0x80000000UL /*!< DC 23 masked interrupt status */ + +/*-- IC: Interrupt clear register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t SEQIC0 :1; /*!< Sequencer 0 interrupt status clear */ + uint32_t SEQIC1 :1; /*!< Sequencer 1 interrupt status clear */ + uint32_t SEQIC2 :1; /*!< Sequencer 2 interrupt status clear */ + uint32_t SEQIC3 :1; /*!< Sequencer 3 interrupt status clear */ + uint32_t SEQIC4 :1; /*!< Sequencer 4 interrupt status clear */ + uint32_t SEQIC5 :1; /*!< Sequencer 5 interrupt status clear */ + uint32_t SEQIC6 :1; /*!< Sequencer 6 interrupt status clear */ + uint32_t SEQIC7 :1; /*!< Sequencer 7 interrupt status clear */ + uint32_t DCIC0 :1; /*!< DC 0 interrupt status clear */ + uint32_t DCIC1 :1; /*!< DC 1 interrupt status clear */ + uint32_t DCIC2 :1; /*!< DC 2 interrupt status clear */ + uint32_t DCIC3 :1; /*!< DC 3 interrupt status clear */ + uint32_t DCIC4 :1; /*!< DC 4 interrupt status clear */ + uint32_t DCIC5 :1; /*!< DC 5 interrupt status clear */ + uint32_t DCIC6 :1; /*!< DC 6 interrupt status clear */ + uint32_t DCIC7 :1; /*!< DC 7 interrupt status clear */ + uint32_t DCIC8 :1; /*!< DC 8 interrupt status clear */ + uint32_t DCIC9 :1; /*!< DC 9 interrupt status clear */ + uint32_t DCIC10 :1; /*!< DC 10 interrupt status clear */ + uint32_t DCIC11 :1; /*!< DC 11 interrupt status clear */ + uint32_t DCIC12 :1; /*!< DC 12 interrupt status clear */ + uint32_t DCIC13 :1; /*!< DC 13 interrupt status clear */ + uint32_t DCIC14 :1; /*!< DC 14 interrupt status clear */ + uint32_t DCIC15 :1; /*!< DC 15 interrupt status clear */ + uint32_t DCIC16 :1; /*!< DC 16 interrupt status clear */ + uint32_t DCIC17 :1; /*!< DC 17 interrupt status clear */ + uint32_t DCIC18 :1; /*!< DC 18 interrupt status clear */ + uint32_t DCIC19 :1; /*!< DC 19 interrupt status clear */ + uint32_t DCIC20 :1; /*!< DC 20 interrupt status clear */ + uint32_t DCIC21 :1; /*!< DC 21 interrupt status clear */ + uint32_t DCIC22 :1; /*!< DC 22 interrupt status clear */ + uint32_t DCIC23 :1; /*!< DC 23 interrupt status clear */ +} _ADC_IC_bits; + +/* Bit field positions: */ +#define ADC_IC_SEQIC0_Pos 0 /*!< Sequencer 0 interrupt status clear */ +#define ADC_IC_SEQIC1_Pos 1 /*!< Sequencer 1 interrupt status clear */ +#define ADC_IC_SEQIC2_Pos 2 /*!< Sequencer 2 interrupt status clear */ +#define ADC_IC_SEQIC3_Pos 3 /*!< Sequencer 3 interrupt status clear */ +#define ADC_IC_SEQIC4_Pos 4 /*!< Sequencer 4 interrupt status clear */ +#define ADC_IC_SEQIC5_Pos 5 /*!< Sequencer 5 interrupt status clear */ +#define ADC_IC_SEQIC6_Pos 6 /*!< Sequencer 6 interrupt status clear */ +#define ADC_IC_SEQIC7_Pos 7 /*!< Sequencer 7 interrupt status clear */ +#define ADC_IC_DCIC0_Pos 8 /*!< DC 0 interrupt status clear */ +#define ADC_IC_DCIC1_Pos 9 /*!< DC 1 interrupt status clear */ +#define ADC_IC_DCIC2_Pos 10 /*!< DC 2 interrupt status clear */ +#define ADC_IC_DCIC3_Pos 11 /*!< DC 3 interrupt status clear */ +#define ADC_IC_DCIC4_Pos 12 /*!< DC 4 interrupt status clear */ +#define ADC_IC_DCIC5_Pos 13 /*!< DC 5 interrupt status clear */ +#define ADC_IC_DCIC6_Pos 14 /*!< DC 6 interrupt status clear */ +#define ADC_IC_DCIC7_Pos 15 /*!< DC 7 interrupt status clear */ +#define ADC_IC_DCIC8_Pos 16 /*!< DC 8 interrupt status clear */ +#define ADC_IC_DCIC9_Pos 17 /*!< DC 9 interrupt status clear */ +#define ADC_IC_DCIC10_Pos 18 /*!< DC 10 interrupt status clear */ +#define ADC_IC_DCIC11_Pos 19 /*!< DC 11 interrupt status clear */ +#define ADC_IC_DCIC12_Pos 20 /*!< DC 12 interrupt status clear */ +#define ADC_IC_DCIC13_Pos 21 /*!< DC 13 interrupt status clear */ +#define ADC_IC_DCIC14_Pos 22 /*!< DC 14 interrupt status clear */ +#define ADC_IC_DCIC15_Pos 23 /*!< DC 15 interrupt status clear */ +#define ADC_IC_DCIC16_Pos 24 /*!< DC 16 interrupt status clear */ +#define ADC_IC_DCIC17_Pos 25 /*!< DC 17 interrupt status clear */ +#define ADC_IC_DCIC18_Pos 26 /*!< DC 18 interrupt status clear */ +#define ADC_IC_DCIC19_Pos 27 /*!< DC 19 interrupt status clear */ +#define ADC_IC_DCIC20_Pos 28 /*!< DC 20 interrupt status clear */ +#define ADC_IC_DCIC21_Pos 29 /*!< DC 21 interrupt status clear */ +#define ADC_IC_DCIC22_Pos 30 /*!< DC 22 interrupt status clear */ +#define ADC_IC_DCIC23_Pos 31 /*!< DC 23 interrupt status clear */ + +/* Bit field masks: */ +#define ADC_IC_SEQIC0_Msk 0x00000001UL /*!< Sequencer 0 interrupt status clear */ +#define ADC_IC_SEQIC1_Msk 0x00000002UL /*!< Sequencer 1 interrupt status clear */ +#define ADC_IC_SEQIC2_Msk 0x00000004UL /*!< Sequencer 2 interrupt status clear */ +#define ADC_IC_SEQIC3_Msk 0x00000008UL /*!< Sequencer 3 interrupt status clear */ +#define ADC_IC_SEQIC4_Msk 0x00000010UL /*!< Sequencer 4 interrupt status clear */ +#define ADC_IC_SEQIC5_Msk 0x00000020UL /*!< Sequencer 5 interrupt status clear */ +#define ADC_IC_SEQIC6_Msk 0x00000040UL /*!< Sequencer 6 interrupt status clear */ +#define ADC_IC_SEQIC7_Msk 0x00000080UL /*!< Sequencer 7 interrupt status clear */ +#define ADC_IC_DCIC0_Msk 0x00000100UL /*!< DC 0 interrupt status clear */ +#define ADC_IC_DCIC1_Msk 0x00000200UL /*!< DC 1 interrupt status clear */ +#define ADC_IC_DCIC2_Msk 0x00000400UL /*!< DC 2 interrupt status clear */ +#define ADC_IC_DCIC3_Msk 0x00000800UL /*!< DC 3 interrupt status clear */ +#define ADC_IC_DCIC4_Msk 0x00001000UL /*!< DC 4 interrupt status clear */ +#define ADC_IC_DCIC5_Msk 0x00002000UL /*!< DC 5 interrupt status clear */ +#define ADC_IC_DCIC6_Msk 0x00004000UL /*!< DC 6 interrupt status clear */ +#define ADC_IC_DCIC7_Msk 0x00008000UL /*!< DC 7 interrupt status clear */ +#define ADC_IC_DCIC8_Msk 0x00010000UL /*!< DC 8 interrupt status clear */ +#define ADC_IC_DCIC9_Msk 0x00020000UL /*!< DC 9 interrupt status clear */ +#define ADC_IC_DCIC10_Msk 0x00040000UL /*!< DC 10 interrupt status clear */ +#define ADC_IC_DCIC11_Msk 0x00080000UL /*!< DC 11 interrupt status clear */ +#define ADC_IC_DCIC12_Msk 0x00100000UL /*!< DC 12 interrupt status clear */ +#define ADC_IC_DCIC13_Msk 0x00200000UL /*!< DC 13 interrupt status clear */ +#define ADC_IC_DCIC14_Msk 0x00400000UL /*!< DC 14 interrupt status clear */ +#define ADC_IC_DCIC15_Msk 0x00800000UL /*!< DC 15 interrupt status clear */ +#define ADC_IC_DCIC16_Msk 0x01000000UL /*!< DC 16 interrupt status clear */ +#define ADC_IC_DCIC17_Msk 0x02000000UL /*!< DC 17 interrupt status clear */ +#define ADC_IC_DCIC18_Msk 0x04000000UL /*!< DC 18 interrupt status clear */ +#define ADC_IC_DCIC19_Msk 0x08000000UL /*!< DC 19 interrupt status clear */ +#define ADC_IC_DCIC20_Msk 0x10000000UL /*!< DC 20 interrupt status clear */ +#define ADC_IC_DCIC21_Msk 0x20000000UL /*!< DC 21 interrupt status clear */ +#define ADC_IC_DCIC22_Msk 0x40000000UL /*!< DC 22 interrupt status clear */ +#define ADC_IC_DCIC23_Msk 0x80000000UL /*!< DC 23 interrupt status clear */ + +/*-- SEQ: SRQSEL0: Sequencer request ADC channels selection register 0 ----------------------------------------*/ +typedef struct { + uint32_t RQ0 :6; /*!< Select ADC channel for request 0 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ1 :6; /*!< Select ADC channel for request 1 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ2 :6; /*!< Select ADC channel for request 2 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ3 :6; /*!< Select ADC channel for request 3 */ +} _ADC_SEQ_SRQSEL0_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSEL0_RQ0_Pos 0 /*!< Select ADC channel for request 0 */ +#define ADC_SEQ_SRQSEL0_RQ1_Pos 8 /*!< Select ADC channel for request 1 */ +#define ADC_SEQ_SRQSEL0_RQ2_Pos 16 /*!< Select ADC channel for request 2 */ +#define ADC_SEQ_SRQSEL0_RQ3_Pos 24 /*!< Select ADC channel for request 3 */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSEL0_RQ0_Msk 0x0000003FUL /*!< Select ADC channel for request 0 */ +#define ADC_SEQ_SRQSEL0_RQ1_Msk 0x00003F00UL /*!< Select ADC channel for request 1 */ +#define ADC_SEQ_SRQSEL0_RQ2_Msk 0x003F0000UL /*!< Select ADC channel for request 2 */ +#define ADC_SEQ_SRQSEL0_RQ3_Msk 0x3F000000UL /*!< Select ADC channel for request 3 */ + +/*-- SEQ: SRQSEL1: Sequencer request ADC channels selection register 1 ----------------------------------------*/ +typedef struct { + uint32_t RQ4 :6; /*!< Select ADC channel for request 4 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ5 :6; /*!< Select ADC channel for request 5 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ6 :6; /*!< Select ADC channel for request 6 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ7 :6; /*!< Select ADC channel for request 7 */ +} _ADC_SEQ_SRQSEL1_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSEL1_RQ4_Pos 0 /*!< Select ADC channel for request 4 */ +#define ADC_SEQ_SRQSEL1_RQ5_Pos 8 /*!< Select ADC channel for request 5 */ +#define ADC_SEQ_SRQSEL1_RQ6_Pos 16 /*!< Select ADC channel for request 6 */ +#define ADC_SEQ_SRQSEL1_RQ7_Pos 24 /*!< Select ADC channel for request 7 */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSEL1_RQ4_Msk 0x0000003FUL /*!< Select ADC channel for request 4 */ +#define ADC_SEQ_SRQSEL1_RQ5_Msk 0x00003F00UL /*!< Select ADC channel for request 5 */ +#define ADC_SEQ_SRQSEL1_RQ6_Msk 0x003F0000UL /*!< Select ADC channel for request 6 */ +#define ADC_SEQ_SRQSEL1_RQ7_Msk 0x3F000000UL /*!< Select ADC channel for request 7 */ + +/*-- SEQ: SRQSEL2: Sequencer request ADC channels selection register 2 ----------------------------------------*/ +typedef struct { + uint32_t RQ8 :6; /*!< Select ADC channel for request 8 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ9 :6; /*!< Select ADC channel for request 9 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ10 :6; /*!< Select ADC channel for request 10 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ11 :6; /*!< Select ADC channel for request 11 */ +} _ADC_SEQ_SRQSEL2_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSEL2_RQ8_Pos 0 /*!< Select ADC channel for request 8 */ +#define ADC_SEQ_SRQSEL2_RQ9_Pos 8 /*!< Select ADC channel for request 9 */ +#define ADC_SEQ_SRQSEL2_RQ10_Pos 16 /*!< Select ADC channel for request 10 */ +#define ADC_SEQ_SRQSEL2_RQ11_Pos 24 /*!< Select ADC channel for request 11 */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSEL2_RQ8_Msk 0x0000003FUL /*!< Select ADC channel for request 8 */ +#define ADC_SEQ_SRQSEL2_RQ9_Msk 0x00003F00UL /*!< Select ADC channel for request 9 */ +#define ADC_SEQ_SRQSEL2_RQ10_Msk 0x003F0000UL /*!< Select ADC channel for request 10 */ +#define ADC_SEQ_SRQSEL2_RQ11_Msk 0x3F000000UL /*!< Select ADC channel for request 11 */ + +/*-- SEQ: SRQSEL3: Sequencer request ADC channels selection register 3 ----------------------------------------*/ +typedef struct { + uint32_t RQ12 :6; /*!< Select ADC channel for request 12 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ13 :6; /*!< Select ADC channel for request 13 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ14 :6; /*!< Select ADC channel for request 14 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ15 :6; /*!< Select ADC channel for request 15 */ +} _ADC_SEQ_SRQSEL3_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSEL3_RQ12_Pos 0 /*!< Select ADC channel for request 12 */ +#define ADC_SEQ_SRQSEL3_RQ13_Pos 8 /*!< Select ADC channel for request 13 */ +#define ADC_SEQ_SRQSEL3_RQ14_Pos 16 /*!< Select ADC channel for request 14 */ +#define ADC_SEQ_SRQSEL3_RQ15_Pos 24 /*!< Select ADC channel for request 15 */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSEL3_RQ12_Msk 0x0000003FUL /*!< Select ADC channel for request 12 */ +#define ADC_SEQ_SRQSEL3_RQ13_Msk 0x00003F00UL /*!< Select ADC channel for request 13 */ +#define ADC_SEQ_SRQSEL3_RQ14_Msk 0x003F0000UL /*!< Select ADC channel for request 14 */ +#define ADC_SEQ_SRQSEL3_RQ15_Msk 0x3F000000UL /*!< Select ADC channel for request 15 */ + +/*-- SEQ: SRQSEL4: Sequencer request ADC channels selection register 4 ----------------------------------------*/ +typedef struct { + uint32_t RQ16 :6; /*!< Select ADC channel for request 16 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ17 :6; /*!< Select ADC channel for request 17 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ18 :6; /*!< Select ADC channel for request 18 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ19 :6; /*!< Select ADC channel for request 19 */ +} _ADC_SEQ_SRQSEL4_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSEL4_RQ16_Pos 0 /*!< Select ADC channel for request 16 */ +#define ADC_SEQ_SRQSEL4_RQ17_Pos 8 /*!< Select ADC channel for request 17 */ +#define ADC_SEQ_SRQSEL4_RQ18_Pos 16 /*!< Select ADC channel for request 18 */ +#define ADC_SEQ_SRQSEL4_RQ19_Pos 24 /*!< Select ADC channel for request 19 */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSEL4_RQ16_Msk 0x0000003FUL /*!< Select ADC channel for request 16 */ +#define ADC_SEQ_SRQSEL4_RQ17_Msk 0x00003F00UL /*!< Select ADC channel for request 17 */ +#define ADC_SEQ_SRQSEL4_RQ18_Msk 0x003F0000UL /*!< Select ADC channel for request 18 */ +#define ADC_SEQ_SRQSEL4_RQ19_Msk 0x3F000000UL /*!< Select ADC channel for request 19 */ + +/*-- SEQ: SRQSEL5: Sequencer request ADC channels selection register 5 ----------------------------------------*/ +typedef struct { + uint32_t RQ20 :6; /*!< Select ADC channel for request 20 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ21 :6; /*!< Select ADC channel for request 21 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ22 :6; /*!< Select ADC channel for request 22 */ + uint32_t :2; /*!< RESERVED */ + uint32_t RQ23 :6; /*!< Select ADC channel for request 23 */ +} _ADC_SEQ_SRQSEL5_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSEL5_RQ20_Pos 0 /*!< Select ADC channel for request 20 */ +#define ADC_SEQ_SRQSEL5_RQ21_Pos 8 /*!< Select ADC channel for request 21 */ +#define ADC_SEQ_SRQSEL5_RQ22_Pos 16 /*!< Select ADC channel for request 22 */ +#define ADC_SEQ_SRQSEL5_RQ23_Pos 24 /*!< Select ADC channel for request 23 */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSEL5_RQ20_Msk 0x0000003FUL /*!< Select ADC channel for request 20 */ +#define ADC_SEQ_SRQSEL5_RQ21_Msk 0x00003F00UL /*!< Select ADC channel for request 21 */ +#define ADC_SEQ_SRQSEL5_RQ22_Msk 0x003F0000UL /*!< Select ADC channel for request 22 */ +#define ADC_SEQ_SRQSEL5_RQ23_Msk 0x3F000000UL /*!< Select ADC channel for request 23 */ + +/*-- SEQ: SRQCTL: Sequencer request control register ----------------------------------------------------------*/ +typedef struct { + uint32_t RQMAX :5; /*!< Request queue max depth */ + uint32_t :3; /*!< RESERVED */ + uint32_t QAVGEN :1; /*!< Queue avearage (scanning) enable */ + uint32_t QAVGVAL :3; /*!< Queue average value */ +} _ADC_SEQ_SRQCTL_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQCTL_RQMAX_Pos 0 /*!< Request queue max depth */ +#define ADC_SEQ_SRQCTL_QAVGEN_Pos 8 /*!< Queue avearage (scanning) enable */ +#define ADC_SEQ_SRQCTL_QAVGVAL_Pos 9 /*!< Queue average value */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQCTL_RQMAX_Msk 0x0000001FUL /*!< Request queue max depth */ +#define ADC_SEQ_SRQCTL_QAVGEN_Msk 0x00000100UL /*!< Queue avearage (scanning) enable */ +#define ADC_SEQ_SRQCTL_QAVGVAL_Msk 0x00000E00UL /*!< Queue average value */ + +/* Bit field enums: */ +typedef enum { + ADC_SEQ_SRQCTL_QAVGVAL_Disable = 0x0UL, /*!< Average disabled */ + ADC_SEQ_SRQCTL_QAVGVAL_Average2 = 0x1UL, /*!< Average with 2 measures */ + ADC_SEQ_SRQCTL_QAVGVAL_Average4 = 0x2UL, /*!< Average with 4 measures */ + ADC_SEQ_SRQCTL_QAVGVAL_Average8 = 0x3UL, /*!< Average with 8 measures */ + ADC_SEQ_SRQCTL_QAVGVAL_Average16 = 0x4UL, /*!< Average with 16 measures */ + ADC_SEQ_SRQCTL_QAVGVAL_Average32 = 0x5UL, /*!< Average with 32 measures */ + ADC_SEQ_SRQCTL_QAVGVAL_Average64 = 0x6UL, /*!< Average with 64 measures */ +} ADC_SEQ_SRQCTL_QAVGVAL_Enum; + +/*-- SEQ: SRQSTAT: Sequencer request status register ----------------------------------------------------------*/ +typedef struct { + uint32_t RQPTR :5; /*!< Pointer to queue current request */ + uint32_t :3; /*!< RESERVED */ + uint32_t RQBUSY :1; /*!< Active request status */ +} _ADC_SEQ_SRQSTAT_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRQSTAT_RQPTR_Pos 0 /*!< Pointer to queue current request */ +#define ADC_SEQ_SRQSTAT_RQBUSY_Pos 8 /*!< Active request status */ + +/* Bit field masks: */ +#define ADC_SEQ_SRQSTAT_RQPTR_Msk 0x0000001FUL /*!< Pointer to queue current request */ +#define ADC_SEQ_SRQSTAT_RQBUSY_Msk 0x00000100UL /*!< Active request status */ + +/*-- SEQ: SDMACTL: Sequencer DMA control register -------------------------------------------------------------*/ +typedef struct { + uint32_t DMAEN :1; /*!< Enable DMA use */ + uint32_t :7; /*!< RESERVED */ + uint32_t WMARK :3; /*!< FIFO load threshold for DMA request generation */ +} _ADC_SEQ_SDMACTL_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SDMACTL_DMAEN_Pos 0 /*!< Enable DMA use */ +#define ADC_SEQ_SDMACTL_WMARK_Pos 8 /*!< FIFO load threshold for DMA request generation */ + +/* Bit field masks: */ +#define ADC_SEQ_SDMACTL_DMAEN_Msk 0x00000001UL /*!< Enable DMA use */ +#define ADC_SEQ_SDMACTL_WMARK_Msk 0x00000700UL /*!< FIFO load threshold for DMA request generation */ + +/* Bit field enums: */ +typedef enum { + ADC_SEQ_SDMACTL_WMARK_Level1 = 0x1UL, /*!< 1 measure for dma request */ + ADC_SEQ_SDMACTL_WMARK_Level2 = 0x2UL, /*!< 2 measures for dma request */ + ADC_SEQ_SDMACTL_WMARK_Level4 = 0x3UL, /*!< 4 measures for dma request */ + ADC_SEQ_SDMACTL_WMARK_Level8 = 0x4UL, /*!< 8 measures for dma request */ + ADC_SEQ_SDMACTL_WMARK_Level16 = 0x5UL, /*!< 16 measures for dma request */ + ADC_SEQ_SDMACTL_WMARK_Level32 = 0x6UL, /*!< 32 measures for dma request */ +} ADC_SEQ_SDMACTL_WMARK_Enum; + +/*-- SEQ: SCCTL: Sequencer ADC interrupt and restart counter control register ---------------------------------*/ +typedef struct { + uint32_t RCNT :8; /*!< Current number of ADC restarts by sequencer */ + uint32_t RAVGEN :1; /*!< Average of ADC restarts enable */ + uint32_t :7; /*!< RESERVED */ + uint32_t ICNT :8; /*!< Number of ADC restarts for interrupt generation */ +} _ADC_SEQ_SCCTL_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SCCTL_RCNT_Pos 0 /*!< Current number of ADC restarts by sequencer */ +#define ADC_SEQ_SCCTL_RAVGEN_Pos 8 /*!< Average of ADC restarts enable */ +#define ADC_SEQ_SCCTL_ICNT_Pos 16 /*!< Number of ADC restarts for interrupt generation */ + +/* Bit field masks: */ +#define ADC_SEQ_SCCTL_RCNT_Msk 0x000000FFUL /*!< Current number of ADC restarts by sequencer */ +#define ADC_SEQ_SCCTL_RAVGEN_Msk 0x00000100UL /*!< Average of ADC restarts enable */ +#define ADC_SEQ_SCCTL_ICNT_Msk 0x00FF0000UL /*!< Number of ADC restarts for interrupt generation */ + +/*-- SEQ: SCVAL: Sequencer ADC interrupt and restart counter current value register --------------------------------*/ +typedef struct { + uint32_t RCNT :8; /*!< Current number of ADC restarts by sequencer */ + uint32_t :8; /*!< RESERVED */ + uint32_t ICNT :8; /*!< Current number of ADC restarts for interrupt generation */ + uint32_t ICLR :1; /*!< Clear interrupt counter */ +} _ADC_SEQ_SCVAL_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SCVAL_RCNT_Pos 0 /*!< Current number of ADC restarts by sequencer */ +#define ADC_SEQ_SCVAL_ICNT_Pos 16 /*!< Current number of ADC restarts for interrupt generation */ +#define ADC_SEQ_SCVAL_ICLR_Pos 24 /*!< Clear interrupt counter */ + +/* Bit field masks: */ +#define ADC_SEQ_SCVAL_RCNT_Msk 0x000000FFUL /*!< Current number of ADC restarts by sequencer */ +#define ADC_SEQ_SCVAL_ICNT_Msk 0x00FF0000UL /*!< Current number of ADC restarts for interrupt generation */ +#define ADC_SEQ_SCVAL_ICLR_Msk 0x01000000UL /*!< Clear interrupt counter */ + +/*-- SEQ: SDC: Sequencer digital comparator selection register ------------------------------------------------*/ +typedef struct { + uint32_t DC0 :1; /*!< Enable DC 0 */ + uint32_t DC1 :1; /*!< Enable DC 1 */ + uint32_t DC2 :1; /*!< Enable DC 2 */ + uint32_t DC3 :1; /*!< Enable DC 3 */ + uint32_t DC4 :1; /*!< Enable DC 4 */ + uint32_t DC5 :1; /*!< Enable DC 5 */ + uint32_t DC6 :1; /*!< Enable DC 6 */ + uint32_t DC7 :1; /*!< Enable DC 7 */ + uint32_t DC8 :1; /*!< Enable DC 8 */ + uint32_t DC9 :1; /*!< Enable DC 9 */ + uint32_t DC10 :1; /*!< Enable DC 10 */ + uint32_t DC11 :1; /*!< Enable DC 11 */ + uint32_t DC12 :1; /*!< Enable DC 12 */ + uint32_t DC13 :1; /*!< Enable DC 13 */ + uint32_t DC14 :1; /*!< Enable DC 14 */ + uint32_t DC15 :1; /*!< Enable DC 15 */ + uint32_t DC16 :1; /*!< Enable DC 16 */ + uint32_t DC17 :1; /*!< Enable DC 17 */ + uint32_t DC18 :1; /*!< Enable DC 18 */ + uint32_t DC19 :1; /*!< Enable DC 19 */ + uint32_t DC20 :1; /*!< Enable DC 20 */ + uint32_t DC21 :1; /*!< Enable DC 21 */ + uint32_t DC22 :1; /*!< Enable DC 22 */ + uint32_t DC23 :1; /*!< Enable DC 23 */ +} _ADC_SEQ_SDC_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SDC_DC0_Pos 0 /*!< Enable DC 0 */ +#define ADC_SEQ_SDC_DC1_Pos 1 /*!< Enable DC 1 */ +#define ADC_SEQ_SDC_DC2_Pos 2 /*!< Enable DC 2 */ +#define ADC_SEQ_SDC_DC3_Pos 3 /*!< Enable DC 3 */ +#define ADC_SEQ_SDC_DC4_Pos 4 /*!< Enable DC 4 */ +#define ADC_SEQ_SDC_DC5_Pos 5 /*!< Enable DC 5 */ +#define ADC_SEQ_SDC_DC6_Pos 6 /*!< Enable DC 6 */ +#define ADC_SEQ_SDC_DC7_Pos 7 /*!< Enable DC 7 */ +#define ADC_SEQ_SDC_DC8_Pos 8 /*!< Enable DC 8 */ +#define ADC_SEQ_SDC_DC9_Pos 9 /*!< Enable DC 9 */ +#define ADC_SEQ_SDC_DC10_Pos 10 /*!< Enable DC 10 */ +#define ADC_SEQ_SDC_DC11_Pos 11 /*!< Enable DC 11 */ +#define ADC_SEQ_SDC_DC12_Pos 12 /*!< Enable DC 12 */ +#define ADC_SEQ_SDC_DC13_Pos 13 /*!< Enable DC 13 */ +#define ADC_SEQ_SDC_DC14_Pos 14 /*!< Enable DC 14 */ +#define ADC_SEQ_SDC_DC15_Pos 15 /*!< Enable DC 15 */ +#define ADC_SEQ_SDC_DC16_Pos 16 /*!< Enable DC 16 */ +#define ADC_SEQ_SDC_DC17_Pos 17 /*!< Enable DC 17 */ +#define ADC_SEQ_SDC_DC18_Pos 18 /*!< Enable DC 18 */ +#define ADC_SEQ_SDC_DC19_Pos 19 /*!< Enable DC 19 */ +#define ADC_SEQ_SDC_DC20_Pos 20 /*!< Enable DC 20 */ +#define ADC_SEQ_SDC_DC21_Pos 21 /*!< Enable DC 21 */ +#define ADC_SEQ_SDC_DC22_Pos 22 /*!< Enable DC 22 */ +#define ADC_SEQ_SDC_DC23_Pos 23 /*!< Enable DC 23 */ + +/* Bit field masks: */ +#define ADC_SEQ_SDC_DC0_Msk 0x00000001UL /*!< Enable DC 0 */ +#define ADC_SEQ_SDC_DC1_Msk 0x00000002UL /*!< Enable DC 1 */ +#define ADC_SEQ_SDC_DC2_Msk 0x00000004UL /*!< Enable DC 2 */ +#define ADC_SEQ_SDC_DC3_Msk 0x00000008UL /*!< Enable DC 3 */ +#define ADC_SEQ_SDC_DC4_Msk 0x00000010UL /*!< Enable DC 4 */ +#define ADC_SEQ_SDC_DC5_Msk 0x00000020UL /*!< Enable DC 5 */ +#define ADC_SEQ_SDC_DC6_Msk 0x00000040UL /*!< Enable DC 6 */ +#define ADC_SEQ_SDC_DC7_Msk 0x00000080UL /*!< Enable DC 7 */ +#define ADC_SEQ_SDC_DC8_Msk 0x00000100UL /*!< Enable DC 8 */ +#define ADC_SEQ_SDC_DC9_Msk 0x00000200UL /*!< Enable DC 9 */ +#define ADC_SEQ_SDC_DC10_Msk 0x00000400UL /*!< Enable DC 10 */ +#define ADC_SEQ_SDC_DC11_Msk 0x00000800UL /*!< Enable DC 11 */ +#define ADC_SEQ_SDC_DC12_Msk 0x00001000UL /*!< Enable DC 12 */ +#define ADC_SEQ_SDC_DC13_Msk 0x00002000UL /*!< Enable DC 13 */ +#define ADC_SEQ_SDC_DC14_Msk 0x00004000UL /*!< Enable DC 14 */ +#define ADC_SEQ_SDC_DC15_Msk 0x00008000UL /*!< Enable DC 15 */ +#define ADC_SEQ_SDC_DC16_Msk 0x00010000UL /*!< Enable DC 16 */ +#define ADC_SEQ_SDC_DC17_Msk 0x00020000UL /*!< Enable DC 17 */ +#define ADC_SEQ_SDC_DC18_Msk 0x00040000UL /*!< Enable DC 18 */ +#define ADC_SEQ_SDC_DC19_Msk 0x00080000UL /*!< Enable DC 19 */ +#define ADC_SEQ_SDC_DC20_Msk 0x00100000UL /*!< Enable DC 20 */ +#define ADC_SEQ_SDC_DC21_Msk 0x00200000UL /*!< Enable DC 21 */ +#define ADC_SEQ_SDC_DC22_Msk 0x00400000UL /*!< Enable DC 22 */ +#define ADC_SEQ_SDC_DC23_Msk 0x00800000UL /*!< Enable DC 23 */ + +/*-- SEQ: SRTMR: Sequencer ADC restart timer register ---------------------------------------------------------*/ +typedef struct { + uint32_t VAL :24; /*!< Sequencer ADC restart timer value */ + uint32_t :7; /*!< RESERVED */ + uint32_t NOWAIT :1; /*!< Timer update with no waiting the end of current seq task */ +} _ADC_SEQ_SRTMR_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SRTMR_VAL_Pos 0 /*!< Sequencer ADC restart timer value */ +#define ADC_SEQ_SRTMR_NOWAIT_Pos 31 /*!< Timer update with no waiting the end of current seq task */ + +/* Bit field masks: */ +#define ADC_SEQ_SRTMR_VAL_Msk 0x00FFFFFFUL /*!< Sequencer ADC restart timer value */ +#define ADC_SEQ_SRTMR_NOWAIT_Msk 0x80000000UL /*!< Timer update with no waiting the end of current seq task */ + +/*-- SEQ: SFLOAD: Sequencer FIFO load status register ---------------------------------------------------------*/ +typedef struct { + uint32_t VAL :6; /*!< Sequencer FIFO current load value */ +} _ADC_SEQ_SFLOAD_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SFLOAD_VAL_Pos 0 /*!< Sequencer FIFO current load value */ + +/* Bit field masks: */ +#define ADC_SEQ_SFLOAD_VAL_Msk 0x0000003FUL /*!< Sequencer FIFO current load value */ + +/*-- SEQ: SFIFO: Sequencer FIFO register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t DATA :12; /*!< AD conversion value */ +} _ADC_SEQ_SFIFO_bits; + +/* Bit field positions: */ +#define ADC_SEQ_SFIFO_DATA_Pos 0 /*!< AD conversion value */ + +/* Bit field masks: */ +#define ADC_SEQ_SFIFO_DATA_Msk 0x00000FFFUL /*!< AD conversion value */ + +/*-- DC: DCTL: Digital comparator control register ------------------------------------------------------------*/ +typedef struct { + uint32_t CIM :2; /*!< DC interrupt generation mode */ + uint32_t CIC :2; /*!< DC interrupt generation compare conditions */ + uint32_t CIE :1; /*!< Enable DC interrupt generation */ + uint32_t :3; /*!< RESERVED */ + uint32_t CTM :2; /*!< DC output trigger mode */ + uint32_t CTC :2; /*!< DC output trigger compare conditions */ + uint32_t CTE :1; /*!< Enable DC output trigger */ + uint32_t :3; /*!< RESERVED */ + uint32_t CHNL :6; /*!< ADC channel selection */ + uint32_t :2; /*!< RESERVED */ + uint32_t SRC :1; /*!< Select data source for comparation: ADC module (0) or sequencer(1) */ + uint32_t :3; /*!< RESERVED */ + uint32_t HWTCLR :1; /*!< Hardware output trigger clear */ +} _ADC_DC_DCTL_bits; + +/* Bit field positions: */ +#define ADC_DC_DCTL_CIM_Pos 0 /*!< DC interrupt generation mode */ +#define ADC_DC_DCTL_CIC_Pos 2 /*!< DC interrupt generation compare conditions */ +#define ADC_DC_DCTL_CIE_Pos 4 /*!< Enable DC interrupt generation */ +#define ADC_DC_DCTL_CTM_Pos 8 /*!< DC output trigger mode */ +#define ADC_DC_DCTL_CTC_Pos 10 /*!< DC output trigger compare conditions */ +#define ADC_DC_DCTL_CTE_Pos 12 /*!< Enable DC output trigger */ +#define ADC_DC_DCTL_CHNL_Pos 16 /*!< ADC channel selection */ +#define ADC_DC_DCTL_SRC_Pos 24 /*!< Select data source for comparation: ADC module (0) or sequencer(1) */ +#define ADC_DC_DCTL_HWTCLR_Pos 28 /*!< Hardware output trigger clear */ + +/* Bit field masks: */ +#define ADC_DC_DCTL_CIM_Msk 0x00000003UL /*!< DC interrupt generation mode */ +#define ADC_DC_DCTL_CIC_Msk 0x0000000CUL /*!< DC interrupt generation compare conditions */ +#define ADC_DC_DCTL_CIE_Msk 0x00000010UL /*!< Enable DC interrupt generation */ +#define ADC_DC_DCTL_CTM_Msk 0x00000300UL /*!< DC output trigger mode */ +#define ADC_DC_DCTL_CTC_Msk 0x00000C00UL /*!< DC output trigger compare conditions */ +#define ADC_DC_DCTL_CTE_Msk 0x00001000UL /*!< Enable DC output trigger */ +#define ADC_DC_DCTL_CHNL_Msk 0x003F0000UL /*!< ADC channel selection */ +#define ADC_DC_DCTL_SRC_Msk 0x01000000UL /*!< Select data source for comparation: ADC module (0) or sequencer(1) */ +#define ADC_DC_DCTL_HWTCLR_Msk 0x10000000UL /*!< Hardware output trigger clear */ + +/* Bit field enums: */ +typedef enum { + ADC_DC_DCTL_CIM_Multiple = 0x0UL, /*!< multiple trigger mode */ + ADC_DC_DCTL_CIM_Single = 0x1UL, /*!< single trigger mode */ + ADC_DC_DCTL_CIM_MultipleHyst = 0x2UL, /*!< multiple trigger mode with hysteresis */ + ADC_DC_DCTL_CIM_SingleHyst = 0x3UL, /*!< single trigger mode with hysteresis */ +} ADC_DC_DCTL_CIM_Enum; + +typedef enum { + ADC_DC_DCTL_CIC_Low = 0x0UL, /*!< result lower or equal COMP0 */ + ADC_DC_DCTL_CIC_Window = 0x1UL, /*!< result between COMP0 and COMP1 or equal any of them */ + ADC_DC_DCTL_CIC_High = 0x2UL, /*!< result higher or equal COMP1 */ +} ADC_DC_DCTL_CIC_Enum; + +typedef enum { + ADC_DC_DCTL_CTM_Multiple = 0x0UL, /*!< multiple trigger mode */ + ADC_DC_DCTL_CTM_Single = 0x1UL, /*!< single trigger mode */ + ADC_DC_DCTL_CTM_MultipleHyst = 0x2UL, /*!< multiple trigger mode with hysteresis */ + ADC_DC_DCTL_CTM_SingleHyst = 0x3UL, /*!< single trigger mode with hysteresis */ +} ADC_DC_DCTL_CTM_Enum; + +typedef enum { + ADC_DC_DCTL_CTC_Low = 0x0UL, /*!< result lower or equal COMP0 */ + ADC_DC_DCTL_CTC_Window = 0x1UL, /*!< result between COMP0 and COMP1 or equal any of them */ + ADC_DC_DCTL_CTC_High = 0x2UL, /*!< result higher or equal COMP1 */ +} ADC_DC_DCTL_CTC_Enum; + +/*-- DC: DCMP: Digital comparator range register --------------------------------------------------------------*/ +typedef struct { + uint32_t CMPL :12; /*!< Low threshold compare value */ + uint32_t :4; /*!< RESERVED */ + uint32_t CMPH :12; /*!< High threshold compare value */ +} _ADC_DC_DCMP_bits; + +/* Bit field positions: */ +#define ADC_DC_DCMP_CMPL_Pos 0 /*!< Low threshold compare value */ +#define ADC_DC_DCMP_CMPH_Pos 16 /*!< High threshold compare value */ + +/* Bit field masks: */ +#define ADC_DC_DCMP_CMPL_Msk 0x00000FFFUL /*!< Low threshold compare value */ +#define ADC_DC_DCMP_CMPH_Msk 0x0FFF0000UL /*!< High threshold compare value */ + +/*-- DC: DDATA: Digital comparator last compared data register ------------------------------------------------*/ +typedef struct { + uint32_t VAL :12; /*!< Value of last compared AD conversion result */ +} _ADC_DC_DDATA_bits; + +/* Bit field positions: */ +#define ADC_DC_DDATA_VAL_Pos 0 /*!< Value of last compared AD conversion result */ + +/* Bit field masks: */ +#define ADC_DC_DDATA_VAL_Msk 0x00000FFFUL /*!< Value of last compared AD conversion result */ + +/*-- ACTL: ACTL: ADC module control register ------------------------------------------------------------------*/ +typedef struct { + uint32_t ADCEN :1; /*!< Enable ADC module */ + uint32_t ADCRDY :1; /*!< ADC ready for conversions */ + uint32_t :2; /*!< RESERVED */ + uint32_t SELRES :2; /*!< ADC resolution select */ + uint32_t :2; /*!< RESERVED */ + uint32_t CALEN :1; /*!< */ + uint32_t CALLOAD :1; /*!< */ + uint32_t CALSTART :1; /*!< */ + uint32_t CALBUSY :1; /*!< Enable ADC internal calibration */ + uint32_t :4; /*!< RESERVED */ + uint32_t CALIN :7; /*!< ADC calibration input value */ + uint32_t :1; /*!< RESERVED */ + uint32_t CALOUT :7; /*!< ADC calibration output value */ +} _ADC_ACTL_ACTL_bits; + +/* Bit field positions: */ +#define ADC_ACTL_ACTL_ADCEN_Pos 0 /*!< Enable ADC module */ +#define ADC_ACTL_ACTL_ADCRDY_Pos 1 /*!< ADC ready for conversions */ +#define ADC_ACTL_ACTL_SELRES_Pos 4 /*!< ADC resolution select */ +#define ADC_ACTL_ACTL_CALEN_Pos 8 /*!< */ +#define ADC_ACTL_ACTL_CALLOAD_Pos 9 /*!< */ +#define ADC_ACTL_ACTL_CALSTART_Pos 10 /*!< */ +#define ADC_ACTL_ACTL_CALBUSY_Pos 11 /*!< Enable ADC internal calibration */ +#define ADC_ACTL_ACTL_CALIN_Pos 16 /*!< ADC calibration input value */ +#define ADC_ACTL_ACTL_CALOUT_Pos 24 /*!< ADC calibration output value */ + +/* Bit field masks: */ +#define ADC_ACTL_ACTL_ADCEN_Msk 0x00000001UL /*!< Enable ADC module */ +#define ADC_ACTL_ACTL_ADCRDY_Msk 0x00000002UL /*!< ADC ready for conversions */ +#define ADC_ACTL_ACTL_SELRES_Msk 0x00000030UL /*!< ADC resolution select */ +#define ADC_ACTL_ACTL_CALEN_Msk 0x00000100UL /*!< */ +#define ADC_ACTL_ACTL_CALLOAD_Msk 0x00000200UL /*!< */ +#define ADC_ACTL_ACTL_CALSTART_Msk 0x00000400UL /*!< */ +#define ADC_ACTL_ACTL_CALBUSY_Msk 0x00000800UL /*!< Enable ADC internal calibration */ +#define ADC_ACTL_ACTL_CALIN_Msk 0x007F0000UL /*!< ADC calibration input value */ +#define ADC_ACTL_ACTL_CALOUT_Msk 0x7F000000UL /*!< ADC calibration output value */ + +/* Bit field enums: */ +typedef enum { + ADC_ACTL_ACTL_SELRES_6bit = 0x0UL, /*!< 6 bit mode */ + ADC_ACTL_ACTL_SELRES_8bit = 0x1UL, /*!< 8 bit mode */ + ADC_ACTL_ACTL_SELRES_10bit = 0x2UL, /*!< 10 bit mode */ + ADC_ACTL_ACTL_SELRES_12bit = 0x3UL, /*!< 12 bit mode */ +} ADC_ACTL_ACTL_SELRES_Enum; + +/*-- CHCTL: CHCTL: ADC channel control register ---------------------------------------------------------------*/ +typedef struct { + uint32_t OFFTRIM :9; /*!< ADC channel offset trimm value */ + uint32_t :7; /*!< RESERVED */ + uint32_t GAINTRIM :9; /*!< ADC channel gain trimm value */ + uint32_t :3; /*!< RESERVED */ + uint32_t PRIORITY :1; /*!< ADC channel priority level */ +} _ADC_CHCTL_CHCTL_bits; + +/* Bit field positions: */ +#define ADC_CHCTL_CHCTL_OFFTRIM_Pos 0 /*!< ADC channel offset trimm value */ +#define ADC_CHCTL_CHCTL_GAINTRIM_Pos 16 /*!< ADC channel gain trimm value */ +#define ADC_CHCTL_CHCTL_PRIORITY_Pos 28 /*!< ADC channel priority level */ + +/* Bit field masks: */ +#define ADC_CHCTL_CHCTL_OFFTRIM_Msk 0x000001FFUL /*!< ADC channel offset trimm value */ +#define ADC_CHCTL_CHCTL_GAINTRIM_Msk 0x01FF0000UL /*!< ADC channel gain trimm value */ +#define ADC_CHCTL_CHCTL_PRIORITY_Msk 0x10000000UL /*!< ADC channel priority level */ + +//Cluster SEQ: +typedef struct { + union { + /*!< Sequencer request ADC channels selection register 0 */ + __IO uint32_t SRQSEL0; /*!< SRQSEL0 : type used for word access */ + __IO _ADC_SEQ_SRQSEL0_bits SRQSEL0_bit; /*!< SRQSEL0_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request ADC channels selection register 1 */ + __IO uint32_t SRQSEL1; /*!< SRQSEL1 : type used for word access */ + __IO _ADC_SEQ_SRQSEL1_bits SRQSEL1_bit; /*!< SRQSEL1_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request ADC channels selection register 2 */ + __IO uint32_t SRQSEL2; /*!< SRQSEL2 : type used for word access */ + __IO _ADC_SEQ_SRQSEL2_bits SRQSEL2_bit; /*!< SRQSEL2_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request ADC channels selection register 3 */ + __IO uint32_t SRQSEL3; /*!< SRQSEL3 : type used for word access */ + __IO _ADC_SEQ_SRQSEL3_bits SRQSEL3_bit; /*!< SRQSEL3_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request ADC channels selection register 4 */ + __IO uint32_t SRQSEL4; /*!< SRQSEL4 : type used for word access */ + __IO _ADC_SEQ_SRQSEL4_bits SRQSEL4_bit; /*!< SRQSEL4_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request ADC channels selection register 5 */ + __IO uint32_t SRQSEL5; /*!< SRQSEL5 : type used for word access */ + __IO _ADC_SEQ_SRQSEL5_bits SRQSEL5_bit; /*!< SRQSEL5_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request control register */ + __IO uint32_t SRQCTL; /*!< SRQCTL : type used for word access */ + __IO _ADC_SEQ_SRQCTL_bits SRQCTL_bit; /*!< SRQCTL_bit: structure used for bit access */ + }; + union { + /*!< Sequencer request status register */ + __IO uint32_t SRQSTAT; /*!< SRQSTAT : type used for word access */ + __IO _ADC_SEQ_SRQSTAT_bits SRQSTAT_bit; /*!< SRQSTAT_bit: structure used for bit access */ + }; + union { + /*!< Sequencer DMA control register */ + __IO uint32_t SDMACTL; /*!< SDMACTL : type used for word access */ + __IO _ADC_SEQ_SDMACTL_bits SDMACTL_bit; /*!< SDMACTL_bit: structure used for bit access */ + }; + union { + /*!< Sequencer ADC interrupt and restart counter control register */ + __IO uint32_t SCCTL; /*!< SCCTL : type used for word access */ + __IO _ADC_SEQ_SCCTL_bits SCCTL_bit; /*!< SCCTL_bit: structure used for bit access */ + }; + union { + /*!< Sequencer ADC interrupt and restart counter current value register */ + __O uint32_t SCVAL; /*!< SCVAL : type used for word access */ + __O _ADC_SEQ_SCVAL_bits SCVAL_bit; /*!< SCVAL_bit: structure used for bit access */ + }; + union { + /*!< Sequencer digital comparator selection register */ + __IO uint32_t SDC; /*!< SDC : type used for word access */ + __IO _ADC_SEQ_SDC_bits SDC_bit; /*!< SDC_bit: structure used for bit access */ + }; + union { + /*!< Sequencer ADC restart timer register */ + __IO uint32_t SRTMR; /*!< SRTMR : type used for word access */ + __IO _ADC_SEQ_SRTMR_bits SRTMR_bit; /*!< SRTMR_bit: structure used for bit access */ + }; + union { + /*!< Sequencer FIFO load status register */ + __I uint32_t SFLOAD; /*!< SFLOAD : type used for word access */ + __I _ADC_SEQ_SFLOAD_bits SFLOAD_bit; /*!< SFLOAD_bit: structure used for bit access */ + }; + union { + /*!< Sequencer FIFO register */ + __I uint32_t SFIFO; /*!< SFIFO : type used for word access */ + __I _ADC_SEQ_SFIFO_bits SFIFO_bit; /*!< SFIFO_bit: structure used for bit access */ + }; +} _ADC_SEQ_TypeDef; +//Cluster DC: +typedef struct { + union { + /*!< Digital comparator control register */ + __IO uint32_t DCTL; /*!< DCTL : type used for word access */ + __IO _ADC_DC_DCTL_bits DCTL_bit; /*!< DCTL_bit: structure used for bit access */ + }; + union { + /*!< Digital comparator range register */ + __IO uint32_t DCMP; /*!< DCMP : type used for word access */ + __IO _ADC_DC_DCMP_bits DCMP_bit; /*!< DCMP_bit: structure used for bit access */ + }; + union { + /*!< Digital comparator last compared data register */ + __I uint32_t DDATA; /*!< DDATA : type used for word access */ + __I _ADC_DC_DDATA_bits DDATA_bit; /*!< DDATA_bit: structure used for bit access */ + }; +} _ADC_DC_TypeDef; +//Cluster ACTL: +typedef struct { + union { + /*!< ADC module control register */ + __IO uint32_t ACTL; /*!< ACTL : type used for word access */ + __IO _ADC_ACTL_ACTL_bits ACTL_bit; /*!< ACTL_bit: structure used for bit access */ + }; +} _ADC_ACTL_TypeDef; +//Cluster CHCTL: +typedef struct { + union { + /*!< ADC channel control register */ + __IO uint32_t CHCTL; /*!< CHCTL : type used for word access */ + __IO _ADC_CHCTL_CHCTL_bits CHCTL_bit; /*!< CHCTL_bit: structure used for bit access */ + }; +} _ADC_CHCTL_TypeDef; +typedef struct { + union { /*!< Enable sequencer register */ + __IO uint32_t SEQEN; /*!< SEQEN : type used for word access */ + __IO _ADC_SEQEN_bits SEQEN_bit; /*!< SEQEN_bit: structure used for bit access */ + }; + union { /*!< Sequencer sync register */ + __IO uint32_t SEQSYNC; /*!< SEQSYNC : type used for word access */ + __IO _ADC_SEQSYNC_bits SEQSYNC_bit; /*!< SEQSYNC_bit: structure used for bit access */ + }; + union { /*!< FIFO overflow status register */ + __IO uint32_t FSTAT; /*!< FSTAT : type used for word access */ + __IO _ADC_FSTAT_bits FSTAT_bit; /*!< FSTAT_bit: structure used for bit access */ + }; + union { /*!< Busy status register */ + __I uint32_t BSTAT; /*!< BSTAT : type used for word access */ + __I _ADC_BSTAT_bits BSTAT_bit; /*!< BSTAT_bit: structure used for bit access */ + }; + union { /*!< Digital comparator output trigger status register */ + __O uint32_t DCTRIG; /*!< DCTRIG : type used for word access */ + __O _ADC_DCTRIG_bits DCTRIG_bit; /*!< DCTRIG_bit: structure used for bit access */ + }; + union { /*!< Digital comparator compare event status register */ + __O uint32_t DCEV; /*!< DCEV : type used for word access */ + __O _ADC_DCEV_bits DCEV_bit; /*!< DCEV_bit: structure used for bit access */ + }; + union { /*!< Interrupt counter clear control */ + __IO uint32_t CICNT; /*!< CICNT : type used for word access */ + __IO _ADC_CICNT_bits CICNT_bit; /*!< CICNT_bit: structure used for bit access */ + }; + union { /*!< Sequencer start event selection register */ + __IO uint32_t EMUX; /*!< EMUX : type used for word access */ + __IO _ADC_EMUX_bits EMUX_bit; /*!< EMUX_bit: structure used for bit access */ + }; + union { /*!< Raw interrupt status register */ + __I uint32_t RIS; /*!< RIS : type used for word access */ + __I _ADC_RIS_bits RIS_bit; /*!< RIS_bit: structure used for bit access */ + }; + union { /*!< Interrupt mask register */ + __IO uint32_t IM; /*!< IM : type used for word access */ + __IO _ADC_IM_bits IM_bit; /*!< IM_bit: structure used for bit access */ + }; + union { /*!< Masked interrupt status and clear register */ + __I uint32_t MIS; /*!< MIS : type used for word access */ + __I _ADC_MIS_bits MIS_bit; /*!< MIS_bit: structure used for bit access */ + }; + union { /*!< Interrupt clear register */ + __O uint32_t IC; /*!< IC : type used for word access */ + __O _ADC_IC_bits IC_bit; /*!< IC_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[4]; + _ADC_SEQ_TypeDef SEQ[8]; + __IO uint32_t Reserved1[120]; + _ADC_DC_TypeDef DC[24]; + __IO uint32_t Reserved2[8]; + _ADC_ACTL_TypeDef ACTL[4]; + __IO uint32_t Reserved3[12]; + _ADC_CHCTL_TypeDef CHCTL[48]; +} ADC_TypeDef; + + +/******************************************************************************/ +/* GPIO registers */ +/******************************************************************************/ + +/*-- DATA: Data Input register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :16; /*!< Data input */ +} _GPIO_DATA_bits; + +/* Bit field positions: */ +#define GPIO_DATA_VAL_Pos 0 /*!< Data input */ + +/* Bit field masks: */ +#define GPIO_DATA_VAL_Msk 0x0000FFFFUL /*!< Data input */ + +/*-- DATAOUT: Data output register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :16; /*!< Data output */ +} _GPIO_DATAOUT_bits; + +/* Bit field positions: */ +#define GPIO_DATAOUT_VAL_Pos 0 /*!< Data output */ + +/* Bit field masks: */ +#define GPIO_DATAOUT_VAL_Msk 0x0000FFFFUL /*!< Data output */ + +/*-- DATAOUTSET: Data output set bits register ---------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Data output set bit 0 */ + uint32_t PIN1 :1; /*!< Data output set bit 1 */ + uint32_t PIN2 :1; /*!< Data output set bit 2 */ + uint32_t PIN3 :1; /*!< Data output set bit 3 */ + uint32_t PIN4 :1; /*!< Data output set bit 4 */ + uint32_t PIN5 :1; /*!< Data output set bit 5 */ + uint32_t PIN6 :1; /*!< Data output set bit 6 */ + uint32_t PIN7 :1; /*!< Data output set bit 7 */ + uint32_t PIN8 :1; /*!< Data output set bit 8 */ + uint32_t PIN9 :1; /*!< Data output set bit 9 */ + uint32_t PIN10 :1; /*!< Data output set bit 10 */ + uint32_t PIN11 :1; /*!< Data output set bit 11 */ + uint32_t PIN12 :1; /*!< Data output set bit 12 */ + uint32_t PIN13 :1; /*!< Data output set bit 13 */ + uint32_t PIN14 :1; /*!< Data output set bit 14 */ + uint32_t PIN15 :1; /*!< Data output set bit 15 */ +} _GPIO_DATAOUTSET_bits; + +/* Bit field positions: */ +#define GPIO_DATAOUTSET_PIN0_Pos 0 /*!< Data output set bit 0 */ +#define GPIO_DATAOUTSET_PIN1_Pos 1 /*!< Data output set bit 1 */ +#define GPIO_DATAOUTSET_PIN2_Pos 2 /*!< Data output set bit 2 */ +#define GPIO_DATAOUTSET_PIN3_Pos 3 /*!< Data output set bit 3 */ +#define GPIO_DATAOUTSET_PIN4_Pos 4 /*!< Data output set bit 4 */ +#define GPIO_DATAOUTSET_PIN5_Pos 5 /*!< Data output set bit 5 */ +#define GPIO_DATAOUTSET_PIN6_Pos 6 /*!< Data output set bit 6 */ +#define GPIO_DATAOUTSET_PIN7_Pos 7 /*!< Data output set bit 7 */ +#define GPIO_DATAOUTSET_PIN8_Pos 8 /*!< Data output set bit 8 */ +#define GPIO_DATAOUTSET_PIN9_Pos 9 /*!< Data output set bit 9 */ +#define GPIO_DATAOUTSET_PIN10_Pos 10 /*!< Data output set bit 10 */ +#define GPIO_DATAOUTSET_PIN11_Pos 11 /*!< Data output set bit 11 */ +#define GPIO_DATAOUTSET_PIN12_Pos 12 /*!< Data output set bit 12 */ +#define GPIO_DATAOUTSET_PIN13_Pos 13 /*!< Data output set bit 13 */ +#define GPIO_DATAOUTSET_PIN14_Pos 14 /*!< Data output set bit 14 */ +#define GPIO_DATAOUTSET_PIN15_Pos 15 /*!< Data output set bit 15 */ + +/* Bit field masks: */ +#define GPIO_DATAOUTSET_PIN0_Msk 0x00000001UL /*!< Data output set bit 0 */ +#define GPIO_DATAOUTSET_PIN1_Msk 0x00000002UL /*!< Data output set bit 1 */ +#define GPIO_DATAOUTSET_PIN2_Msk 0x00000004UL /*!< Data output set bit 2 */ +#define GPIO_DATAOUTSET_PIN3_Msk 0x00000008UL /*!< Data output set bit 3 */ +#define GPIO_DATAOUTSET_PIN4_Msk 0x00000010UL /*!< Data output set bit 4 */ +#define GPIO_DATAOUTSET_PIN5_Msk 0x00000020UL /*!< Data output set bit 5 */ +#define GPIO_DATAOUTSET_PIN6_Msk 0x00000040UL /*!< Data output set bit 6 */ +#define GPIO_DATAOUTSET_PIN7_Msk 0x00000080UL /*!< Data output set bit 7 */ +#define GPIO_DATAOUTSET_PIN8_Msk 0x00000100UL /*!< Data output set bit 8 */ +#define GPIO_DATAOUTSET_PIN9_Msk 0x00000200UL /*!< Data output set bit 9 */ +#define GPIO_DATAOUTSET_PIN10_Msk 0x00000400UL /*!< Data output set bit 10 */ +#define GPIO_DATAOUTSET_PIN11_Msk 0x00000800UL /*!< Data output set bit 11 */ +#define GPIO_DATAOUTSET_PIN12_Msk 0x00001000UL /*!< Data output set bit 12 */ +#define GPIO_DATAOUTSET_PIN13_Msk 0x00002000UL /*!< Data output set bit 13 */ +#define GPIO_DATAOUTSET_PIN14_Msk 0x00004000UL /*!< Data output set bit 14 */ +#define GPIO_DATAOUTSET_PIN15_Msk 0x00008000UL /*!< Data output set bit 15 */ + +/*-- DATAOUTCLR: Data output clear bits register -------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Data output clear bit 0 */ + uint32_t PIN1 :1; /*!< Data output clear bit 1 */ + uint32_t PIN2 :1; /*!< Data output clear bit 2 */ + uint32_t PIN3 :1; /*!< Data output clear bit 3 */ + uint32_t PIN4 :1; /*!< Data output clear bit 4 */ + uint32_t PIN5 :1; /*!< Data output clear bit 5 */ + uint32_t PIN6 :1; /*!< Data output clear bit 6 */ + uint32_t PIN7 :1; /*!< Data output clear bit 7 */ + uint32_t PIN8 :1; /*!< Data output clear bit 8 */ + uint32_t PIN9 :1; /*!< Data output clear bit 9 */ + uint32_t PIN10 :1; /*!< Data output clear bit 10 */ + uint32_t PIN11 :1; /*!< Data output clear bit 11 */ + uint32_t PIN12 :1; /*!< Data output clear bit 12 */ + uint32_t PIN13 :1; /*!< Data output clear bit 13 */ + uint32_t PIN14 :1; /*!< Data output clear bit 14 */ + uint32_t PIN15 :1; /*!< Data output clear bit 15 */ +} _GPIO_DATAOUTCLR_bits; + +/* Bit field positions: */ +#define GPIO_DATAOUTCLR_PIN0_Pos 0 /*!< Data output clear bit 0 */ +#define GPIO_DATAOUTCLR_PIN1_Pos 1 /*!< Data output clear bit 1 */ +#define GPIO_DATAOUTCLR_PIN2_Pos 2 /*!< Data output clear bit 2 */ +#define GPIO_DATAOUTCLR_PIN3_Pos 3 /*!< Data output clear bit 3 */ +#define GPIO_DATAOUTCLR_PIN4_Pos 4 /*!< Data output clear bit 4 */ +#define GPIO_DATAOUTCLR_PIN5_Pos 5 /*!< Data output clear bit 5 */ +#define GPIO_DATAOUTCLR_PIN6_Pos 6 /*!< Data output clear bit 6 */ +#define GPIO_DATAOUTCLR_PIN7_Pos 7 /*!< Data output clear bit 7 */ +#define GPIO_DATAOUTCLR_PIN8_Pos 8 /*!< Data output clear bit 8 */ +#define GPIO_DATAOUTCLR_PIN9_Pos 9 /*!< Data output clear bit 9 */ +#define GPIO_DATAOUTCLR_PIN10_Pos 10 /*!< Data output clear bit 10 */ +#define GPIO_DATAOUTCLR_PIN11_Pos 11 /*!< Data output clear bit 11 */ +#define GPIO_DATAOUTCLR_PIN12_Pos 12 /*!< Data output clear bit 12 */ +#define GPIO_DATAOUTCLR_PIN13_Pos 13 /*!< Data output clear bit 13 */ +#define GPIO_DATAOUTCLR_PIN14_Pos 14 /*!< Data output clear bit 14 */ +#define GPIO_DATAOUTCLR_PIN15_Pos 15 /*!< Data output clear bit 15 */ + +/* Bit field masks: */ +#define GPIO_DATAOUTCLR_PIN0_Msk 0x00000001UL /*!< Data output clear bit 0 */ +#define GPIO_DATAOUTCLR_PIN1_Msk 0x00000002UL /*!< Data output clear bit 1 */ +#define GPIO_DATAOUTCLR_PIN2_Msk 0x00000004UL /*!< Data output clear bit 2 */ +#define GPIO_DATAOUTCLR_PIN3_Msk 0x00000008UL /*!< Data output clear bit 3 */ +#define GPIO_DATAOUTCLR_PIN4_Msk 0x00000010UL /*!< Data output clear bit 4 */ +#define GPIO_DATAOUTCLR_PIN5_Msk 0x00000020UL /*!< Data output clear bit 5 */ +#define GPIO_DATAOUTCLR_PIN6_Msk 0x00000040UL /*!< Data output clear bit 6 */ +#define GPIO_DATAOUTCLR_PIN7_Msk 0x00000080UL /*!< Data output clear bit 7 */ +#define GPIO_DATAOUTCLR_PIN8_Msk 0x00000100UL /*!< Data output clear bit 8 */ +#define GPIO_DATAOUTCLR_PIN9_Msk 0x00000200UL /*!< Data output clear bit 9 */ +#define GPIO_DATAOUTCLR_PIN10_Msk 0x00000400UL /*!< Data output clear bit 10 */ +#define GPIO_DATAOUTCLR_PIN11_Msk 0x00000800UL /*!< Data output clear bit 11 */ +#define GPIO_DATAOUTCLR_PIN12_Msk 0x00001000UL /*!< Data output clear bit 12 */ +#define GPIO_DATAOUTCLR_PIN13_Msk 0x00002000UL /*!< Data output clear bit 13 */ +#define GPIO_DATAOUTCLR_PIN14_Msk 0x00004000UL /*!< Data output clear bit 14 */ +#define GPIO_DATAOUTCLR_PIN15_Msk 0x00008000UL /*!< Data output clear bit 15 */ + +/*-- DATAOUTTGL: Data output toogle bits register ------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Data output toogle bit 0 */ + uint32_t PIN1 :1; /*!< Data output toogle bit 1 */ + uint32_t PIN2 :1; /*!< Data output toogle bit 2 */ + uint32_t PIN3 :1; /*!< Data output toogle bit 3 */ + uint32_t PIN4 :1; /*!< Data output toogle bit 4 */ + uint32_t PIN5 :1; /*!< Data output toogle bit 5 */ + uint32_t PIN6 :1; /*!< Data output toogle bit 6 */ + uint32_t PIN7 :1; /*!< Data output toogle bit 7 */ + uint32_t PIN8 :1; /*!< Data output toogle bit 8 */ + uint32_t PIN9 :1; /*!< Data output toogle bit 9 */ + uint32_t PIN10 :1; /*!< Data output toogle bit 10 */ + uint32_t PIN11 :1; /*!< Data output toogle bit 11 */ + uint32_t PIN12 :1; /*!< Data output toogle bit 12 */ + uint32_t PIN13 :1; /*!< Data output toogle bit 13 */ + uint32_t PIN14 :1; /*!< Data output toogle bit 14 */ + uint32_t PIN15 :1; /*!< Data output toogle bit 15 */ +} _GPIO_DATAOUTTGL_bits; + +/* Bit field positions: */ +#define GPIO_DATAOUTTGL_PIN0_Pos 0 /*!< Data output toogle bit 0 */ +#define GPIO_DATAOUTTGL_PIN1_Pos 1 /*!< Data output toogle bit 1 */ +#define GPIO_DATAOUTTGL_PIN2_Pos 2 /*!< Data output toogle bit 2 */ +#define GPIO_DATAOUTTGL_PIN3_Pos 3 /*!< Data output toogle bit 3 */ +#define GPIO_DATAOUTTGL_PIN4_Pos 4 /*!< Data output toogle bit 4 */ +#define GPIO_DATAOUTTGL_PIN5_Pos 5 /*!< Data output toogle bit 5 */ +#define GPIO_DATAOUTTGL_PIN6_Pos 6 /*!< Data output toogle bit 6 */ +#define GPIO_DATAOUTTGL_PIN7_Pos 7 /*!< Data output toogle bit 7 */ +#define GPIO_DATAOUTTGL_PIN8_Pos 8 /*!< Data output toogle bit 8 */ +#define GPIO_DATAOUTTGL_PIN9_Pos 9 /*!< Data output toogle bit 9 */ +#define GPIO_DATAOUTTGL_PIN10_Pos 10 /*!< Data output toogle bit 10 */ +#define GPIO_DATAOUTTGL_PIN11_Pos 11 /*!< Data output toogle bit 11 */ +#define GPIO_DATAOUTTGL_PIN12_Pos 12 /*!< Data output toogle bit 12 */ +#define GPIO_DATAOUTTGL_PIN13_Pos 13 /*!< Data output toogle bit 13 */ +#define GPIO_DATAOUTTGL_PIN14_Pos 14 /*!< Data output toogle bit 14 */ +#define GPIO_DATAOUTTGL_PIN15_Pos 15 /*!< Data output toogle bit 15 */ + +/* Bit field masks: */ +#define GPIO_DATAOUTTGL_PIN0_Msk 0x00000001UL /*!< Data output toogle bit 0 */ +#define GPIO_DATAOUTTGL_PIN1_Msk 0x00000002UL /*!< Data output toogle bit 1 */ +#define GPIO_DATAOUTTGL_PIN2_Msk 0x00000004UL /*!< Data output toogle bit 2 */ +#define GPIO_DATAOUTTGL_PIN3_Msk 0x00000008UL /*!< Data output toogle bit 3 */ +#define GPIO_DATAOUTTGL_PIN4_Msk 0x00000010UL /*!< Data output toogle bit 4 */ +#define GPIO_DATAOUTTGL_PIN5_Msk 0x00000020UL /*!< Data output toogle bit 5 */ +#define GPIO_DATAOUTTGL_PIN6_Msk 0x00000040UL /*!< Data output toogle bit 6 */ +#define GPIO_DATAOUTTGL_PIN7_Msk 0x00000080UL /*!< Data output toogle bit 7 */ +#define GPIO_DATAOUTTGL_PIN8_Msk 0x00000100UL /*!< Data output toogle bit 8 */ +#define GPIO_DATAOUTTGL_PIN9_Msk 0x00000200UL /*!< Data output toogle bit 9 */ +#define GPIO_DATAOUTTGL_PIN10_Msk 0x00000400UL /*!< Data output toogle bit 10 */ +#define GPIO_DATAOUTTGL_PIN11_Msk 0x00000800UL /*!< Data output toogle bit 11 */ +#define GPIO_DATAOUTTGL_PIN12_Msk 0x00001000UL /*!< Data output toogle bit 12 */ +#define GPIO_DATAOUTTGL_PIN13_Msk 0x00002000UL /*!< Data output toogle bit 13 */ +#define GPIO_DATAOUTTGL_PIN14_Msk 0x00004000UL /*!< Data output toogle bit 14 */ +#define GPIO_DATAOUTTGL_PIN15_Msk 0x00008000UL /*!< Data output toogle bit 15 */ + +/*-- DENSET: Digital function (PAD) enable register ----------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Digital function (PAD) enable on pin 0 */ + uint32_t PIN1 :1; /*!< Digital function (PAD) enable on pin 1 */ + uint32_t PIN2 :1; /*!< Digital function (PAD) enable on pin 2 */ + uint32_t PIN3 :1; /*!< Digital function (PAD) enable on pin 3 */ + uint32_t PIN4 :1; /*!< Digital function (PAD) enable on pin 4 */ + uint32_t PIN5 :1; /*!< Digital function (PAD) enable on pin 5 */ + uint32_t PIN6 :1; /*!< Digital function (PAD) enable on pin 6 */ + uint32_t PIN7 :1; /*!< Digital function (PAD) enable on pin 7 */ + uint32_t PIN8 :1; /*!< Digital function (PAD) enable on pin 8 */ + uint32_t PIN9 :1; /*!< Digital function (PAD) enable on pin 9 */ + uint32_t PIN10 :1; /*!< Digital function (PAD) enable on pin 10 */ + uint32_t PIN11 :1; /*!< Digital function (PAD) enable on pin 11 */ + uint32_t PIN12 :1; /*!< Digital function (PAD) enable on pin 12 */ + uint32_t PIN13 :1; /*!< Digital function (PAD) enable on pin 13 */ + uint32_t PIN14 :1; /*!< Digital function (PAD) enable on pin 14 */ + uint32_t PIN15 :1; /*!< Digital function (PAD) enable on pin 15 */ +} _GPIO_DENSET_bits; + +/* Bit field positions: */ +#define GPIO_DENSET_PIN0_Pos 0 /*!< Digital function (PAD) enable on pin 0 */ +#define GPIO_DENSET_PIN1_Pos 1 /*!< Digital function (PAD) enable on pin 1 */ +#define GPIO_DENSET_PIN2_Pos 2 /*!< Digital function (PAD) enable on pin 2 */ +#define GPIO_DENSET_PIN3_Pos 3 /*!< Digital function (PAD) enable on pin 3 */ +#define GPIO_DENSET_PIN4_Pos 4 /*!< Digital function (PAD) enable on pin 4 */ +#define GPIO_DENSET_PIN5_Pos 5 /*!< Digital function (PAD) enable on pin 5 */ +#define GPIO_DENSET_PIN6_Pos 6 /*!< Digital function (PAD) enable on pin 6 */ +#define GPIO_DENSET_PIN7_Pos 7 /*!< Digital function (PAD) enable on pin 7 */ +#define GPIO_DENSET_PIN8_Pos 8 /*!< Digital function (PAD) enable on pin 8 */ +#define GPIO_DENSET_PIN9_Pos 9 /*!< Digital function (PAD) enable on pin 9 */ +#define GPIO_DENSET_PIN10_Pos 10 /*!< Digital function (PAD) enable on pin 10 */ +#define GPIO_DENSET_PIN11_Pos 11 /*!< Digital function (PAD) enable on pin 11 */ +#define GPIO_DENSET_PIN12_Pos 12 /*!< Digital function (PAD) enable on pin 12 */ +#define GPIO_DENSET_PIN13_Pos 13 /*!< Digital function (PAD) enable on pin 13 */ +#define GPIO_DENSET_PIN14_Pos 14 /*!< Digital function (PAD) enable on pin 14 */ +#define GPIO_DENSET_PIN15_Pos 15 /*!< Digital function (PAD) enable on pin 15 */ + +/* Bit field masks: */ +#define GPIO_DENSET_PIN0_Msk 0x00000001UL /*!< Digital function (PAD) enable on pin 0 */ +#define GPIO_DENSET_PIN1_Msk 0x00000002UL /*!< Digital function (PAD) enable on pin 1 */ +#define GPIO_DENSET_PIN2_Msk 0x00000004UL /*!< Digital function (PAD) enable on pin 2 */ +#define GPIO_DENSET_PIN3_Msk 0x00000008UL /*!< Digital function (PAD) enable on pin 3 */ +#define GPIO_DENSET_PIN4_Msk 0x00000010UL /*!< Digital function (PAD) enable on pin 4 */ +#define GPIO_DENSET_PIN5_Msk 0x00000020UL /*!< Digital function (PAD) enable on pin 5 */ +#define GPIO_DENSET_PIN6_Msk 0x00000040UL /*!< Digital function (PAD) enable on pin 6 */ +#define GPIO_DENSET_PIN7_Msk 0x00000080UL /*!< Digital function (PAD) enable on pin 7 */ +#define GPIO_DENSET_PIN8_Msk 0x00000100UL /*!< Digital function (PAD) enable on pin 8 */ +#define GPIO_DENSET_PIN9_Msk 0x00000200UL /*!< Digital function (PAD) enable on pin 9 */ +#define GPIO_DENSET_PIN10_Msk 0x00000400UL /*!< Digital function (PAD) enable on pin 10 */ +#define GPIO_DENSET_PIN11_Msk 0x00000800UL /*!< Digital function (PAD) enable on pin 11 */ +#define GPIO_DENSET_PIN12_Msk 0x00001000UL /*!< Digital function (PAD) enable on pin 12 */ +#define GPIO_DENSET_PIN13_Msk 0x00002000UL /*!< Digital function (PAD) enable on pin 13 */ +#define GPIO_DENSET_PIN14_Msk 0x00004000UL /*!< Digital function (PAD) enable on pin 14 */ +#define GPIO_DENSET_PIN15_Msk 0x00008000UL /*!< Digital function (PAD) enable on pin 15 */ + +/*-- DENCLR: Digital function (PAD) disable register ---------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Digital function (PAD) disable on pin 0 */ + uint32_t PIN1 :1; /*!< Digital function (PAD) disable on pin 1 */ + uint32_t PIN2 :1; /*!< Digital function (PAD) disable on pin 2 */ + uint32_t PIN3 :1; /*!< Digital function (PAD) disable on pin 3 */ + uint32_t PIN4 :1; /*!< Digital function (PAD) disable on pin 4 */ + uint32_t PIN5 :1; /*!< Digital function (PAD) disable on pin 5 */ + uint32_t PIN6 :1; /*!< Digital function (PAD) disable on pin 6 */ + uint32_t PIN7 :1; /*!< Digital function (PAD) disable on pin 7 */ + uint32_t PIN8 :1; /*!< Digital function (PAD) disable on pin 8 */ + uint32_t PIN9 :1; /*!< Digital function (PAD) disable on pin 9 */ + uint32_t PIN10 :1; /*!< Digital function (PAD) disable on pin 10 */ + uint32_t PIN11 :1; /*!< Digital function (PAD) disable on pin 11 */ + uint32_t PIN12 :1; /*!< Digital function (PAD) disable on pin 12 */ + uint32_t PIN13 :1; /*!< Digital function (PAD) disable on pin 13 */ + uint32_t PIN14 :1; /*!< Digital function (PAD) disable on pin 14 */ + uint32_t PIN15 :1; /*!< Digital function (PAD) disable on pin 15 */ +} _GPIO_DENCLR_bits; + +/* Bit field positions: */ +#define GPIO_DENCLR_PIN0_Pos 0 /*!< Digital function (PAD) disable on pin 0 */ +#define GPIO_DENCLR_PIN1_Pos 1 /*!< Digital function (PAD) disable on pin 1 */ +#define GPIO_DENCLR_PIN2_Pos 2 /*!< Digital function (PAD) disable on pin 2 */ +#define GPIO_DENCLR_PIN3_Pos 3 /*!< Digital function (PAD) disable on pin 3 */ +#define GPIO_DENCLR_PIN4_Pos 4 /*!< Digital function (PAD) disable on pin 4 */ +#define GPIO_DENCLR_PIN5_Pos 5 /*!< Digital function (PAD) disable on pin 5 */ +#define GPIO_DENCLR_PIN6_Pos 6 /*!< Digital function (PAD) disable on pin 6 */ +#define GPIO_DENCLR_PIN7_Pos 7 /*!< Digital function (PAD) disable on pin 7 */ +#define GPIO_DENCLR_PIN8_Pos 8 /*!< Digital function (PAD) disable on pin 8 */ +#define GPIO_DENCLR_PIN9_Pos 9 /*!< Digital function (PAD) disable on pin 9 */ +#define GPIO_DENCLR_PIN10_Pos 10 /*!< Digital function (PAD) disable on pin 10 */ +#define GPIO_DENCLR_PIN11_Pos 11 /*!< Digital function (PAD) disable on pin 11 */ +#define GPIO_DENCLR_PIN12_Pos 12 /*!< Digital function (PAD) disable on pin 12 */ +#define GPIO_DENCLR_PIN13_Pos 13 /*!< Digital function (PAD) disable on pin 13 */ +#define GPIO_DENCLR_PIN14_Pos 14 /*!< Digital function (PAD) disable on pin 14 */ +#define GPIO_DENCLR_PIN15_Pos 15 /*!< Digital function (PAD) disable on pin 15 */ + +/* Bit field masks: */ +#define GPIO_DENCLR_PIN0_Msk 0x00000001UL /*!< Digital function (PAD) disable on pin 0 */ +#define GPIO_DENCLR_PIN1_Msk 0x00000002UL /*!< Digital function (PAD) disable on pin 1 */ +#define GPIO_DENCLR_PIN2_Msk 0x00000004UL /*!< Digital function (PAD) disable on pin 2 */ +#define GPIO_DENCLR_PIN3_Msk 0x00000008UL /*!< Digital function (PAD) disable on pin 3 */ +#define GPIO_DENCLR_PIN4_Msk 0x00000010UL /*!< Digital function (PAD) disable on pin 4 */ +#define GPIO_DENCLR_PIN5_Msk 0x00000020UL /*!< Digital function (PAD) disable on pin 5 */ +#define GPIO_DENCLR_PIN6_Msk 0x00000040UL /*!< Digital function (PAD) disable on pin 6 */ +#define GPIO_DENCLR_PIN7_Msk 0x00000080UL /*!< Digital function (PAD) disable on pin 7 */ +#define GPIO_DENCLR_PIN8_Msk 0x00000100UL /*!< Digital function (PAD) disable on pin 8 */ +#define GPIO_DENCLR_PIN9_Msk 0x00000200UL /*!< Digital function (PAD) disable on pin 9 */ +#define GPIO_DENCLR_PIN10_Msk 0x00000400UL /*!< Digital function (PAD) disable on pin 10 */ +#define GPIO_DENCLR_PIN11_Msk 0x00000800UL /*!< Digital function (PAD) disable on pin 11 */ +#define GPIO_DENCLR_PIN12_Msk 0x00001000UL /*!< Digital function (PAD) disable on pin 12 */ +#define GPIO_DENCLR_PIN13_Msk 0x00002000UL /*!< Digital function (PAD) disable on pin 13 */ +#define GPIO_DENCLR_PIN14_Msk 0x00004000UL /*!< Digital function (PAD) disable on pin 14 */ +#define GPIO_DENCLR_PIN15_Msk 0x00008000UL /*!< Digital function (PAD) disable on pin 15 */ + +/*-- INMODE: Select input mode register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :2; /*!< Select input mode for pin 0 */ + uint32_t PIN1 :2; /*!< Select input mode for pin 1 */ + uint32_t PIN2 :2; /*!< Select input mode for pin 2 */ + uint32_t PIN3 :2; /*!< Select input mode for pin 3 */ + uint32_t PIN4 :2; /*!< Select input mode for pin 4 */ + uint32_t PIN5 :2; /*!< Select input mode for pin 5 */ + uint32_t PIN6 :2; /*!< Select input mode for pin 6 */ + uint32_t PIN7 :2; /*!< Select input mode for pin 7 */ + uint32_t PIN8 :2; /*!< Select input mode for pin 8 */ + uint32_t PIN9 :2; /*!< Select input mode for pin 9 */ + uint32_t PIN10 :2; /*!< Select input mode for pin 10 */ + uint32_t PIN11 :2; /*!< Select input mode for pin 11 */ + uint32_t PIN12 :2; /*!< Select input mode for pin 12 */ + uint32_t PIN13 :2; /*!< Select input mode for pin 13 */ + uint32_t PIN14 :2; /*!< Select input mode for pin 14 */ + uint32_t PIN15 :2; /*!< Select input mode for pin 15 */ +} _GPIO_INMODE_bits; + +/* Bit field positions: */ +#define GPIO_INMODE_PIN0_Pos 0 /*!< Select input mode for pin 0 */ +#define GPIO_INMODE_PIN1_Pos 2 /*!< Select input mode for pin 1 */ +#define GPIO_INMODE_PIN2_Pos 4 /*!< Select input mode for pin 2 */ +#define GPIO_INMODE_PIN3_Pos 6 /*!< Select input mode for pin 3 */ +#define GPIO_INMODE_PIN4_Pos 8 /*!< Select input mode for pin 4 */ +#define GPIO_INMODE_PIN5_Pos 10 /*!< Select input mode for pin 5 */ +#define GPIO_INMODE_PIN6_Pos 12 /*!< Select input mode for pin 6 */ +#define GPIO_INMODE_PIN7_Pos 14 /*!< Select input mode for pin 7 */ +#define GPIO_INMODE_PIN8_Pos 16 /*!< Select input mode for pin 8 */ +#define GPIO_INMODE_PIN9_Pos 18 /*!< Select input mode for pin 9 */ +#define GPIO_INMODE_PIN10_Pos 20 /*!< Select input mode for pin 10 */ +#define GPIO_INMODE_PIN11_Pos 22 /*!< Select input mode for pin 11 */ +#define GPIO_INMODE_PIN12_Pos 24 /*!< Select input mode for pin 12 */ +#define GPIO_INMODE_PIN13_Pos 26 /*!< Select input mode for pin 13 */ +#define GPIO_INMODE_PIN14_Pos 28 /*!< Select input mode for pin 14 */ +#define GPIO_INMODE_PIN15_Pos 30 /*!< Select input mode for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INMODE_PIN0_Msk 0x00000003UL /*!< Select input mode for pin 0 */ +#define GPIO_INMODE_PIN1_Msk 0x0000000CUL /*!< Select input mode for pin 1 */ +#define GPIO_INMODE_PIN2_Msk 0x00000030UL /*!< Select input mode for pin 2 */ +#define GPIO_INMODE_PIN3_Msk 0x000000C0UL /*!< Select input mode for pin 3 */ +#define GPIO_INMODE_PIN4_Msk 0x00000300UL /*!< Select input mode for pin 4 */ +#define GPIO_INMODE_PIN5_Msk 0x00000C00UL /*!< Select input mode for pin 5 */ +#define GPIO_INMODE_PIN6_Msk 0x00003000UL /*!< Select input mode for pin 6 */ +#define GPIO_INMODE_PIN7_Msk 0x0000C000UL /*!< Select input mode for pin 7 */ +#define GPIO_INMODE_PIN8_Msk 0x00030000UL /*!< Select input mode for pin 8 */ +#define GPIO_INMODE_PIN9_Msk 0x000C0000UL /*!< Select input mode for pin 9 */ +#define GPIO_INMODE_PIN10_Msk 0x00300000UL /*!< Select input mode for pin 10 */ +#define GPIO_INMODE_PIN11_Msk 0x00C00000UL /*!< Select input mode for pin 11 */ +#define GPIO_INMODE_PIN12_Msk 0x03000000UL /*!< Select input mode for pin 12 */ +#define GPIO_INMODE_PIN13_Msk 0x0C000000UL /*!< Select input mode for pin 13 */ +#define GPIO_INMODE_PIN14_Msk 0x30000000UL /*!< Select input mode for pin 14 */ +#define GPIO_INMODE_PIN15_Msk 0xC0000000UL /*!< Select input mode for pin 15 */ + +/* Bit field enums: */ +typedef enum { + GPIO_INMODE_PIN0_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN0_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN0_Enum; + +typedef enum { + GPIO_INMODE_PIN1_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN1_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN1_Enum; + +typedef enum { + GPIO_INMODE_PIN2_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN2_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN2_Enum; + +typedef enum { + GPIO_INMODE_PIN3_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN3_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN3_Enum; + +typedef enum { + GPIO_INMODE_PIN4_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN4_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN4_Enum; + +typedef enum { + GPIO_INMODE_PIN5_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN5_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN5_Enum; + +typedef enum { + GPIO_INMODE_PIN6_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN6_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN6_Enum; + +typedef enum { + GPIO_INMODE_PIN7_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN7_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN7_Enum; + +typedef enum { + GPIO_INMODE_PIN8_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN8_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN8_Enum; + +typedef enum { + GPIO_INMODE_PIN9_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN9_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN9_Enum; + +typedef enum { + GPIO_INMODE_PIN10_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN10_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN10_Enum; + +typedef enum { + GPIO_INMODE_PIN11_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN11_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN11_Enum; + +typedef enum { + GPIO_INMODE_PIN12_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN12_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN12_Enum; + +typedef enum { + GPIO_INMODE_PIN13_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN13_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN13_Enum; + +typedef enum { + GPIO_INMODE_PIN14_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN14_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN14_Enum; + +typedef enum { + GPIO_INMODE_PIN15_Schmitt = 0x0UL, /*!< Scmitt buffer */ + GPIO_INMODE_PIN15_Disable = 0x3UL, /*!< Input buffer disabled */ +} GPIO_INMODE_PIN15_Enum; + +/*-- PULLMODE: Select pull mode register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :2; /*!< Select pull mode for pin 0 */ + uint32_t PIN1 :2; /*!< Select pull mode for pin 1 */ + uint32_t PIN2 :2; /*!< Select pull mode for pin 2 */ + uint32_t PIN3 :2; /*!< Select pull mode for pin 3 */ + uint32_t PIN4 :2; /*!< Select pull mode for pin 4 */ + uint32_t PIN5 :2; /*!< Select pull mode for pin 5 */ + uint32_t PIN6 :2; /*!< Select pull mode for pin 6 */ + uint32_t PIN7 :2; /*!< Select pull mode for pin 7 */ + uint32_t PIN8 :2; /*!< Select pull mode for pin 8 */ + uint32_t PIN9 :2; /*!< Select pull mode for pin 9 */ + uint32_t PIN10 :2; /*!< Select pull mode for pin 10 */ + uint32_t PIN11 :2; /*!< Select pull mode for pin 11 */ + uint32_t PIN12 :2; /*!< Select pull mode for pin 12 */ + uint32_t PIN13 :2; /*!< Select pull mode for pin 13 */ + uint32_t PIN14 :2; /*!< Select pull mode for pin 14 */ + uint32_t PIN15 :2; /*!< Select pull mode for pin 15 */ +} _GPIO_PULLMODE_bits; + +/* Bit field positions: */ +#define GPIO_PULLMODE_PIN0_Pos 0 /*!< Select pull mode for pin 0 */ +#define GPIO_PULLMODE_PIN1_Pos 2 /*!< Select pull mode for pin 1 */ +#define GPIO_PULLMODE_PIN2_Pos 4 /*!< Select pull mode for pin 2 */ +#define GPIO_PULLMODE_PIN3_Pos 6 /*!< Select pull mode for pin 3 */ +#define GPIO_PULLMODE_PIN4_Pos 8 /*!< Select pull mode for pin 4 */ +#define GPIO_PULLMODE_PIN5_Pos 10 /*!< Select pull mode for pin 5 */ +#define GPIO_PULLMODE_PIN6_Pos 12 /*!< Select pull mode for pin 6 */ +#define GPIO_PULLMODE_PIN7_Pos 14 /*!< Select pull mode for pin 7 */ +#define GPIO_PULLMODE_PIN8_Pos 16 /*!< Select pull mode for pin 8 */ +#define GPIO_PULLMODE_PIN9_Pos 18 /*!< Select pull mode for pin 9 */ +#define GPIO_PULLMODE_PIN10_Pos 20 /*!< Select pull mode for pin 10 */ +#define GPIO_PULLMODE_PIN11_Pos 22 /*!< Select pull mode for pin 11 */ +#define GPIO_PULLMODE_PIN12_Pos 24 /*!< Select pull mode for pin 12 */ +#define GPIO_PULLMODE_PIN13_Pos 26 /*!< Select pull mode for pin 13 */ +#define GPIO_PULLMODE_PIN14_Pos 28 /*!< Select pull mode for pin 14 */ +#define GPIO_PULLMODE_PIN15_Pos 30 /*!< Select pull mode for pin 15 */ + +/* Bit field masks: */ +#define GPIO_PULLMODE_PIN0_Msk 0x00000003UL /*!< Select pull mode for pin 0 */ +#define GPIO_PULLMODE_PIN1_Msk 0x0000000CUL /*!< Select pull mode for pin 1 */ +#define GPIO_PULLMODE_PIN2_Msk 0x00000030UL /*!< Select pull mode for pin 2 */ +#define GPIO_PULLMODE_PIN3_Msk 0x000000C0UL /*!< Select pull mode for pin 3 */ +#define GPIO_PULLMODE_PIN4_Msk 0x00000300UL /*!< Select pull mode for pin 4 */ +#define GPIO_PULLMODE_PIN5_Msk 0x00000C00UL /*!< Select pull mode for pin 5 */ +#define GPIO_PULLMODE_PIN6_Msk 0x00003000UL /*!< Select pull mode for pin 6 */ +#define GPIO_PULLMODE_PIN7_Msk 0x0000C000UL /*!< Select pull mode for pin 7 */ +#define GPIO_PULLMODE_PIN8_Msk 0x00030000UL /*!< Select pull mode for pin 8 */ +#define GPIO_PULLMODE_PIN9_Msk 0x000C0000UL /*!< Select pull mode for pin 9 */ +#define GPIO_PULLMODE_PIN10_Msk 0x00300000UL /*!< Select pull mode for pin 10 */ +#define GPIO_PULLMODE_PIN11_Msk 0x00C00000UL /*!< Select pull mode for pin 11 */ +#define GPIO_PULLMODE_PIN12_Msk 0x03000000UL /*!< Select pull mode for pin 12 */ +#define GPIO_PULLMODE_PIN13_Msk 0x0C000000UL /*!< Select pull mode for pin 13 */ +#define GPIO_PULLMODE_PIN14_Msk 0x30000000UL /*!< Select pull mode for pin 14 */ +#define GPIO_PULLMODE_PIN15_Msk 0xC0000000UL /*!< Select pull mode for pin 15 */ + +/* Bit field enums: */ +typedef enum { + GPIO_PULLMODE_PIN0_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN0_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN0_Enum; + +typedef enum { + GPIO_PULLMODE_PIN1_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN1_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN1_Enum; + +typedef enum { + GPIO_PULLMODE_PIN2_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN2_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN2_Enum; + +typedef enum { + GPIO_PULLMODE_PIN3_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN3_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN3_Enum; + +typedef enum { + GPIO_PULLMODE_PIN4_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN4_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN4_Enum; + +typedef enum { + GPIO_PULLMODE_PIN5_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN5_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN5_Enum; + +typedef enum { + GPIO_PULLMODE_PIN6_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN6_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN6_Enum; + +typedef enum { + GPIO_PULLMODE_PIN7_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN7_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN7_Enum; + +typedef enum { + GPIO_PULLMODE_PIN8_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN8_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN8_Enum; + +typedef enum { + GPIO_PULLMODE_PIN9_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN9_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN9_Enum; + +typedef enum { + GPIO_PULLMODE_PIN10_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN10_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN10_Enum; + +typedef enum { + GPIO_PULLMODE_PIN11_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN11_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN11_Enum; + +typedef enum { + GPIO_PULLMODE_PIN12_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN12_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN12_Enum; + +typedef enum { + GPIO_PULLMODE_PIN13_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN13_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN13_Enum; + +typedef enum { + GPIO_PULLMODE_PIN14_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN14_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN14_Enum; + +typedef enum { + GPIO_PULLMODE_PIN15_Disable = 0x0UL, /*!< Pull disabled */ + GPIO_PULLMODE_PIN15_PU = 0x1UL, /*!< Pull-up */ +} GPIO_PULLMODE_PIN15_Enum; + +/*-- OUTMODE: Select output mode register --------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :2; /*!< Select output mode for pin 0 */ + uint32_t PIN1 :2; /*!< Select output mode for pin 1 */ + uint32_t PIN2 :2; /*!< Select output mode for pin 2 */ + uint32_t PIN3 :2; /*!< Select output mode for pin 3 */ + uint32_t PIN4 :2; /*!< Select output mode for pin 4 */ + uint32_t PIN5 :2; /*!< Select output mode for pin 5 */ + uint32_t PIN6 :2; /*!< Select output mode for pin 6 */ + uint32_t PIN7 :2; /*!< Select output mode for pin 7 */ + uint32_t PIN8 :2; /*!< Select output mode for pin 8 */ + uint32_t PIN9 :2; /*!< Select output mode for pin 9 */ + uint32_t PIN10 :2; /*!< Select output mode for pin 10 */ + uint32_t PIN11 :2; /*!< Select output mode for pin 11 */ + uint32_t PIN12 :2; /*!< Select output mode for pin 12 */ + uint32_t PIN13 :2; /*!< Select output mode for pin 13 */ + uint32_t PIN14 :2; /*!< Select output mode for pin 14 */ + uint32_t PIN15 :2; /*!< Select output mode for pin 15 */ +} _GPIO_OUTMODE_bits; + +/* Bit field positions: */ +#define GPIO_OUTMODE_PIN0_Pos 0 /*!< Select output mode for pin 0 */ +#define GPIO_OUTMODE_PIN1_Pos 2 /*!< Select output mode for pin 1 */ +#define GPIO_OUTMODE_PIN2_Pos 4 /*!< Select output mode for pin 2 */ +#define GPIO_OUTMODE_PIN3_Pos 6 /*!< Select output mode for pin 3 */ +#define GPIO_OUTMODE_PIN4_Pos 8 /*!< Select output mode for pin 4 */ +#define GPIO_OUTMODE_PIN5_Pos 10 /*!< Select output mode for pin 5 */ +#define GPIO_OUTMODE_PIN6_Pos 12 /*!< Select output mode for pin 6 */ +#define GPIO_OUTMODE_PIN7_Pos 14 /*!< Select output mode for pin 7 */ +#define GPIO_OUTMODE_PIN8_Pos 16 /*!< Select output mode for pin 8 */ +#define GPIO_OUTMODE_PIN9_Pos 18 /*!< Select output mode for pin 9 */ +#define GPIO_OUTMODE_PIN10_Pos 20 /*!< Select output mode for pin 10 */ +#define GPIO_OUTMODE_PIN11_Pos 22 /*!< Select output mode for pin 11 */ +#define GPIO_OUTMODE_PIN12_Pos 24 /*!< Select output mode for pin 12 */ +#define GPIO_OUTMODE_PIN13_Pos 26 /*!< Select output mode for pin 13 */ +#define GPIO_OUTMODE_PIN14_Pos 28 /*!< Select output mode for pin 14 */ +#define GPIO_OUTMODE_PIN15_Pos 30 /*!< Select output mode for pin 15 */ + +/* Bit field masks: */ +#define GPIO_OUTMODE_PIN0_Msk 0x00000003UL /*!< Select output mode for pin 0 */ +#define GPIO_OUTMODE_PIN1_Msk 0x0000000CUL /*!< Select output mode for pin 1 */ +#define GPIO_OUTMODE_PIN2_Msk 0x00000030UL /*!< Select output mode for pin 2 */ +#define GPIO_OUTMODE_PIN3_Msk 0x000000C0UL /*!< Select output mode for pin 3 */ +#define GPIO_OUTMODE_PIN4_Msk 0x00000300UL /*!< Select output mode for pin 4 */ +#define GPIO_OUTMODE_PIN5_Msk 0x00000C00UL /*!< Select output mode for pin 5 */ +#define GPIO_OUTMODE_PIN6_Msk 0x00003000UL /*!< Select output mode for pin 6 */ +#define GPIO_OUTMODE_PIN7_Msk 0x0000C000UL /*!< Select output mode for pin 7 */ +#define GPIO_OUTMODE_PIN8_Msk 0x00030000UL /*!< Select output mode for pin 8 */ +#define GPIO_OUTMODE_PIN9_Msk 0x000C0000UL /*!< Select output mode for pin 9 */ +#define GPIO_OUTMODE_PIN10_Msk 0x00300000UL /*!< Select output mode for pin 10 */ +#define GPIO_OUTMODE_PIN11_Msk 0x00C00000UL /*!< Select output mode for pin 11 */ +#define GPIO_OUTMODE_PIN12_Msk 0x03000000UL /*!< Select output mode for pin 12 */ +#define GPIO_OUTMODE_PIN13_Msk 0x0C000000UL /*!< Select output mode for pin 13 */ +#define GPIO_OUTMODE_PIN14_Msk 0x30000000UL /*!< Select output mode for pin 14 */ +#define GPIO_OUTMODE_PIN15_Msk 0xC0000000UL /*!< Select output mode for pin 15 */ + +/* Bit field enums: */ +typedef enum { + GPIO_OUTMODE_PIN0_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN0_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN0_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN0_Enum; + +typedef enum { + GPIO_OUTMODE_PIN1_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN1_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN1_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN1_Enum; + +typedef enum { + GPIO_OUTMODE_PIN2_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN2_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN2_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN2_Enum; + +typedef enum { + GPIO_OUTMODE_PIN3_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN3_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN3_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN3_Enum; + +typedef enum { + GPIO_OUTMODE_PIN4_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN4_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN4_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN4_Enum; + +typedef enum { + GPIO_OUTMODE_PIN5_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN5_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN5_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN5_Enum; + +typedef enum { + GPIO_OUTMODE_PIN6_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN6_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN6_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN6_Enum; + +typedef enum { + GPIO_OUTMODE_PIN7_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN7_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN7_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN7_Enum; + +typedef enum { + GPIO_OUTMODE_PIN8_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN8_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN8_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN8_Enum; + +typedef enum { + GPIO_OUTMODE_PIN9_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN9_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN9_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN9_Enum; + +typedef enum { + GPIO_OUTMODE_PIN10_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN10_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN10_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN10_Enum; + +typedef enum { + GPIO_OUTMODE_PIN11_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN11_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN11_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN11_Enum; + +typedef enum { + GPIO_OUTMODE_PIN12_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN12_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN12_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN12_Enum; + +typedef enum { + GPIO_OUTMODE_PIN13_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN13_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN13_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN13_Enum; + +typedef enum { + GPIO_OUTMODE_PIN14_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN14_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN14_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN14_Enum; + +typedef enum { + GPIO_OUTMODE_PIN15_PP = 0x0UL, /*!< Push-pull output */ + GPIO_OUTMODE_PIN15_OD = 0x1UL, /*!< Open drain output */ + GPIO_OUTMODE_PIN15_OS = 0x2UL, /*!< Open source output */ +} GPIO_OUTMODE_PIN15_Enum; + +/*-- DRIVEMODE: Select drive mode register -------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :2; /*!< Select drive mode for pin 0 */ + uint32_t PIN1 :2; /*!< Select drive mode for pin 1 */ + uint32_t PIN2 :2; /*!< Select drive mode for pin 2 */ + uint32_t PIN3 :2; /*!< Select drive mode for pin 3 */ + uint32_t PIN4 :2; /*!< Select drive mode for pin 4 */ + uint32_t PIN5 :2; /*!< Select drive mode for pin 5 */ + uint32_t PIN6 :2; /*!< Select drive mode for pin 6 */ + uint32_t PIN7 :2; /*!< Select drive mode for pin 7 */ + uint32_t PIN8 :2; /*!< Select drive mode for pin 8 */ + uint32_t PIN9 :2; /*!< Select drive mode for pin 9 */ + uint32_t PIN10 :2; /*!< Select drive mode for pin 10 */ + uint32_t PIN11 :2; /*!< Select drive mode for pin 11 */ + uint32_t PIN12 :2; /*!< Select drive mode for pin 12 */ + uint32_t PIN13 :2; /*!< Select drive mode for pin 13 */ + uint32_t PIN14 :2; /*!< Select drive mode for pin 14 */ + uint32_t PIN15 :2; /*!< Select drive mode for pin 15 */ +} _GPIO_DRIVEMODE_bits; + +/* Bit field positions: */ +#define GPIO_DRIVEMODE_PIN0_Pos 0 /*!< Select drive mode for pin 0 */ +#define GPIO_DRIVEMODE_PIN1_Pos 2 /*!< Select drive mode for pin 1 */ +#define GPIO_DRIVEMODE_PIN2_Pos 4 /*!< Select drive mode for pin 2 */ +#define GPIO_DRIVEMODE_PIN3_Pos 6 /*!< Select drive mode for pin 3 */ +#define GPIO_DRIVEMODE_PIN4_Pos 8 /*!< Select drive mode for pin 4 */ +#define GPIO_DRIVEMODE_PIN5_Pos 10 /*!< Select drive mode for pin 5 */ +#define GPIO_DRIVEMODE_PIN6_Pos 12 /*!< Select drive mode for pin 6 */ +#define GPIO_DRIVEMODE_PIN7_Pos 14 /*!< Select drive mode for pin 7 */ +#define GPIO_DRIVEMODE_PIN8_Pos 16 /*!< Select drive mode for pin 8 */ +#define GPIO_DRIVEMODE_PIN9_Pos 18 /*!< Select drive mode for pin 9 */ +#define GPIO_DRIVEMODE_PIN10_Pos 20 /*!< Select drive mode for pin 10 */ +#define GPIO_DRIVEMODE_PIN11_Pos 22 /*!< Select drive mode for pin 11 */ +#define GPIO_DRIVEMODE_PIN12_Pos 24 /*!< Select drive mode for pin 12 */ +#define GPIO_DRIVEMODE_PIN13_Pos 26 /*!< Select drive mode for pin 13 */ +#define GPIO_DRIVEMODE_PIN14_Pos 28 /*!< Select drive mode for pin 14 */ +#define GPIO_DRIVEMODE_PIN15_Pos 30 /*!< Select drive mode for pin 15 */ + +/* Bit field masks: */ +#define GPIO_DRIVEMODE_PIN0_Msk 0x00000003UL /*!< Select drive mode for pin 0 */ +#define GPIO_DRIVEMODE_PIN1_Msk 0x0000000CUL /*!< Select drive mode for pin 1 */ +#define GPIO_DRIVEMODE_PIN2_Msk 0x00000030UL /*!< Select drive mode for pin 2 */ +#define GPIO_DRIVEMODE_PIN3_Msk 0x000000C0UL /*!< Select drive mode for pin 3 */ +#define GPIO_DRIVEMODE_PIN4_Msk 0x00000300UL /*!< Select drive mode for pin 4 */ +#define GPIO_DRIVEMODE_PIN5_Msk 0x00000C00UL /*!< Select drive mode for pin 5 */ +#define GPIO_DRIVEMODE_PIN6_Msk 0x00003000UL /*!< Select drive mode for pin 6 */ +#define GPIO_DRIVEMODE_PIN7_Msk 0x0000C000UL /*!< Select drive mode for pin 7 */ +#define GPIO_DRIVEMODE_PIN8_Msk 0x00030000UL /*!< Select drive mode for pin 8 */ +#define GPIO_DRIVEMODE_PIN9_Msk 0x000C0000UL /*!< Select drive mode for pin 9 */ +#define GPIO_DRIVEMODE_PIN10_Msk 0x00300000UL /*!< Select drive mode for pin 10 */ +#define GPIO_DRIVEMODE_PIN11_Msk 0x00C00000UL /*!< Select drive mode for pin 11 */ +#define GPIO_DRIVEMODE_PIN12_Msk 0x03000000UL /*!< Select drive mode for pin 12 */ +#define GPIO_DRIVEMODE_PIN13_Msk 0x0C000000UL /*!< Select drive mode for pin 13 */ +#define GPIO_DRIVEMODE_PIN14_Msk 0x30000000UL /*!< Select drive mode for pin 14 */ +#define GPIO_DRIVEMODE_PIN15_Msk 0xC0000000UL /*!< Select drive mode for pin 15 */ + +/* Bit field enums: */ +typedef enum { + GPIO_DRIVEMODE_PIN0_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN0_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN0_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN1_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN1_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN1_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN2_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN2_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN2_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN3_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN3_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN3_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN4_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN4_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN4_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN5_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN5_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN5_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN6_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN6_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN6_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN7_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN7_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN7_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN8_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN8_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN8_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN9_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN9_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN9_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN10_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN10_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN10_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN11_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN11_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN11_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN12_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN12_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN12_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN13_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN13_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN13_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN14_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN14_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN14_Enum; + +typedef enum { + GPIO_DRIVEMODE_PIN15_HS = 0x0UL, /*!< High strength */ + GPIO_DRIVEMODE_PIN15_LS = 0x2UL, /*!< Low strength */ +} GPIO_DRIVEMODE_PIN15_Enum; + +/*-- OUTENSET: Output enable register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Output enable for pin 0 */ + uint32_t PIN1 :1; /*!< Output enable for pin 1 */ + uint32_t PIN2 :1; /*!< Output enable for pin 2 */ + uint32_t PIN3 :1; /*!< Output enable for pin 3 */ + uint32_t PIN4 :1; /*!< Output enable for pin 4 */ + uint32_t PIN5 :1; /*!< Output enable for pin 5 */ + uint32_t PIN6 :1; /*!< Output enable for pin 6 */ + uint32_t PIN7 :1; /*!< Output enable for pin 7 */ + uint32_t PIN8 :1; /*!< Output enable for pin 8 */ + uint32_t PIN9 :1; /*!< Output enable for pin 9 */ + uint32_t PIN10 :1; /*!< Output enable for pin 10 */ + uint32_t PIN11 :1; /*!< Output enable for pin 11 */ + uint32_t PIN12 :1; /*!< Output enable for pin 12 */ + uint32_t PIN13 :1; /*!< Output enable for pin 13 */ + uint32_t PIN14 :1; /*!< Output enable for pin 14 */ + uint32_t PIN15 :1; /*!< Output enable for pin 15 */ +} _GPIO_OUTENSET_bits; + +/* Bit field positions: */ +#define GPIO_OUTENSET_PIN0_Pos 0 /*!< Output enable for pin 0 */ +#define GPIO_OUTENSET_PIN1_Pos 1 /*!< Output enable for pin 1 */ +#define GPIO_OUTENSET_PIN2_Pos 2 /*!< Output enable for pin 2 */ +#define GPIO_OUTENSET_PIN3_Pos 3 /*!< Output enable for pin 3 */ +#define GPIO_OUTENSET_PIN4_Pos 4 /*!< Output enable for pin 4 */ +#define GPIO_OUTENSET_PIN5_Pos 5 /*!< Output enable for pin 5 */ +#define GPIO_OUTENSET_PIN6_Pos 6 /*!< Output enable for pin 6 */ +#define GPIO_OUTENSET_PIN7_Pos 7 /*!< Output enable for pin 7 */ +#define GPIO_OUTENSET_PIN8_Pos 8 /*!< Output enable for pin 8 */ +#define GPIO_OUTENSET_PIN9_Pos 9 /*!< Output enable for pin 9 */ +#define GPIO_OUTENSET_PIN10_Pos 10 /*!< Output enable for pin 10 */ +#define GPIO_OUTENSET_PIN11_Pos 11 /*!< Output enable for pin 11 */ +#define GPIO_OUTENSET_PIN12_Pos 12 /*!< Output enable for pin 12 */ +#define GPIO_OUTENSET_PIN13_Pos 13 /*!< Output enable for pin 13 */ +#define GPIO_OUTENSET_PIN14_Pos 14 /*!< Output enable for pin 14 */ +#define GPIO_OUTENSET_PIN15_Pos 15 /*!< Output enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_OUTENSET_PIN0_Msk 0x00000001UL /*!< Output enable for pin 0 */ +#define GPIO_OUTENSET_PIN1_Msk 0x00000002UL /*!< Output enable for pin 1 */ +#define GPIO_OUTENSET_PIN2_Msk 0x00000004UL /*!< Output enable for pin 2 */ +#define GPIO_OUTENSET_PIN3_Msk 0x00000008UL /*!< Output enable for pin 3 */ +#define GPIO_OUTENSET_PIN4_Msk 0x00000010UL /*!< Output enable for pin 4 */ +#define GPIO_OUTENSET_PIN5_Msk 0x00000020UL /*!< Output enable for pin 5 */ +#define GPIO_OUTENSET_PIN6_Msk 0x00000040UL /*!< Output enable for pin 6 */ +#define GPIO_OUTENSET_PIN7_Msk 0x00000080UL /*!< Output enable for pin 7 */ +#define GPIO_OUTENSET_PIN8_Msk 0x00000100UL /*!< Output enable for pin 8 */ +#define GPIO_OUTENSET_PIN9_Msk 0x00000200UL /*!< Output enable for pin 9 */ +#define GPIO_OUTENSET_PIN10_Msk 0x00000400UL /*!< Output enable for pin 10 */ +#define GPIO_OUTENSET_PIN11_Msk 0x00000800UL /*!< Output enable for pin 11 */ +#define GPIO_OUTENSET_PIN12_Msk 0x00001000UL /*!< Output enable for pin 12 */ +#define GPIO_OUTENSET_PIN13_Msk 0x00002000UL /*!< Output enable for pin 13 */ +#define GPIO_OUTENSET_PIN14_Msk 0x00004000UL /*!< Output enable for pin 14 */ +#define GPIO_OUTENSET_PIN15_Msk 0x00008000UL /*!< Output enable for pin 15 */ + +/*-- OUTENCLR: Output disable register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Output disable for pin 0 */ + uint32_t PIN1 :1; /*!< Output disable for pin 1 */ + uint32_t PIN2 :1; /*!< Output disable for pin 2 */ + uint32_t PIN3 :1; /*!< Output disable for pin 3 */ + uint32_t PIN4 :1; /*!< Output disable for pin 4 */ + uint32_t PIN5 :1; /*!< Output disable for pin 5 */ + uint32_t PIN6 :1; /*!< Output disable for pin 6 */ + uint32_t PIN7 :1; /*!< Output disable for pin 7 */ + uint32_t PIN8 :1; /*!< Output disable for pin 8 */ + uint32_t PIN9 :1; /*!< Output disable for pin 9 */ + uint32_t PIN10 :1; /*!< Output disable for pin 10 */ + uint32_t PIN11 :1; /*!< Output disable for pin 11 */ + uint32_t PIN12 :1; /*!< Output disable for pin 12 */ + uint32_t PIN13 :1; /*!< Output disable for pin 13 */ + uint32_t PIN14 :1; /*!< Output disable for pin 14 */ + uint32_t PIN15 :1; /*!< Output disable for pin 15 */ +} _GPIO_OUTENCLR_bits; + +/* Bit field positions: */ +#define GPIO_OUTENCLR_PIN0_Pos 0 /*!< Output disable for pin 0 */ +#define GPIO_OUTENCLR_PIN1_Pos 1 /*!< Output disable for pin 1 */ +#define GPIO_OUTENCLR_PIN2_Pos 2 /*!< Output disable for pin 2 */ +#define GPIO_OUTENCLR_PIN3_Pos 3 /*!< Output disable for pin 3 */ +#define GPIO_OUTENCLR_PIN4_Pos 4 /*!< Output disable for pin 4 */ +#define GPIO_OUTENCLR_PIN5_Pos 5 /*!< Output disable for pin 5 */ +#define GPIO_OUTENCLR_PIN6_Pos 6 /*!< Output disable for pin 6 */ +#define GPIO_OUTENCLR_PIN7_Pos 7 /*!< Output disable for pin 7 */ +#define GPIO_OUTENCLR_PIN8_Pos 8 /*!< Output disable for pin 8 */ +#define GPIO_OUTENCLR_PIN9_Pos 9 /*!< Output disable for pin 9 */ +#define GPIO_OUTENCLR_PIN10_Pos 10 /*!< Output disable for pin 10 */ +#define GPIO_OUTENCLR_PIN11_Pos 11 /*!< Output disable for pin 11 */ +#define GPIO_OUTENCLR_PIN12_Pos 12 /*!< Output disable for pin 12 */ +#define GPIO_OUTENCLR_PIN13_Pos 13 /*!< Output disable for pin 13 */ +#define GPIO_OUTENCLR_PIN14_Pos 14 /*!< Output disable for pin 14 */ +#define GPIO_OUTENCLR_PIN15_Pos 15 /*!< Output disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_OUTENCLR_PIN0_Msk 0x00000001UL /*!< Output disable for pin 0 */ +#define GPIO_OUTENCLR_PIN1_Msk 0x00000002UL /*!< Output disable for pin 1 */ +#define GPIO_OUTENCLR_PIN2_Msk 0x00000004UL /*!< Output disable for pin 2 */ +#define GPIO_OUTENCLR_PIN3_Msk 0x00000008UL /*!< Output disable for pin 3 */ +#define GPIO_OUTENCLR_PIN4_Msk 0x00000010UL /*!< Output disable for pin 4 */ +#define GPIO_OUTENCLR_PIN5_Msk 0x00000020UL /*!< Output disable for pin 5 */ +#define GPIO_OUTENCLR_PIN6_Msk 0x00000040UL /*!< Output disable for pin 6 */ +#define GPIO_OUTENCLR_PIN7_Msk 0x00000080UL /*!< Output disable for pin 7 */ +#define GPIO_OUTENCLR_PIN8_Msk 0x00000100UL /*!< Output disable for pin 8 */ +#define GPIO_OUTENCLR_PIN9_Msk 0x00000200UL /*!< Output disable for pin 9 */ +#define GPIO_OUTENCLR_PIN10_Msk 0x00000400UL /*!< Output disable for pin 10 */ +#define GPIO_OUTENCLR_PIN11_Msk 0x00000800UL /*!< Output disable for pin 11 */ +#define GPIO_OUTENCLR_PIN12_Msk 0x00001000UL /*!< Output disable for pin 12 */ +#define GPIO_OUTENCLR_PIN13_Msk 0x00002000UL /*!< Output disable for pin 13 */ +#define GPIO_OUTENCLR_PIN14_Msk 0x00004000UL /*!< Output disable for pin 14 */ +#define GPIO_OUTENCLR_PIN15_Msk 0x00008000UL /*!< Output disable for pin 15 */ + +/*-- ALTFUNCSET: Alternative function enable register --------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Alternative function enable for pin 0 */ + uint32_t PIN1 :1; /*!< Alternative function enable for pin 1 */ + uint32_t PIN2 :1; /*!< Alternative function enable for pin 2 */ + uint32_t PIN3 :1; /*!< Alternative function enable for pin 3 */ + uint32_t PIN4 :1; /*!< Alternative function enable for pin 4 */ + uint32_t PIN5 :1; /*!< Alternative function enable for pin 5 */ + uint32_t PIN6 :1; /*!< Alternative function enable for pin 6 */ + uint32_t PIN7 :1; /*!< Alternative function enable for pin 7 */ + uint32_t PIN8 :1; /*!< Alternative function enable for pin 8 */ + uint32_t PIN9 :1; /*!< Alternative function enable for pin 9 */ + uint32_t PIN10 :1; /*!< Alternative function enable for pin 10 */ + uint32_t PIN11 :1; /*!< Alternative function enable for pin 11 */ + uint32_t PIN12 :1; /*!< Alternative function enable for pin 12 */ + uint32_t PIN13 :1; /*!< Alternative function enable for pin 13 */ + uint32_t PIN14 :1; /*!< Alternative function enable for pin 14 */ + uint32_t PIN15 :1; /*!< Alternative function enable for pin 15 */ +} _GPIO_ALTFUNCSET_bits; + +/* Bit field positions: */ +#define GPIO_ALTFUNCSET_PIN0_Pos 0 /*!< Alternative function enable for pin 0 */ +#define GPIO_ALTFUNCSET_PIN1_Pos 1 /*!< Alternative function enable for pin 1 */ +#define GPIO_ALTFUNCSET_PIN2_Pos 2 /*!< Alternative function enable for pin 2 */ +#define GPIO_ALTFUNCSET_PIN3_Pos 3 /*!< Alternative function enable for pin 3 */ +#define GPIO_ALTFUNCSET_PIN4_Pos 4 /*!< Alternative function enable for pin 4 */ +#define GPIO_ALTFUNCSET_PIN5_Pos 5 /*!< Alternative function enable for pin 5 */ +#define GPIO_ALTFUNCSET_PIN6_Pos 6 /*!< Alternative function enable for pin 6 */ +#define GPIO_ALTFUNCSET_PIN7_Pos 7 /*!< Alternative function enable for pin 7 */ +#define GPIO_ALTFUNCSET_PIN8_Pos 8 /*!< Alternative function enable for pin 8 */ +#define GPIO_ALTFUNCSET_PIN9_Pos 9 /*!< Alternative function enable for pin 9 */ +#define GPIO_ALTFUNCSET_PIN10_Pos 10 /*!< Alternative function enable for pin 10 */ +#define GPIO_ALTFUNCSET_PIN11_Pos 11 /*!< Alternative function enable for pin 11 */ +#define GPIO_ALTFUNCSET_PIN12_Pos 12 /*!< Alternative function enable for pin 12 */ +#define GPIO_ALTFUNCSET_PIN13_Pos 13 /*!< Alternative function enable for pin 13 */ +#define GPIO_ALTFUNCSET_PIN14_Pos 14 /*!< Alternative function enable for pin 14 */ +#define GPIO_ALTFUNCSET_PIN15_Pos 15 /*!< Alternative function enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_ALTFUNCSET_PIN0_Msk 0x00000001UL /*!< Alternative function enable for pin 0 */ +#define GPIO_ALTFUNCSET_PIN1_Msk 0x00000002UL /*!< Alternative function enable for pin 1 */ +#define GPIO_ALTFUNCSET_PIN2_Msk 0x00000004UL /*!< Alternative function enable for pin 2 */ +#define GPIO_ALTFUNCSET_PIN3_Msk 0x00000008UL /*!< Alternative function enable for pin 3 */ +#define GPIO_ALTFUNCSET_PIN4_Msk 0x00000010UL /*!< Alternative function enable for pin 4 */ +#define GPIO_ALTFUNCSET_PIN5_Msk 0x00000020UL /*!< Alternative function enable for pin 5 */ +#define GPIO_ALTFUNCSET_PIN6_Msk 0x00000040UL /*!< Alternative function enable for pin 6 */ +#define GPIO_ALTFUNCSET_PIN7_Msk 0x00000080UL /*!< Alternative function enable for pin 7 */ +#define GPIO_ALTFUNCSET_PIN8_Msk 0x00000100UL /*!< Alternative function enable for pin 8 */ +#define GPIO_ALTFUNCSET_PIN9_Msk 0x00000200UL /*!< Alternative function enable for pin 9 */ +#define GPIO_ALTFUNCSET_PIN10_Msk 0x00000400UL /*!< Alternative function enable for pin 10 */ +#define GPIO_ALTFUNCSET_PIN11_Msk 0x00000800UL /*!< Alternative function enable for pin 11 */ +#define GPIO_ALTFUNCSET_PIN12_Msk 0x00001000UL /*!< Alternative function enable for pin 12 */ +#define GPIO_ALTFUNCSET_PIN13_Msk 0x00002000UL /*!< Alternative function enable for pin 13 */ +#define GPIO_ALTFUNCSET_PIN14_Msk 0x00004000UL /*!< Alternative function enable for pin 14 */ +#define GPIO_ALTFUNCSET_PIN15_Msk 0x00008000UL /*!< Alternative function enable for pin 15 */ + +/*-- ALTFUNCCLR: Alternative function disable register -------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Alternative function disable for pin 0 */ + uint32_t PIN1 :1; /*!< Alternative function disable for pin 1 */ + uint32_t PIN2 :1; /*!< Alternative function disable for pin 2 */ + uint32_t PIN3 :1; /*!< Alternative function disable for pin 3 */ + uint32_t PIN4 :1; /*!< Alternative function disable for pin 4 */ + uint32_t PIN5 :1; /*!< Alternative function disable for pin 5 */ + uint32_t PIN6 :1; /*!< Alternative function disable for pin 6 */ + uint32_t PIN7 :1; /*!< Alternative function disable for pin 7 */ + uint32_t PIN8 :1; /*!< Alternative function disable for pin 8 */ + uint32_t PIN9 :1; /*!< Alternative function disable for pin 9 */ + uint32_t PIN10 :1; /*!< Alternative function disable for pin 10 */ + uint32_t PIN11 :1; /*!< Alternative function disable for pin 11 */ + uint32_t PIN12 :1; /*!< Alternative function disable for pin 12 */ + uint32_t PIN13 :1; /*!< Alternative function disable for pin 13 */ + uint32_t PIN14 :1; /*!< Alternative function disable for pin 14 */ + uint32_t PIN15 :1; /*!< Alternative function disable for pin 15 */ +} _GPIO_ALTFUNCCLR_bits; + +/* Bit field positions: */ +#define GPIO_ALTFUNCCLR_PIN0_Pos 0 /*!< Alternative function disable for pin 0 */ +#define GPIO_ALTFUNCCLR_PIN1_Pos 1 /*!< Alternative function disable for pin 1 */ +#define GPIO_ALTFUNCCLR_PIN2_Pos 2 /*!< Alternative function disable for pin 2 */ +#define GPIO_ALTFUNCCLR_PIN3_Pos 3 /*!< Alternative function disable for pin 3 */ +#define GPIO_ALTFUNCCLR_PIN4_Pos 4 /*!< Alternative function disable for pin 4 */ +#define GPIO_ALTFUNCCLR_PIN5_Pos 5 /*!< Alternative function disable for pin 5 */ +#define GPIO_ALTFUNCCLR_PIN6_Pos 6 /*!< Alternative function disable for pin 6 */ +#define GPIO_ALTFUNCCLR_PIN7_Pos 7 /*!< Alternative function disable for pin 7 */ +#define GPIO_ALTFUNCCLR_PIN8_Pos 8 /*!< Alternative function disable for pin 8 */ +#define GPIO_ALTFUNCCLR_PIN9_Pos 9 /*!< Alternative function disable for pin 9 */ +#define GPIO_ALTFUNCCLR_PIN10_Pos 10 /*!< Alternative function disable for pin 10 */ +#define GPIO_ALTFUNCCLR_PIN11_Pos 11 /*!< Alternative function disable for pin 11 */ +#define GPIO_ALTFUNCCLR_PIN12_Pos 12 /*!< Alternative function disable for pin 12 */ +#define GPIO_ALTFUNCCLR_PIN13_Pos 13 /*!< Alternative function disable for pin 13 */ +#define GPIO_ALTFUNCCLR_PIN14_Pos 14 /*!< Alternative function disable for pin 14 */ +#define GPIO_ALTFUNCCLR_PIN15_Pos 15 /*!< Alternative function disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_ALTFUNCCLR_PIN0_Msk 0x00000001UL /*!< Alternative function disable for pin 0 */ +#define GPIO_ALTFUNCCLR_PIN1_Msk 0x00000002UL /*!< Alternative function disable for pin 1 */ +#define GPIO_ALTFUNCCLR_PIN2_Msk 0x00000004UL /*!< Alternative function disable for pin 2 */ +#define GPIO_ALTFUNCCLR_PIN3_Msk 0x00000008UL /*!< Alternative function disable for pin 3 */ +#define GPIO_ALTFUNCCLR_PIN4_Msk 0x00000010UL /*!< Alternative function disable for pin 4 */ +#define GPIO_ALTFUNCCLR_PIN5_Msk 0x00000020UL /*!< Alternative function disable for pin 5 */ +#define GPIO_ALTFUNCCLR_PIN6_Msk 0x00000040UL /*!< Alternative function disable for pin 6 */ +#define GPIO_ALTFUNCCLR_PIN7_Msk 0x00000080UL /*!< Alternative function disable for pin 7 */ +#define GPIO_ALTFUNCCLR_PIN8_Msk 0x00000100UL /*!< Alternative function disable for pin 8 */ +#define GPIO_ALTFUNCCLR_PIN9_Msk 0x00000200UL /*!< Alternative function disable for pin 9 */ +#define GPIO_ALTFUNCCLR_PIN10_Msk 0x00000400UL /*!< Alternative function disable for pin 10 */ +#define GPIO_ALTFUNCCLR_PIN11_Msk 0x00000800UL /*!< Alternative function disable for pin 11 */ +#define GPIO_ALTFUNCCLR_PIN12_Msk 0x00001000UL /*!< Alternative function disable for pin 12 */ +#define GPIO_ALTFUNCCLR_PIN13_Msk 0x00002000UL /*!< Alternative function disable for pin 13 */ +#define GPIO_ALTFUNCCLR_PIN14_Msk 0x00004000UL /*!< Alternative function disable for pin 14 */ +#define GPIO_ALTFUNCCLR_PIN15_Msk 0x00008000UL /*!< Alternative function disable for pin 15 */ + +/*-- ALTFUNCNUM0: Alternative function number register -------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :4; /*!< Select altfunc number for pin 0 */ + uint32_t PIN1 :4; /*!< Select altfunc number for pin 1 */ + uint32_t PIN2 :4; /*!< Select altfunc number for pin 2 */ + uint32_t PIN3 :4; /*!< Select altfunc number for pin 3 */ + uint32_t PIN4 :4; /*!< Select altfunc number for pin 4 */ + uint32_t PIN5 :4; /*!< Select altfunc number for pin 5 */ + uint32_t PIN6 :4; /*!< Select altfunc number for pin 6 */ + uint32_t PIN7 :4; /*!< Select altfunc number for pin 7 */ +} _GPIO_ALTFUNCNUM0_bits; + +/* Bit field positions: */ +#define GPIO_ALTFUNCNUM0_PIN0_Pos 0 /*!< Select altfunc number for pin 0 */ +#define GPIO_ALTFUNCNUM0_PIN1_Pos 4 /*!< Select altfunc number for pin 1 */ +#define GPIO_ALTFUNCNUM0_PIN2_Pos 8 /*!< Select altfunc number for pin 2 */ +#define GPIO_ALTFUNCNUM0_PIN3_Pos 12 /*!< Select altfunc number for pin 3 */ +#define GPIO_ALTFUNCNUM0_PIN4_Pos 16 /*!< Select altfunc number for pin 4 */ +#define GPIO_ALTFUNCNUM0_PIN5_Pos 20 /*!< Select altfunc number for pin 5 */ +#define GPIO_ALTFUNCNUM0_PIN6_Pos 24 /*!< Select altfunc number for pin 6 */ +#define GPIO_ALTFUNCNUM0_PIN7_Pos 28 /*!< Select altfunc number for pin 7 */ + +/* Bit field masks: */ +#define GPIO_ALTFUNCNUM0_PIN0_Msk 0x0000000FUL /*!< Select altfunc number for pin 0 */ +#define GPIO_ALTFUNCNUM0_PIN1_Msk 0x000000F0UL /*!< Select altfunc number for pin 1 */ +#define GPIO_ALTFUNCNUM0_PIN2_Msk 0x00000F00UL /*!< Select altfunc number for pin 2 */ +#define GPIO_ALTFUNCNUM0_PIN3_Msk 0x0000F000UL /*!< Select altfunc number for pin 3 */ +#define GPIO_ALTFUNCNUM0_PIN4_Msk 0x000F0000UL /*!< Select altfunc number for pin 4 */ +#define GPIO_ALTFUNCNUM0_PIN5_Msk 0x00F00000UL /*!< Select altfunc number for pin 5 */ +#define GPIO_ALTFUNCNUM0_PIN6_Msk 0x0F000000UL /*!< Select altfunc number for pin 6 */ +#define GPIO_ALTFUNCNUM0_PIN7_Msk 0xF0000000UL /*!< Select altfunc number for pin 7 */ + +/* Bit field enums: */ +typedef enum { + GPIO_ALTFUNCNUM0_PIN0_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN0_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN0_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN0_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN0_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN0_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN1_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN1_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN1_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN1_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN1_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN1_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN2_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN2_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN2_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN2_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN2_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN2_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN3_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN3_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN3_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN3_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN3_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN3_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN4_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN4_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN4_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN4_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN4_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN4_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN5_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN5_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN5_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN5_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN5_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN5_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN6_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN6_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN6_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN6_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN6_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN6_Enum; + +typedef enum { + GPIO_ALTFUNCNUM0_PIN7_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM0_PIN7_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM0_PIN7_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM0_PIN7_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM0_PIN7_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM0_PIN7_Enum; + +/*-- ALTFUNCNUM1: Alternative function number register -------------------------------------------------------*/ +typedef struct { + uint32_t PIN8 :4; /*!< Select altfunc number for pin 8 */ + uint32_t PIN9 :4; /*!< Select altfunc number for pin 9 */ + uint32_t PIN10 :4; /*!< Select altfunc number for pin 10 */ + uint32_t PIN11 :4; /*!< Select altfunc number for pin 11 */ + uint32_t PIN12 :4; /*!< Select altfunc number for pin 12 */ + uint32_t PIN13 :4; /*!< Select altfunc number for pin 13 */ + uint32_t PIN14 :4; /*!< Select altfunc number for pin 14 */ + uint32_t PIN15 :4; /*!< Select altfunc number for pin 15 */ +} _GPIO_ALTFUNCNUM1_bits; + +/* Bit field positions: */ +#define GPIO_ALTFUNCNUM1_PIN8_Pos 0 /*!< Select altfunc number for pin 8 */ +#define GPIO_ALTFUNCNUM1_PIN9_Pos 4 /*!< Select altfunc number for pin 9 */ +#define GPIO_ALTFUNCNUM1_PIN10_Pos 8 /*!< Select altfunc number for pin 10 */ +#define GPIO_ALTFUNCNUM1_PIN11_Pos 12 /*!< Select altfunc number for pin 11 */ +#define GPIO_ALTFUNCNUM1_PIN12_Pos 16 /*!< Select altfunc number for pin 12 */ +#define GPIO_ALTFUNCNUM1_PIN13_Pos 20 /*!< Select altfunc number for pin 13 */ +#define GPIO_ALTFUNCNUM1_PIN14_Pos 24 /*!< Select altfunc number for pin 14 */ +#define GPIO_ALTFUNCNUM1_PIN15_Pos 28 /*!< Select altfunc number for pin 15 */ + +/* Bit field masks: */ +#define GPIO_ALTFUNCNUM1_PIN8_Msk 0x0000000FUL /*!< Select altfunc number for pin 8 */ +#define GPIO_ALTFUNCNUM1_PIN9_Msk 0x000000F0UL /*!< Select altfunc number for pin 9 */ +#define GPIO_ALTFUNCNUM1_PIN10_Msk 0x00000F00UL /*!< Select altfunc number for pin 10 */ +#define GPIO_ALTFUNCNUM1_PIN11_Msk 0x0000F000UL /*!< Select altfunc number for pin 11 */ +#define GPIO_ALTFUNCNUM1_PIN12_Msk 0x000F0000UL /*!< Select altfunc number for pin 12 */ +#define GPIO_ALTFUNCNUM1_PIN13_Msk 0x00F00000UL /*!< Select altfunc number for pin 13 */ +#define GPIO_ALTFUNCNUM1_PIN14_Msk 0x0F000000UL /*!< Select altfunc number for pin 14 */ +#define GPIO_ALTFUNCNUM1_PIN15_Msk 0xF0000000UL /*!< Select altfunc number for pin 15 */ + +/* Bit field enums: */ +typedef enum { + GPIO_ALTFUNCNUM1_PIN8_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN8_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN8_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN8_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN8_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN8_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN9_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN9_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN9_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN9_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN9_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN9_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN10_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN10_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN10_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN10_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN10_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN10_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN11_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN11_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN11_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN11_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN11_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN11_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN12_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN12_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN12_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN12_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN12_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN12_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN13_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN13_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN13_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN13_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN13_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN13_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN14_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN14_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN14_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN14_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN14_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN14_Enum; + +typedef enum { + GPIO_ALTFUNCNUM1_PIN15_Disable = 0x0UL, /*!< Altfunc disabled */ + GPIO_ALTFUNCNUM1_PIN15_AF1 = 0x1UL, /*!< Altfunc 1 enable */ + GPIO_ALTFUNCNUM1_PIN15_AF2 = 0x2UL, /*!< Altfunc 2 enable */ + GPIO_ALTFUNCNUM1_PIN15_AF3 = 0x3UL, /*!< Altfunc 3 enable */ + GPIO_ALTFUNCNUM1_PIN15_AF4 = 0x4UL, /*!< Altfunc 4 enable */ +} GPIO_ALTFUNCNUM1_PIN15_Enum; + +/*-- SYNCSET: Additional double flip-flop syncronization enable register -------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 0 */ + uint32_t PIN1 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 1 */ + uint32_t PIN2 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 2 */ + uint32_t PIN3 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 3 */ + uint32_t PIN4 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 4 */ + uint32_t PIN5 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 5 */ + uint32_t PIN6 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 6 */ + uint32_t PIN7 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 7 */ + uint32_t PIN8 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 8 */ + uint32_t PIN9 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 9 */ + uint32_t PIN10 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 10 */ + uint32_t PIN11 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 11 */ + uint32_t PIN12 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 12 */ + uint32_t PIN13 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 13 */ + uint32_t PIN14 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 14 */ + uint32_t PIN15 :1; /*!< Additional double flip-flop syncronization buffer enable for pin 15 */ +} _GPIO_SYNCSET_bits; + +/* Bit field positions: */ +#define GPIO_SYNCSET_PIN0_Pos 0 /*!< Additional double flip-flop syncronization buffer enable for pin 0 */ +#define GPIO_SYNCSET_PIN1_Pos 1 /*!< Additional double flip-flop syncronization buffer enable for pin 1 */ +#define GPIO_SYNCSET_PIN2_Pos 2 /*!< Additional double flip-flop syncronization buffer enable for pin 2 */ +#define GPIO_SYNCSET_PIN3_Pos 3 /*!< Additional double flip-flop syncronization buffer enable for pin 3 */ +#define GPIO_SYNCSET_PIN4_Pos 4 /*!< Additional double flip-flop syncronization buffer enable for pin 4 */ +#define GPIO_SYNCSET_PIN5_Pos 5 /*!< Additional double flip-flop syncronization buffer enable for pin 5 */ +#define GPIO_SYNCSET_PIN6_Pos 6 /*!< Additional double flip-flop syncronization buffer enable for pin 6 */ +#define GPIO_SYNCSET_PIN7_Pos 7 /*!< Additional double flip-flop syncronization buffer enable for pin 7 */ +#define GPIO_SYNCSET_PIN8_Pos 8 /*!< Additional double flip-flop syncronization buffer enable for pin 8 */ +#define GPIO_SYNCSET_PIN9_Pos 9 /*!< Additional double flip-flop syncronization buffer enable for pin 9 */ +#define GPIO_SYNCSET_PIN10_Pos 10 /*!< Additional double flip-flop syncronization buffer enable for pin 10 */ +#define GPIO_SYNCSET_PIN11_Pos 11 /*!< Additional double flip-flop syncronization buffer enable for pin 11 */ +#define GPIO_SYNCSET_PIN12_Pos 12 /*!< Additional double flip-flop syncronization buffer enable for pin 12 */ +#define GPIO_SYNCSET_PIN13_Pos 13 /*!< Additional double flip-flop syncronization buffer enable for pin 13 */ +#define GPIO_SYNCSET_PIN14_Pos 14 /*!< Additional double flip-flop syncronization buffer enable for pin 14 */ +#define GPIO_SYNCSET_PIN15_Pos 15 /*!< Additional double flip-flop syncronization buffer enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_SYNCSET_PIN0_Msk 0x00000001UL /*!< Additional double flip-flop syncronization buffer enable for pin 0 */ +#define GPIO_SYNCSET_PIN1_Msk 0x00000002UL /*!< Additional double flip-flop syncronization buffer enable for pin 1 */ +#define GPIO_SYNCSET_PIN2_Msk 0x00000004UL /*!< Additional double flip-flop syncronization buffer enable for pin 2 */ +#define GPIO_SYNCSET_PIN3_Msk 0x00000008UL /*!< Additional double flip-flop syncronization buffer enable for pin 3 */ +#define GPIO_SYNCSET_PIN4_Msk 0x00000010UL /*!< Additional double flip-flop syncronization buffer enable for pin 4 */ +#define GPIO_SYNCSET_PIN5_Msk 0x00000020UL /*!< Additional double flip-flop syncronization buffer enable for pin 5 */ +#define GPIO_SYNCSET_PIN6_Msk 0x00000040UL /*!< Additional double flip-flop syncronization buffer enable for pin 6 */ +#define GPIO_SYNCSET_PIN7_Msk 0x00000080UL /*!< Additional double flip-flop syncronization buffer enable for pin 7 */ +#define GPIO_SYNCSET_PIN8_Msk 0x00000100UL /*!< Additional double flip-flop syncronization buffer enable for pin 8 */ +#define GPIO_SYNCSET_PIN9_Msk 0x00000200UL /*!< Additional double flip-flop syncronization buffer enable for pin 9 */ +#define GPIO_SYNCSET_PIN10_Msk 0x00000400UL /*!< Additional double flip-flop syncronization buffer enable for pin 10 */ +#define GPIO_SYNCSET_PIN11_Msk 0x00000800UL /*!< Additional double flip-flop syncronization buffer enable for pin 11 */ +#define GPIO_SYNCSET_PIN12_Msk 0x00001000UL /*!< Additional double flip-flop syncronization buffer enable for pin 12 */ +#define GPIO_SYNCSET_PIN13_Msk 0x00002000UL /*!< Additional double flip-flop syncronization buffer enable for pin 13 */ +#define GPIO_SYNCSET_PIN14_Msk 0x00004000UL /*!< Additional double flip-flop syncronization buffer enable for pin 14 */ +#define GPIO_SYNCSET_PIN15_Msk 0x00008000UL /*!< Additional double flip-flop syncronization buffer enable for pin 15 */ + +/*-- SYNCCLR: Additional double flip-flop syncronization disable register ------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Additional double flip-flop syncronization disable for pin 0 */ + uint32_t PIN1 :1; /*!< Additional double flip-flop syncronization disable for pin 1 */ + uint32_t PIN2 :1; /*!< Additional double flip-flop syncronization disable for pin 2 */ + uint32_t PIN3 :1; /*!< Additional double flip-flop syncronization disable for pin 3 */ + uint32_t PIN4 :1; /*!< Additional double flip-flop syncronization disable for pin 4 */ + uint32_t PIN5 :1; /*!< Additional double flip-flop syncronization disable for pin 5 */ + uint32_t PIN6 :1; /*!< Additional double flip-flop syncronization disable for pin 6 */ + uint32_t PIN7 :1; /*!< Additional double flip-flop syncronization disable for pin 7 */ + uint32_t PIN8 :1; /*!< Additional double flip-flop syncronization disable for pin 8 */ + uint32_t PIN9 :1; /*!< Additional double flip-flop syncronization disable for pin 9 */ + uint32_t PIN10 :1; /*!< Additional double flip-flop syncronization disable for pin 10 */ + uint32_t PIN11 :1; /*!< Additional double flip-flop syncronization disable for pin 11 */ + uint32_t PIN12 :1; /*!< Additional double flip-flop syncronization disable for pin 12 */ + uint32_t PIN13 :1; /*!< Additional double flip-flop syncronization disable for pin 13 */ + uint32_t PIN14 :1; /*!< Additional double flip-flop syncronization disable for pin 14 */ + uint32_t PIN15 :1; /*!< Additional double flip-flop syncronization disable for pin 15 */ +} _GPIO_SYNCCLR_bits; + +/* Bit field positions: */ +#define GPIO_SYNCCLR_PIN0_Pos 0 /*!< Additional double flip-flop syncronization disable for pin 0 */ +#define GPIO_SYNCCLR_PIN1_Pos 1 /*!< Additional double flip-flop syncronization disable for pin 1 */ +#define GPIO_SYNCCLR_PIN2_Pos 2 /*!< Additional double flip-flop syncronization disable for pin 2 */ +#define GPIO_SYNCCLR_PIN3_Pos 3 /*!< Additional double flip-flop syncronization disable for pin 3 */ +#define GPIO_SYNCCLR_PIN4_Pos 4 /*!< Additional double flip-flop syncronization disable for pin 4 */ +#define GPIO_SYNCCLR_PIN5_Pos 5 /*!< Additional double flip-flop syncronization disable for pin 5 */ +#define GPIO_SYNCCLR_PIN6_Pos 6 /*!< Additional double flip-flop syncronization disable for pin 6 */ +#define GPIO_SYNCCLR_PIN7_Pos 7 /*!< Additional double flip-flop syncronization disable for pin 7 */ +#define GPIO_SYNCCLR_PIN8_Pos 8 /*!< Additional double flip-flop syncronization disable for pin 8 */ +#define GPIO_SYNCCLR_PIN9_Pos 9 /*!< Additional double flip-flop syncronization disable for pin 9 */ +#define GPIO_SYNCCLR_PIN10_Pos 10 /*!< Additional double flip-flop syncronization disable for pin 10 */ +#define GPIO_SYNCCLR_PIN11_Pos 11 /*!< Additional double flip-flop syncronization disable for pin 11 */ +#define GPIO_SYNCCLR_PIN12_Pos 12 /*!< Additional double flip-flop syncronization disable for pin 12 */ +#define GPIO_SYNCCLR_PIN13_Pos 13 /*!< Additional double flip-flop syncronization disable for pin 13 */ +#define GPIO_SYNCCLR_PIN14_Pos 14 /*!< Additional double flip-flop syncronization disable for pin 14 */ +#define GPIO_SYNCCLR_PIN15_Pos 15 /*!< Additional double flip-flop syncronization disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_SYNCCLR_PIN0_Msk 0x00000001UL /*!< Additional double flip-flop syncronization disable for pin 0 */ +#define GPIO_SYNCCLR_PIN1_Msk 0x00000002UL /*!< Additional double flip-flop syncronization disable for pin 1 */ +#define GPIO_SYNCCLR_PIN2_Msk 0x00000004UL /*!< Additional double flip-flop syncronization disable for pin 2 */ +#define GPIO_SYNCCLR_PIN3_Msk 0x00000008UL /*!< Additional double flip-flop syncronization disable for pin 3 */ +#define GPIO_SYNCCLR_PIN4_Msk 0x00000010UL /*!< Additional double flip-flop syncronization disable for pin 4 */ +#define GPIO_SYNCCLR_PIN5_Msk 0x00000020UL /*!< Additional double flip-flop syncronization disable for pin 5 */ +#define GPIO_SYNCCLR_PIN6_Msk 0x00000040UL /*!< Additional double flip-flop syncronization disable for pin 6 */ +#define GPIO_SYNCCLR_PIN7_Msk 0x00000080UL /*!< Additional double flip-flop syncronization disable for pin 7 */ +#define GPIO_SYNCCLR_PIN8_Msk 0x00000100UL /*!< Additional double flip-flop syncronization disable for pin 8 */ +#define GPIO_SYNCCLR_PIN9_Msk 0x00000200UL /*!< Additional double flip-flop syncronization disable for pin 9 */ +#define GPIO_SYNCCLR_PIN10_Msk 0x00000400UL /*!< Additional double flip-flop syncronization disable for pin 10 */ +#define GPIO_SYNCCLR_PIN11_Msk 0x00000800UL /*!< Additional double flip-flop syncronization disable for pin 11 */ +#define GPIO_SYNCCLR_PIN12_Msk 0x00001000UL /*!< Additional double flip-flop syncronization disable for pin 12 */ +#define GPIO_SYNCCLR_PIN13_Msk 0x00002000UL /*!< Additional double flip-flop syncronization disable for pin 13 */ +#define GPIO_SYNCCLR_PIN14_Msk 0x00004000UL /*!< Additional double flip-flop syncronization disable for pin 14 */ +#define GPIO_SYNCCLR_PIN15_Msk 0x00008000UL /*!< Additional double flip-flop syncronization disable for pin 15 */ + +/*-- QUALSET: Qualifier enable register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Qualifier enable for pin 0 */ + uint32_t PIN1 :1; /*!< Qualifier enable for pin 1 */ + uint32_t PIN2 :1; /*!< Qualifier enable for pin 2 */ + uint32_t PIN3 :1; /*!< Qualifier enable for pin 3 */ + uint32_t PIN4 :1; /*!< Qualifier enable for pin 4 */ + uint32_t PIN5 :1; /*!< Qualifier enable for pin 5 */ + uint32_t PIN6 :1; /*!< Qualifier enable for pin 6 */ + uint32_t PIN7 :1; /*!< Qualifier enable for pin 7 */ + uint32_t PIN8 :1; /*!< Qualifier enable for pin 8 */ + uint32_t PIN9 :1; /*!< Qualifier enable for pin 9 */ + uint32_t PIN10 :1; /*!< Qualifier enable for pin 10 */ + uint32_t PIN11 :1; /*!< Qualifier enable for pin 11 */ + uint32_t PIN12 :1; /*!< Qualifier enable for pin 12 */ + uint32_t PIN13 :1; /*!< Qualifier enable for pin 13 */ + uint32_t PIN14 :1; /*!< Qualifier enable for pin 14 */ + uint32_t PIN15 :1; /*!< Qualifier enable for pin 15 */ +} _GPIO_QUALSET_bits; + +/* Bit field positions: */ +#define GPIO_QUALSET_PIN0_Pos 0 /*!< Qualifier enable for pin 0 */ +#define GPIO_QUALSET_PIN1_Pos 1 /*!< Qualifier enable for pin 1 */ +#define GPIO_QUALSET_PIN2_Pos 2 /*!< Qualifier enable for pin 2 */ +#define GPIO_QUALSET_PIN3_Pos 3 /*!< Qualifier enable for pin 3 */ +#define GPIO_QUALSET_PIN4_Pos 4 /*!< Qualifier enable for pin 4 */ +#define GPIO_QUALSET_PIN5_Pos 5 /*!< Qualifier enable for pin 5 */ +#define GPIO_QUALSET_PIN6_Pos 6 /*!< Qualifier enable for pin 6 */ +#define GPIO_QUALSET_PIN7_Pos 7 /*!< Qualifier enable for pin 7 */ +#define GPIO_QUALSET_PIN8_Pos 8 /*!< Qualifier enable for pin 8 */ +#define GPIO_QUALSET_PIN9_Pos 9 /*!< Qualifier enable for pin 9 */ +#define GPIO_QUALSET_PIN10_Pos 10 /*!< Qualifier enable for pin 10 */ +#define GPIO_QUALSET_PIN11_Pos 11 /*!< Qualifier enable for pin 11 */ +#define GPIO_QUALSET_PIN12_Pos 12 /*!< Qualifier enable for pin 12 */ +#define GPIO_QUALSET_PIN13_Pos 13 /*!< Qualifier enable for pin 13 */ +#define GPIO_QUALSET_PIN14_Pos 14 /*!< Qualifier enable for pin 14 */ +#define GPIO_QUALSET_PIN15_Pos 15 /*!< Qualifier enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_QUALSET_PIN0_Msk 0x00000001UL /*!< Qualifier enable for pin 0 */ +#define GPIO_QUALSET_PIN1_Msk 0x00000002UL /*!< Qualifier enable for pin 1 */ +#define GPIO_QUALSET_PIN2_Msk 0x00000004UL /*!< Qualifier enable for pin 2 */ +#define GPIO_QUALSET_PIN3_Msk 0x00000008UL /*!< Qualifier enable for pin 3 */ +#define GPIO_QUALSET_PIN4_Msk 0x00000010UL /*!< Qualifier enable for pin 4 */ +#define GPIO_QUALSET_PIN5_Msk 0x00000020UL /*!< Qualifier enable for pin 5 */ +#define GPIO_QUALSET_PIN6_Msk 0x00000040UL /*!< Qualifier enable for pin 6 */ +#define GPIO_QUALSET_PIN7_Msk 0x00000080UL /*!< Qualifier enable for pin 7 */ +#define GPIO_QUALSET_PIN8_Msk 0x00000100UL /*!< Qualifier enable for pin 8 */ +#define GPIO_QUALSET_PIN9_Msk 0x00000200UL /*!< Qualifier enable for pin 9 */ +#define GPIO_QUALSET_PIN10_Msk 0x00000400UL /*!< Qualifier enable for pin 10 */ +#define GPIO_QUALSET_PIN11_Msk 0x00000800UL /*!< Qualifier enable for pin 11 */ +#define GPIO_QUALSET_PIN12_Msk 0x00001000UL /*!< Qualifier enable for pin 12 */ +#define GPIO_QUALSET_PIN13_Msk 0x00002000UL /*!< Qualifier enable for pin 13 */ +#define GPIO_QUALSET_PIN14_Msk 0x00004000UL /*!< Qualifier enable for pin 14 */ +#define GPIO_QUALSET_PIN15_Msk 0x00008000UL /*!< Qualifier enable for pin 15 */ + +/*-- QUALCLR: Qualifier disable register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Qualifier disable for pin 0 */ + uint32_t PIN1 :1; /*!< Qualifier disable for pin 1 */ + uint32_t PIN2 :1; /*!< Qualifier disable for pin 2 */ + uint32_t PIN3 :1; /*!< Qualifier disable for pin 3 */ + uint32_t PIN4 :1; /*!< Qualifier disable for pin 4 */ + uint32_t PIN5 :1; /*!< Qualifier disable for pin 5 */ + uint32_t PIN6 :1; /*!< Qualifier disable for pin 6 */ + uint32_t PIN7 :1; /*!< Qualifier disable for pin 7 */ + uint32_t PIN8 :1; /*!< Qualifier disable for pin 8 */ + uint32_t PIN9 :1; /*!< Qualifier disable for pin 9 */ + uint32_t PIN10 :1; /*!< Qualifier disable for pin 10 */ + uint32_t PIN11 :1; /*!< Qualifier disable for pin 11 */ + uint32_t PIN12 :1; /*!< Qualifier disable for pin 12 */ + uint32_t PIN13 :1; /*!< Qualifier disable for pin 13 */ + uint32_t PIN14 :1; /*!< Qualifier disable for pin 14 */ + uint32_t PIN15 :1; /*!< Qualifier disable for pin 15 */ +} _GPIO_QUALCLR_bits; + +/* Bit field positions: */ +#define GPIO_QUALCLR_PIN0_Pos 0 /*!< Qualifier disable for pin 0 */ +#define GPIO_QUALCLR_PIN1_Pos 1 /*!< Qualifier disable for pin 1 */ +#define GPIO_QUALCLR_PIN2_Pos 2 /*!< Qualifier disable for pin 2 */ +#define GPIO_QUALCLR_PIN3_Pos 3 /*!< Qualifier disable for pin 3 */ +#define GPIO_QUALCLR_PIN4_Pos 4 /*!< Qualifier disable for pin 4 */ +#define GPIO_QUALCLR_PIN5_Pos 5 /*!< Qualifier disable for pin 5 */ +#define GPIO_QUALCLR_PIN6_Pos 6 /*!< Qualifier disable for pin 6 */ +#define GPIO_QUALCLR_PIN7_Pos 7 /*!< Qualifier disable for pin 7 */ +#define GPIO_QUALCLR_PIN8_Pos 8 /*!< Qualifier disable for pin 8 */ +#define GPIO_QUALCLR_PIN9_Pos 9 /*!< Qualifier disable for pin 9 */ +#define GPIO_QUALCLR_PIN10_Pos 10 /*!< Qualifier disable for pin 10 */ +#define GPIO_QUALCLR_PIN11_Pos 11 /*!< Qualifier disable for pin 11 */ +#define GPIO_QUALCLR_PIN12_Pos 12 /*!< Qualifier disable for pin 12 */ +#define GPIO_QUALCLR_PIN13_Pos 13 /*!< Qualifier disable for pin 13 */ +#define GPIO_QUALCLR_PIN14_Pos 14 /*!< Qualifier disable for pin 14 */ +#define GPIO_QUALCLR_PIN15_Pos 15 /*!< Qualifier disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_QUALCLR_PIN0_Msk 0x00000001UL /*!< Qualifier disable for pin 0 */ +#define GPIO_QUALCLR_PIN1_Msk 0x00000002UL /*!< Qualifier disable for pin 1 */ +#define GPIO_QUALCLR_PIN2_Msk 0x00000004UL /*!< Qualifier disable for pin 2 */ +#define GPIO_QUALCLR_PIN3_Msk 0x00000008UL /*!< Qualifier disable for pin 3 */ +#define GPIO_QUALCLR_PIN4_Msk 0x00000010UL /*!< Qualifier disable for pin 4 */ +#define GPIO_QUALCLR_PIN5_Msk 0x00000020UL /*!< Qualifier disable for pin 5 */ +#define GPIO_QUALCLR_PIN6_Msk 0x00000040UL /*!< Qualifier disable for pin 6 */ +#define GPIO_QUALCLR_PIN7_Msk 0x00000080UL /*!< Qualifier disable for pin 7 */ +#define GPIO_QUALCLR_PIN8_Msk 0x00000100UL /*!< Qualifier disable for pin 8 */ +#define GPIO_QUALCLR_PIN9_Msk 0x00000200UL /*!< Qualifier disable for pin 9 */ +#define GPIO_QUALCLR_PIN10_Msk 0x00000400UL /*!< Qualifier disable for pin 10 */ +#define GPIO_QUALCLR_PIN11_Msk 0x00000800UL /*!< Qualifier disable for pin 11 */ +#define GPIO_QUALCLR_PIN12_Msk 0x00001000UL /*!< Qualifier disable for pin 12 */ +#define GPIO_QUALCLR_PIN13_Msk 0x00002000UL /*!< Qualifier disable for pin 13 */ +#define GPIO_QUALCLR_PIN14_Msk 0x00004000UL /*!< Qualifier disable for pin 14 */ +#define GPIO_QUALCLR_PIN15_Msk 0x00008000UL /*!< Qualifier disable for pin 15 */ + +/*-- QUALMODESET: Qualifier mode set register ----------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Qualifier mode set for pin 0 */ + uint32_t PIN1 :1; /*!< Qualifier mode set for pin 1 */ + uint32_t PIN2 :1; /*!< Qualifier mode set for pin 2 */ + uint32_t PIN3 :1; /*!< Qualifier mode set for pin 3 */ + uint32_t PIN4 :1; /*!< Qualifier mode set for pin 4 */ + uint32_t PIN5 :1; /*!< Qualifier mode set for pin 5 */ + uint32_t PIN6 :1; /*!< Qualifier mode set for pin 6 */ + uint32_t PIN7 :1; /*!< Qualifier mode set for pin 7 */ + uint32_t PIN8 :1; /*!< Qualifier mode set for pin 8 */ + uint32_t PIN9 :1; /*!< Qualifier mode set for pin 9 */ + uint32_t PIN10 :1; /*!< Qualifier mode set for pin 10 */ + uint32_t PIN11 :1; /*!< Qualifier mode set for pin 11 */ + uint32_t PIN12 :1; /*!< Qualifier mode set for pin 12 */ + uint32_t PIN13 :1; /*!< Qualifier mode set for pin 13 */ + uint32_t PIN14 :1; /*!< Qualifier mode set for pin 14 */ + uint32_t PIN15 :1; /*!< Qualifier mode set for pin 15 */ +} _GPIO_QUALMODESET_bits; + +/* Bit field positions: */ +#define GPIO_QUALMODESET_PIN0_Pos 0 /*!< Qualifier mode set for pin 0 */ +#define GPIO_QUALMODESET_PIN1_Pos 1 /*!< Qualifier mode set for pin 1 */ +#define GPIO_QUALMODESET_PIN2_Pos 2 /*!< Qualifier mode set for pin 2 */ +#define GPIO_QUALMODESET_PIN3_Pos 3 /*!< Qualifier mode set for pin 3 */ +#define GPIO_QUALMODESET_PIN4_Pos 4 /*!< Qualifier mode set for pin 4 */ +#define GPIO_QUALMODESET_PIN5_Pos 5 /*!< Qualifier mode set for pin 5 */ +#define GPIO_QUALMODESET_PIN6_Pos 6 /*!< Qualifier mode set for pin 6 */ +#define GPIO_QUALMODESET_PIN7_Pos 7 /*!< Qualifier mode set for pin 7 */ +#define GPIO_QUALMODESET_PIN8_Pos 8 /*!< Qualifier mode set for pin 8 */ +#define GPIO_QUALMODESET_PIN9_Pos 9 /*!< Qualifier mode set for pin 9 */ +#define GPIO_QUALMODESET_PIN10_Pos 10 /*!< Qualifier mode set for pin 10 */ +#define GPIO_QUALMODESET_PIN11_Pos 11 /*!< Qualifier mode set for pin 11 */ +#define GPIO_QUALMODESET_PIN12_Pos 12 /*!< Qualifier mode set for pin 12 */ +#define GPIO_QUALMODESET_PIN13_Pos 13 /*!< Qualifier mode set for pin 13 */ +#define GPIO_QUALMODESET_PIN14_Pos 14 /*!< Qualifier mode set for pin 14 */ +#define GPIO_QUALMODESET_PIN15_Pos 15 /*!< Qualifier mode set for pin 15 */ + +/* Bit field masks: */ +#define GPIO_QUALMODESET_PIN0_Msk 0x00000001UL /*!< Qualifier mode set for pin 0 */ +#define GPIO_QUALMODESET_PIN1_Msk 0x00000002UL /*!< Qualifier mode set for pin 1 */ +#define GPIO_QUALMODESET_PIN2_Msk 0x00000004UL /*!< Qualifier mode set for pin 2 */ +#define GPIO_QUALMODESET_PIN3_Msk 0x00000008UL /*!< Qualifier mode set for pin 3 */ +#define GPIO_QUALMODESET_PIN4_Msk 0x00000010UL /*!< Qualifier mode set for pin 4 */ +#define GPIO_QUALMODESET_PIN5_Msk 0x00000020UL /*!< Qualifier mode set for pin 5 */ +#define GPIO_QUALMODESET_PIN6_Msk 0x00000040UL /*!< Qualifier mode set for pin 6 */ +#define GPIO_QUALMODESET_PIN7_Msk 0x00000080UL /*!< Qualifier mode set for pin 7 */ +#define GPIO_QUALMODESET_PIN8_Msk 0x00000100UL /*!< Qualifier mode set for pin 8 */ +#define GPIO_QUALMODESET_PIN9_Msk 0x00000200UL /*!< Qualifier mode set for pin 9 */ +#define GPIO_QUALMODESET_PIN10_Msk 0x00000400UL /*!< Qualifier mode set for pin 10 */ +#define GPIO_QUALMODESET_PIN11_Msk 0x00000800UL /*!< Qualifier mode set for pin 11 */ +#define GPIO_QUALMODESET_PIN12_Msk 0x00001000UL /*!< Qualifier mode set for pin 12 */ +#define GPIO_QUALMODESET_PIN13_Msk 0x00002000UL /*!< Qualifier mode set for pin 13 */ +#define GPIO_QUALMODESET_PIN14_Msk 0x00004000UL /*!< Qualifier mode set for pin 14 */ +#define GPIO_QUALMODESET_PIN15_Msk 0x00008000UL /*!< Qualifier mode set for pin 15 */ + +/*-- QUALMODECLR: Qualifier mode clear register --------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Qualifier mode clear for pin 0 */ + uint32_t PIN1 :1; /*!< Qualifier mode clear for pin 1 */ + uint32_t PIN2 :1; /*!< Qualifier mode clear for pin 2 */ + uint32_t PIN3 :1; /*!< Qualifier mode clear for pin 3 */ + uint32_t PIN4 :1; /*!< Qualifier mode clear for pin 4 */ + uint32_t PIN5 :1; /*!< Qualifier mode clear for pin 5 */ + uint32_t PIN6 :1; /*!< Qualifier mode clear for pin 6 */ + uint32_t PIN7 :1; /*!< Qualifier mode clear for pin 7 */ + uint32_t PIN8 :1; /*!< Qualifier mode clear for pin 8 */ + uint32_t PIN9 :1; /*!< Qualifier mode clear for pin 9 */ + uint32_t PIN10 :1; /*!< Qualifier mode clear for pin 10 */ + uint32_t PIN11 :1; /*!< Qualifier mode clear for pin 11 */ + uint32_t PIN12 :1; /*!< Qualifier mode clear for pin 12 */ + uint32_t PIN13 :1; /*!< Qualifier mode clear for pin 13 */ + uint32_t PIN14 :1; /*!< Qualifier mode clear for pin 14 */ + uint32_t PIN15 :1; /*!< Qualifier mode clear for pin 15 */ +} _GPIO_QUALMODECLR_bits; + +/* Bit field positions: */ +#define GPIO_QUALMODECLR_PIN0_Pos 0 /*!< Qualifier mode clear for pin 0 */ +#define GPIO_QUALMODECLR_PIN1_Pos 1 /*!< Qualifier mode clear for pin 1 */ +#define GPIO_QUALMODECLR_PIN2_Pos 2 /*!< Qualifier mode clear for pin 2 */ +#define GPIO_QUALMODECLR_PIN3_Pos 3 /*!< Qualifier mode clear for pin 3 */ +#define GPIO_QUALMODECLR_PIN4_Pos 4 /*!< Qualifier mode clear for pin 4 */ +#define GPIO_QUALMODECLR_PIN5_Pos 5 /*!< Qualifier mode clear for pin 5 */ +#define GPIO_QUALMODECLR_PIN6_Pos 6 /*!< Qualifier mode clear for pin 6 */ +#define GPIO_QUALMODECLR_PIN7_Pos 7 /*!< Qualifier mode clear for pin 7 */ +#define GPIO_QUALMODECLR_PIN8_Pos 8 /*!< Qualifier mode clear for pin 8 */ +#define GPIO_QUALMODECLR_PIN9_Pos 9 /*!< Qualifier mode clear for pin 9 */ +#define GPIO_QUALMODECLR_PIN10_Pos 10 /*!< Qualifier mode clear for pin 10 */ +#define GPIO_QUALMODECLR_PIN11_Pos 11 /*!< Qualifier mode clear for pin 11 */ +#define GPIO_QUALMODECLR_PIN12_Pos 12 /*!< Qualifier mode clear for pin 12 */ +#define GPIO_QUALMODECLR_PIN13_Pos 13 /*!< Qualifier mode clear for pin 13 */ +#define GPIO_QUALMODECLR_PIN14_Pos 14 /*!< Qualifier mode clear for pin 14 */ +#define GPIO_QUALMODECLR_PIN15_Pos 15 /*!< Qualifier mode clear for pin 15 */ + +/* Bit field masks: */ +#define GPIO_QUALMODECLR_PIN0_Msk 0x00000001UL /*!< Qualifier mode clear for pin 0 */ +#define GPIO_QUALMODECLR_PIN1_Msk 0x00000002UL /*!< Qualifier mode clear for pin 1 */ +#define GPIO_QUALMODECLR_PIN2_Msk 0x00000004UL /*!< Qualifier mode clear for pin 2 */ +#define GPIO_QUALMODECLR_PIN3_Msk 0x00000008UL /*!< Qualifier mode clear for pin 3 */ +#define GPIO_QUALMODECLR_PIN4_Msk 0x00000010UL /*!< Qualifier mode clear for pin 4 */ +#define GPIO_QUALMODECLR_PIN5_Msk 0x00000020UL /*!< Qualifier mode clear for pin 5 */ +#define GPIO_QUALMODECLR_PIN6_Msk 0x00000040UL /*!< Qualifier mode clear for pin 6 */ +#define GPIO_QUALMODECLR_PIN7_Msk 0x00000080UL /*!< Qualifier mode clear for pin 7 */ +#define GPIO_QUALMODECLR_PIN8_Msk 0x00000100UL /*!< Qualifier mode clear for pin 8 */ +#define GPIO_QUALMODECLR_PIN9_Msk 0x00000200UL /*!< Qualifier mode clear for pin 9 */ +#define GPIO_QUALMODECLR_PIN10_Msk 0x00000400UL /*!< Qualifier mode clear for pin 10 */ +#define GPIO_QUALMODECLR_PIN11_Msk 0x00000800UL /*!< Qualifier mode clear for pin 11 */ +#define GPIO_QUALMODECLR_PIN12_Msk 0x00001000UL /*!< Qualifier mode clear for pin 12 */ +#define GPIO_QUALMODECLR_PIN13_Msk 0x00002000UL /*!< Qualifier mode clear for pin 13 */ +#define GPIO_QUALMODECLR_PIN14_Msk 0x00004000UL /*!< Qualifier mode clear for pin 14 */ +#define GPIO_QUALMODECLR_PIN15_Msk 0x00008000UL /*!< Qualifier mode clear for pin 15 */ + +/*-- QUALSAMPLE: Qualifier sample period register ------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :20; /*!< Qualifier sample period */ +} _GPIO_QUALSAMPLE_bits; + +/* Bit field positions: */ +#define GPIO_QUALSAMPLE_VAL_Pos 0 /*!< Qualifier sample period */ + +/* Bit field masks: */ +#define GPIO_QUALSAMPLE_VAL_Msk 0x000FFFFFUL /*!< Qualifier sample period */ + +/*-- INTENSET: Interrupt enable register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt enable for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt enable for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt enable for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt enable for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt enable for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt enable for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt enable for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt enable for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt enable for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt enable for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt enable for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt enable for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt enable for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt enable for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt enable for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt enable for pin 15 */ +} _GPIO_INTENSET_bits; + +/* Bit field positions: */ +#define GPIO_INTENSET_PIN0_Pos 0 /*!< Interrupt enable for pin 0 */ +#define GPIO_INTENSET_PIN1_Pos 1 /*!< Interrupt enable for pin 1 */ +#define GPIO_INTENSET_PIN2_Pos 2 /*!< Interrupt enable for pin 2 */ +#define GPIO_INTENSET_PIN3_Pos 3 /*!< Interrupt enable for pin 3 */ +#define GPIO_INTENSET_PIN4_Pos 4 /*!< Interrupt enable for pin 4 */ +#define GPIO_INTENSET_PIN5_Pos 5 /*!< Interrupt enable for pin 5 */ +#define GPIO_INTENSET_PIN6_Pos 6 /*!< Interrupt enable for pin 6 */ +#define GPIO_INTENSET_PIN7_Pos 7 /*!< Interrupt enable for pin 7 */ +#define GPIO_INTENSET_PIN8_Pos 8 /*!< Interrupt enable for pin 8 */ +#define GPIO_INTENSET_PIN9_Pos 9 /*!< Interrupt enable for pin 9 */ +#define GPIO_INTENSET_PIN10_Pos 10 /*!< Interrupt enable for pin 10 */ +#define GPIO_INTENSET_PIN11_Pos 11 /*!< Interrupt enable for pin 11 */ +#define GPIO_INTENSET_PIN12_Pos 12 /*!< Interrupt enable for pin 12 */ +#define GPIO_INTENSET_PIN13_Pos 13 /*!< Interrupt enable for pin 13 */ +#define GPIO_INTENSET_PIN14_Pos 14 /*!< Interrupt enable for pin 14 */ +#define GPIO_INTENSET_PIN15_Pos 15 /*!< Interrupt enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTENSET_PIN0_Msk 0x00000001UL /*!< Interrupt enable for pin 0 */ +#define GPIO_INTENSET_PIN1_Msk 0x00000002UL /*!< Interrupt enable for pin 1 */ +#define GPIO_INTENSET_PIN2_Msk 0x00000004UL /*!< Interrupt enable for pin 2 */ +#define GPIO_INTENSET_PIN3_Msk 0x00000008UL /*!< Interrupt enable for pin 3 */ +#define GPIO_INTENSET_PIN4_Msk 0x00000010UL /*!< Interrupt enable for pin 4 */ +#define GPIO_INTENSET_PIN5_Msk 0x00000020UL /*!< Interrupt enable for pin 5 */ +#define GPIO_INTENSET_PIN6_Msk 0x00000040UL /*!< Interrupt enable for pin 6 */ +#define GPIO_INTENSET_PIN7_Msk 0x00000080UL /*!< Interrupt enable for pin 7 */ +#define GPIO_INTENSET_PIN8_Msk 0x00000100UL /*!< Interrupt enable for pin 8 */ +#define GPIO_INTENSET_PIN9_Msk 0x00000200UL /*!< Interrupt enable for pin 9 */ +#define GPIO_INTENSET_PIN10_Msk 0x00000400UL /*!< Interrupt enable for pin 10 */ +#define GPIO_INTENSET_PIN11_Msk 0x00000800UL /*!< Interrupt enable for pin 11 */ +#define GPIO_INTENSET_PIN12_Msk 0x00001000UL /*!< Interrupt enable for pin 12 */ +#define GPIO_INTENSET_PIN13_Msk 0x00002000UL /*!< Interrupt enable for pin 13 */ +#define GPIO_INTENSET_PIN14_Msk 0x00004000UL /*!< Interrupt enable for pin 14 */ +#define GPIO_INTENSET_PIN15_Msk 0x00008000UL /*!< Interrupt enable for pin 15 */ + +/*-- INTENCLR: Interrupt disable register --------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt disable for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt disable for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt disable for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt disable for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt disable for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt disable for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt disable for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt disable for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt disable for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt disable for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt disable for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt disable for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt disable for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt disable for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt disable for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt disable for pin 15 */ +} _GPIO_INTENCLR_bits; + +/* Bit field positions: */ +#define GPIO_INTENCLR_PIN0_Pos 0 /*!< Interrupt disable for pin 0 */ +#define GPIO_INTENCLR_PIN1_Pos 1 /*!< Interrupt disable for pin 1 */ +#define GPIO_INTENCLR_PIN2_Pos 2 /*!< Interrupt disable for pin 2 */ +#define GPIO_INTENCLR_PIN3_Pos 3 /*!< Interrupt disable for pin 3 */ +#define GPIO_INTENCLR_PIN4_Pos 4 /*!< Interrupt disable for pin 4 */ +#define GPIO_INTENCLR_PIN5_Pos 5 /*!< Interrupt disable for pin 5 */ +#define GPIO_INTENCLR_PIN6_Pos 6 /*!< Interrupt disable for pin 6 */ +#define GPIO_INTENCLR_PIN7_Pos 7 /*!< Interrupt disable for pin 7 */ +#define GPIO_INTENCLR_PIN8_Pos 8 /*!< Interrupt disable for pin 8 */ +#define GPIO_INTENCLR_PIN9_Pos 9 /*!< Interrupt disable for pin 9 */ +#define GPIO_INTENCLR_PIN10_Pos 10 /*!< Interrupt disable for pin 10 */ +#define GPIO_INTENCLR_PIN11_Pos 11 /*!< Interrupt disable for pin 11 */ +#define GPIO_INTENCLR_PIN12_Pos 12 /*!< Interrupt disable for pin 12 */ +#define GPIO_INTENCLR_PIN13_Pos 13 /*!< Interrupt disable for pin 13 */ +#define GPIO_INTENCLR_PIN14_Pos 14 /*!< Interrupt disable for pin 14 */ +#define GPIO_INTENCLR_PIN15_Pos 15 /*!< Interrupt disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTENCLR_PIN0_Msk 0x00000001UL /*!< Interrupt disable for pin 0 */ +#define GPIO_INTENCLR_PIN1_Msk 0x00000002UL /*!< Interrupt disable for pin 1 */ +#define GPIO_INTENCLR_PIN2_Msk 0x00000004UL /*!< Interrupt disable for pin 2 */ +#define GPIO_INTENCLR_PIN3_Msk 0x00000008UL /*!< Interrupt disable for pin 3 */ +#define GPIO_INTENCLR_PIN4_Msk 0x00000010UL /*!< Interrupt disable for pin 4 */ +#define GPIO_INTENCLR_PIN5_Msk 0x00000020UL /*!< Interrupt disable for pin 5 */ +#define GPIO_INTENCLR_PIN6_Msk 0x00000040UL /*!< Interrupt disable for pin 6 */ +#define GPIO_INTENCLR_PIN7_Msk 0x00000080UL /*!< Interrupt disable for pin 7 */ +#define GPIO_INTENCLR_PIN8_Msk 0x00000100UL /*!< Interrupt disable for pin 8 */ +#define GPIO_INTENCLR_PIN9_Msk 0x00000200UL /*!< Interrupt disable for pin 9 */ +#define GPIO_INTENCLR_PIN10_Msk 0x00000400UL /*!< Interrupt disable for pin 10 */ +#define GPIO_INTENCLR_PIN11_Msk 0x00000800UL /*!< Interrupt disable for pin 11 */ +#define GPIO_INTENCLR_PIN12_Msk 0x00001000UL /*!< Interrupt disable for pin 12 */ +#define GPIO_INTENCLR_PIN13_Msk 0x00002000UL /*!< Interrupt disable for pin 13 */ +#define GPIO_INTENCLR_PIN14_Msk 0x00004000UL /*!< Interrupt disable for pin 14 */ +#define GPIO_INTENCLR_PIN15_Msk 0x00008000UL /*!< Interrupt disable for pin 15 */ + +/*-- INTTYPESET: Interrupt type set register -----------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt type set for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt type set for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt type set for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt type set for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt type set for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt type set for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt type set for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt type set for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt type set for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt type set for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt type set for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt type set for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt type set for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt type set for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt type set for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt type set for pin 15 */ +} _GPIO_INTTYPESET_bits; + +/* Bit field positions: */ +#define GPIO_INTTYPESET_PIN0_Pos 0 /*!< Interrupt type set for pin 0 */ +#define GPIO_INTTYPESET_PIN1_Pos 1 /*!< Interrupt type set for pin 1 */ +#define GPIO_INTTYPESET_PIN2_Pos 2 /*!< Interrupt type set for pin 2 */ +#define GPIO_INTTYPESET_PIN3_Pos 3 /*!< Interrupt type set for pin 3 */ +#define GPIO_INTTYPESET_PIN4_Pos 4 /*!< Interrupt type set for pin 4 */ +#define GPIO_INTTYPESET_PIN5_Pos 5 /*!< Interrupt type set for pin 5 */ +#define GPIO_INTTYPESET_PIN6_Pos 6 /*!< Interrupt type set for pin 6 */ +#define GPIO_INTTYPESET_PIN7_Pos 7 /*!< Interrupt type set for pin 7 */ +#define GPIO_INTTYPESET_PIN8_Pos 8 /*!< Interrupt type set for pin 8 */ +#define GPIO_INTTYPESET_PIN9_Pos 9 /*!< Interrupt type set for pin 9 */ +#define GPIO_INTTYPESET_PIN10_Pos 10 /*!< Interrupt type set for pin 10 */ +#define GPIO_INTTYPESET_PIN11_Pos 11 /*!< Interrupt type set for pin 11 */ +#define GPIO_INTTYPESET_PIN12_Pos 12 /*!< Interrupt type set for pin 12 */ +#define GPIO_INTTYPESET_PIN13_Pos 13 /*!< Interrupt type set for pin 13 */ +#define GPIO_INTTYPESET_PIN14_Pos 14 /*!< Interrupt type set for pin 14 */ +#define GPIO_INTTYPESET_PIN15_Pos 15 /*!< Interrupt type set for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTTYPESET_PIN0_Msk 0x00000001UL /*!< Interrupt type set for pin 0 */ +#define GPIO_INTTYPESET_PIN1_Msk 0x00000002UL /*!< Interrupt type set for pin 1 */ +#define GPIO_INTTYPESET_PIN2_Msk 0x00000004UL /*!< Interrupt type set for pin 2 */ +#define GPIO_INTTYPESET_PIN3_Msk 0x00000008UL /*!< Interrupt type set for pin 3 */ +#define GPIO_INTTYPESET_PIN4_Msk 0x00000010UL /*!< Interrupt type set for pin 4 */ +#define GPIO_INTTYPESET_PIN5_Msk 0x00000020UL /*!< Interrupt type set for pin 5 */ +#define GPIO_INTTYPESET_PIN6_Msk 0x00000040UL /*!< Interrupt type set for pin 6 */ +#define GPIO_INTTYPESET_PIN7_Msk 0x00000080UL /*!< Interrupt type set for pin 7 */ +#define GPIO_INTTYPESET_PIN8_Msk 0x00000100UL /*!< Interrupt type set for pin 8 */ +#define GPIO_INTTYPESET_PIN9_Msk 0x00000200UL /*!< Interrupt type set for pin 9 */ +#define GPIO_INTTYPESET_PIN10_Msk 0x00000400UL /*!< Interrupt type set for pin 10 */ +#define GPIO_INTTYPESET_PIN11_Msk 0x00000800UL /*!< Interrupt type set for pin 11 */ +#define GPIO_INTTYPESET_PIN12_Msk 0x00001000UL /*!< Interrupt type set for pin 12 */ +#define GPIO_INTTYPESET_PIN13_Msk 0x00002000UL /*!< Interrupt type set for pin 13 */ +#define GPIO_INTTYPESET_PIN14_Msk 0x00004000UL /*!< Interrupt type set for pin 14 */ +#define GPIO_INTTYPESET_PIN15_Msk 0x00008000UL /*!< Interrupt type set for pin 15 */ + +/*-- INTTYPECLR: Interrupt type clear register ---------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt type clear for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt type clear for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt type clear for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt type clear for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt type clear for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt type clear for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt type clear for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt type clear for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt type clear for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt type clear for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt type clear for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt type clear for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt type clear for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt type clear for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt type clear for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt type clear for pin 15 */ +} _GPIO_INTTYPECLR_bits; + +/* Bit field positions: */ +#define GPIO_INTTYPECLR_PIN0_Pos 0 /*!< Interrupt type clear for pin 0 */ +#define GPIO_INTTYPECLR_PIN1_Pos 1 /*!< Interrupt type clear for pin 1 */ +#define GPIO_INTTYPECLR_PIN2_Pos 2 /*!< Interrupt type clear for pin 2 */ +#define GPIO_INTTYPECLR_PIN3_Pos 3 /*!< Interrupt type clear for pin 3 */ +#define GPIO_INTTYPECLR_PIN4_Pos 4 /*!< Interrupt type clear for pin 4 */ +#define GPIO_INTTYPECLR_PIN5_Pos 5 /*!< Interrupt type clear for pin 5 */ +#define GPIO_INTTYPECLR_PIN6_Pos 6 /*!< Interrupt type clear for pin 6 */ +#define GPIO_INTTYPECLR_PIN7_Pos 7 /*!< Interrupt type clear for pin 7 */ +#define GPIO_INTTYPECLR_PIN8_Pos 8 /*!< Interrupt type clear for pin 8 */ +#define GPIO_INTTYPECLR_PIN9_Pos 9 /*!< Interrupt type clear for pin 9 */ +#define GPIO_INTTYPECLR_PIN10_Pos 10 /*!< Interrupt type clear for pin 10 */ +#define GPIO_INTTYPECLR_PIN11_Pos 11 /*!< Interrupt type clear for pin 11 */ +#define GPIO_INTTYPECLR_PIN12_Pos 12 /*!< Interrupt type clear for pin 12 */ +#define GPIO_INTTYPECLR_PIN13_Pos 13 /*!< Interrupt type clear for pin 13 */ +#define GPIO_INTTYPECLR_PIN14_Pos 14 /*!< Interrupt type clear for pin 14 */ +#define GPIO_INTTYPECLR_PIN15_Pos 15 /*!< Interrupt type clear for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTTYPECLR_PIN0_Msk 0x00000001UL /*!< Interrupt type clear for pin 0 */ +#define GPIO_INTTYPECLR_PIN1_Msk 0x00000002UL /*!< Interrupt type clear for pin 1 */ +#define GPIO_INTTYPECLR_PIN2_Msk 0x00000004UL /*!< Interrupt type clear for pin 2 */ +#define GPIO_INTTYPECLR_PIN3_Msk 0x00000008UL /*!< Interrupt type clear for pin 3 */ +#define GPIO_INTTYPECLR_PIN4_Msk 0x00000010UL /*!< Interrupt type clear for pin 4 */ +#define GPIO_INTTYPECLR_PIN5_Msk 0x00000020UL /*!< Interrupt type clear for pin 5 */ +#define GPIO_INTTYPECLR_PIN6_Msk 0x00000040UL /*!< Interrupt type clear for pin 6 */ +#define GPIO_INTTYPECLR_PIN7_Msk 0x00000080UL /*!< Interrupt type clear for pin 7 */ +#define GPIO_INTTYPECLR_PIN8_Msk 0x00000100UL /*!< Interrupt type clear for pin 8 */ +#define GPIO_INTTYPECLR_PIN9_Msk 0x00000200UL /*!< Interrupt type clear for pin 9 */ +#define GPIO_INTTYPECLR_PIN10_Msk 0x00000400UL /*!< Interrupt type clear for pin 10 */ +#define GPIO_INTTYPECLR_PIN11_Msk 0x00000800UL /*!< Interrupt type clear for pin 11 */ +#define GPIO_INTTYPECLR_PIN12_Msk 0x00001000UL /*!< Interrupt type clear for pin 12 */ +#define GPIO_INTTYPECLR_PIN13_Msk 0x00002000UL /*!< Interrupt type clear for pin 13 */ +#define GPIO_INTTYPECLR_PIN14_Msk 0x00004000UL /*!< Interrupt type clear for pin 14 */ +#define GPIO_INTTYPECLR_PIN15_Msk 0x00008000UL /*!< Interrupt type clear for pin 15 */ + +/*-- INTPOLSET: Interrupt polarity set register --------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt polarity set for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt polarity set for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt polarity set for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt polarity set for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt polarity set for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt polarity set for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt polarity set for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt polarity set for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt polarity set for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt polarity set for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt polarity set for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt polarity set for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt polarity set for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt polarity set for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt polarity set for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt polarity set for pin 15 */ +} _GPIO_INTPOLSET_bits; + +/* Bit field positions: */ +#define GPIO_INTPOLSET_PIN0_Pos 0 /*!< Interrupt polarity set for pin 0 */ +#define GPIO_INTPOLSET_PIN1_Pos 1 /*!< Interrupt polarity set for pin 1 */ +#define GPIO_INTPOLSET_PIN2_Pos 2 /*!< Interrupt polarity set for pin 2 */ +#define GPIO_INTPOLSET_PIN3_Pos 3 /*!< Interrupt polarity set for pin 3 */ +#define GPIO_INTPOLSET_PIN4_Pos 4 /*!< Interrupt polarity set for pin 4 */ +#define GPIO_INTPOLSET_PIN5_Pos 5 /*!< Interrupt polarity set for pin 5 */ +#define GPIO_INTPOLSET_PIN6_Pos 6 /*!< Interrupt polarity set for pin 6 */ +#define GPIO_INTPOLSET_PIN7_Pos 7 /*!< Interrupt polarity set for pin 7 */ +#define GPIO_INTPOLSET_PIN8_Pos 8 /*!< Interrupt polarity set for pin 8 */ +#define GPIO_INTPOLSET_PIN9_Pos 9 /*!< Interrupt polarity set for pin 9 */ +#define GPIO_INTPOLSET_PIN10_Pos 10 /*!< Interrupt polarity set for pin 10 */ +#define GPIO_INTPOLSET_PIN11_Pos 11 /*!< Interrupt polarity set for pin 11 */ +#define GPIO_INTPOLSET_PIN12_Pos 12 /*!< Interrupt polarity set for pin 12 */ +#define GPIO_INTPOLSET_PIN13_Pos 13 /*!< Interrupt polarity set for pin 13 */ +#define GPIO_INTPOLSET_PIN14_Pos 14 /*!< Interrupt polarity set for pin 14 */ +#define GPIO_INTPOLSET_PIN15_Pos 15 /*!< Interrupt polarity set for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTPOLSET_PIN0_Msk 0x00000001UL /*!< Interrupt polarity set for pin 0 */ +#define GPIO_INTPOLSET_PIN1_Msk 0x00000002UL /*!< Interrupt polarity set for pin 1 */ +#define GPIO_INTPOLSET_PIN2_Msk 0x00000004UL /*!< Interrupt polarity set for pin 2 */ +#define GPIO_INTPOLSET_PIN3_Msk 0x00000008UL /*!< Interrupt polarity set for pin 3 */ +#define GPIO_INTPOLSET_PIN4_Msk 0x00000010UL /*!< Interrupt polarity set for pin 4 */ +#define GPIO_INTPOLSET_PIN5_Msk 0x00000020UL /*!< Interrupt polarity set for pin 5 */ +#define GPIO_INTPOLSET_PIN6_Msk 0x00000040UL /*!< Interrupt polarity set for pin 6 */ +#define GPIO_INTPOLSET_PIN7_Msk 0x00000080UL /*!< Interrupt polarity set for pin 7 */ +#define GPIO_INTPOLSET_PIN8_Msk 0x00000100UL /*!< Interrupt polarity set for pin 8 */ +#define GPIO_INTPOLSET_PIN9_Msk 0x00000200UL /*!< Interrupt polarity set for pin 9 */ +#define GPIO_INTPOLSET_PIN10_Msk 0x00000400UL /*!< Interrupt polarity set for pin 10 */ +#define GPIO_INTPOLSET_PIN11_Msk 0x00000800UL /*!< Interrupt polarity set for pin 11 */ +#define GPIO_INTPOLSET_PIN12_Msk 0x00001000UL /*!< Interrupt polarity set for pin 12 */ +#define GPIO_INTPOLSET_PIN13_Msk 0x00002000UL /*!< Interrupt polarity set for pin 13 */ +#define GPIO_INTPOLSET_PIN14_Msk 0x00004000UL /*!< Interrupt polarity set for pin 14 */ +#define GPIO_INTPOLSET_PIN15_Msk 0x00008000UL /*!< Interrupt polarity set for pin 15 */ + +/*-- INTPOLCLR: Interrupt polarity clear register ------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt polarity clear for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt polarity clear for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt polarity clear for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt polarity clear for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt polarity clear for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt polarity clear for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt polarity clear for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt polarity clear for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt polarity clear for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt polarity clear for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt polarity clear for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt polarity clear for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt polarity clear for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt polarity clear for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt polarity clear for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt polarity clear for pin 15 */ +} _GPIO_INTPOLCLR_bits; + +/* Bit field positions: */ +#define GPIO_INTPOLCLR_PIN0_Pos 0 /*!< Interrupt polarity clear for pin 0 */ +#define GPIO_INTPOLCLR_PIN1_Pos 1 /*!< Interrupt polarity clear for pin 1 */ +#define GPIO_INTPOLCLR_PIN2_Pos 2 /*!< Interrupt polarity clear for pin 2 */ +#define GPIO_INTPOLCLR_PIN3_Pos 3 /*!< Interrupt polarity clear for pin 3 */ +#define GPIO_INTPOLCLR_PIN4_Pos 4 /*!< Interrupt polarity clear for pin 4 */ +#define GPIO_INTPOLCLR_PIN5_Pos 5 /*!< Interrupt polarity clear for pin 5 */ +#define GPIO_INTPOLCLR_PIN6_Pos 6 /*!< Interrupt polarity clear for pin 6 */ +#define GPIO_INTPOLCLR_PIN7_Pos 7 /*!< Interrupt polarity clear for pin 7 */ +#define GPIO_INTPOLCLR_PIN8_Pos 8 /*!< Interrupt polarity clear for pin 8 */ +#define GPIO_INTPOLCLR_PIN9_Pos 9 /*!< Interrupt polarity clear for pin 9 */ +#define GPIO_INTPOLCLR_PIN10_Pos 10 /*!< Interrupt polarity clear for pin 10 */ +#define GPIO_INTPOLCLR_PIN11_Pos 11 /*!< Interrupt polarity clear for pin 11 */ +#define GPIO_INTPOLCLR_PIN12_Pos 12 /*!< Interrupt polarity clear for pin 12 */ +#define GPIO_INTPOLCLR_PIN13_Pos 13 /*!< Interrupt polarity clear for pin 13 */ +#define GPIO_INTPOLCLR_PIN14_Pos 14 /*!< Interrupt polarity clear for pin 14 */ +#define GPIO_INTPOLCLR_PIN15_Pos 15 /*!< Interrupt polarity clear for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTPOLCLR_PIN0_Msk 0x00000001UL /*!< Interrupt polarity clear for pin 0 */ +#define GPIO_INTPOLCLR_PIN1_Msk 0x00000002UL /*!< Interrupt polarity clear for pin 1 */ +#define GPIO_INTPOLCLR_PIN2_Msk 0x00000004UL /*!< Interrupt polarity clear for pin 2 */ +#define GPIO_INTPOLCLR_PIN3_Msk 0x00000008UL /*!< Interrupt polarity clear for pin 3 */ +#define GPIO_INTPOLCLR_PIN4_Msk 0x00000010UL /*!< Interrupt polarity clear for pin 4 */ +#define GPIO_INTPOLCLR_PIN5_Msk 0x00000020UL /*!< Interrupt polarity clear for pin 5 */ +#define GPIO_INTPOLCLR_PIN6_Msk 0x00000040UL /*!< Interrupt polarity clear for pin 6 */ +#define GPIO_INTPOLCLR_PIN7_Msk 0x00000080UL /*!< Interrupt polarity clear for pin 7 */ +#define GPIO_INTPOLCLR_PIN8_Msk 0x00000100UL /*!< Interrupt polarity clear for pin 8 */ +#define GPIO_INTPOLCLR_PIN9_Msk 0x00000200UL /*!< Interrupt polarity clear for pin 9 */ +#define GPIO_INTPOLCLR_PIN10_Msk 0x00000400UL /*!< Interrupt polarity clear for pin 10 */ +#define GPIO_INTPOLCLR_PIN11_Msk 0x00000800UL /*!< Interrupt polarity clear for pin 11 */ +#define GPIO_INTPOLCLR_PIN12_Msk 0x00001000UL /*!< Interrupt polarity clear for pin 12 */ +#define GPIO_INTPOLCLR_PIN13_Msk 0x00002000UL /*!< Interrupt polarity clear for pin 13 */ +#define GPIO_INTPOLCLR_PIN14_Msk 0x00004000UL /*!< Interrupt polarity clear for pin 14 */ +#define GPIO_INTPOLCLR_PIN15_Msk 0x00008000UL /*!< Interrupt polarity clear for pin 15 */ + +/*-- INTEDGESET: Interrupt every edge set register -----------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt every edge set for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt every edge set for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt every edge set for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt every edge set for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt every edge set for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt every edge set for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt every edge set for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt every edge set for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt every edge set for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt every edge set for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt every edge set for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt every edge set for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt every edge set for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt every edge set for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt every edge set for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt every edge set for pin 15 */ +} _GPIO_INTEDGESET_bits; + +/* Bit field positions: */ +#define GPIO_INTEDGESET_PIN0_Pos 0 /*!< Interrupt every edge set for pin 0 */ +#define GPIO_INTEDGESET_PIN1_Pos 1 /*!< Interrupt every edge set for pin 1 */ +#define GPIO_INTEDGESET_PIN2_Pos 2 /*!< Interrupt every edge set for pin 2 */ +#define GPIO_INTEDGESET_PIN3_Pos 3 /*!< Interrupt every edge set for pin 3 */ +#define GPIO_INTEDGESET_PIN4_Pos 4 /*!< Interrupt every edge set for pin 4 */ +#define GPIO_INTEDGESET_PIN5_Pos 5 /*!< Interrupt every edge set for pin 5 */ +#define GPIO_INTEDGESET_PIN6_Pos 6 /*!< Interrupt every edge set for pin 6 */ +#define GPIO_INTEDGESET_PIN7_Pos 7 /*!< Interrupt every edge set for pin 7 */ +#define GPIO_INTEDGESET_PIN8_Pos 8 /*!< Interrupt every edge set for pin 8 */ +#define GPIO_INTEDGESET_PIN9_Pos 9 /*!< Interrupt every edge set for pin 9 */ +#define GPIO_INTEDGESET_PIN10_Pos 10 /*!< Interrupt every edge set for pin 10 */ +#define GPIO_INTEDGESET_PIN11_Pos 11 /*!< Interrupt every edge set for pin 11 */ +#define GPIO_INTEDGESET_PIN12_Pos 12 /*!< Interrupt every edge set for pin 12 */ +#define GPIO_INTEDGESET_PIN13_Pos 13 /*!< Interrupt every edge set for pin 13 */ +#define GPIO_INTEDGESET_PIN14_Pos 14 /*!< Interrupt every edge set for pin 14 */ +#define GPIO_INTEDGESET_PIN15_Pos 15 /*!< Interrupt every edge set for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTEDGESET_PIN0_Msk 0x00000001UL /*!< Interrupt every edge set for pin 0 */ +#define GPIO_INTEDGESET_PIN1_Msk 0x00000002UL /*!< Interrupt every edge set for pin 1 */ +#define GPIO_INTEDGESET_PIN2_Msk 0x00000004UL /*!< Interrupt every edge set for pin 2 */ +#define GPIO_INTEDGESET_PIN3_Msk 0x00000008UL /*!< Interrupt every edge set for pin 3 */ +#define GPIO_INTEDGESET_PIN4_Msk 0x00000010UL /*!< Interrupt every edge set for pin 4 */ +#define GPIO_INTEDGESET_PIN5_Msk 0x00000020UL /*!< Interrupt every edge set for pin 5 */ +#define GPIO_INTEDGESET_PIN6_Msk 0x00000040UL /*!< Interrupt every edge set for pin 6 */ +#define GPIO_INTEDGESET_PIN7_Msk 0x00000080UL /*!< Interrupt every edge set for pin 7 */ +#define GPIO_INTEDGESET_PIN8_Msk 0x00000100UL /*!< Interrupt every edge set for pin 8 */ +#define GPIO_INTEDGESET_PIN9_Msk 0x00000200UL /*!< Interrupt every edge set for pin 9 */ +#define GPIO_INTEDGESET_PIN10_Msk 0x00000400UL /*!< Interrupt every edge set for pin 10 */ +#define GPIO_INTEDGESET_PIN11_Msk 0x00000800UL /*!< Interrupt every edge set for pin 11 */ +#define GPIO_INTEDGESET_PIN12_Msk 0x00001000UL /*!< Interrupt every edge set for pin 12 */ +#define GPIO_INTEDGESET_PIN13_Msk 0x00002000UL /*!< Interrupt every edge set for pin 13 */ +#define GPIO_INTEDGESET_PIN14_Msk 0x00004000UL /*!< Interrupt every edge set for pin 14 */ +#define GPIO_INTEDGESET_PIN15_Msk 0x00008000UL /*!< Interrupt every edge set for pin 15 */ + +/*-- INTEDGECLR: Interrupt every edge clear register ---------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt every edge clear for pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt every edge clear for pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt every edge clear for pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt every edge clear for pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt every edge clear for pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt every edge clear for pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt every edge clear for pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt every edge clear for pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt every edge clear for pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt every edge clear for pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt every edge clear for pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt every edge clear for pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt every edge clear for pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt every edge clear for pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt every edge clear for pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt every edge clear for pin 15 */ +} _GPIO_INTEDGECLR_bits; + +/* Bit field positions: */ +#define GPIO_INTEDGECLR_PIN0_Pos 0 /*!< Interrupt every edge clear for pin 0 */ +#define GPIO_INTEDGECLR_PIN1_Pos 1 /*!< Interrupt every edge clear for pin 1 */ +#define GPIO_INTEDGECLR_PIN2_Pos 2 /*!< Interrupt every edge clear for pin 2 */ +#define GPIO_INTEDGECLR_PIN3_Pos 3 /*!< Interrupt every edge clear for pin 3 */ +#define GPIO_INTEDGECLR_PIN4_Pos 4 /*!< Interrupt every edge clear for pin 4 */ +#define GPIO_INTEDGECLR_PIN5_Pos 5 /*!< Interrupt every edge clear for pin 5 */ +#define GPIO_INTEDGECLR_PIN6_Pos 6 /*!< Interrupt every edge clear for pin 6 */ +#define GPIO_INTEDGECLR_PIN7_Pos 7 /*!< Interrupt every edge clear for pin 7 */ +#define GPIO_INTEDGECLR_PIN8_Pos 8 /*!< Interrupt every edge clear for pin 8 */ +#define GPIO_INTEDGECLR_PIN9_Pos 9 /*!< Interrupt every edge clear for pin 9 */ +#define GPIO_INTEDGECLR_PIN10_Pos 10 /*!< Interrupt every edge clear for pin 10 */ +#define GPIO_INTEDGECLR_PIN11_Pos 11 /*!< Interrupt every edge clear for pin 11 */ +#define GPIO_INTEDGECLR_PIN12_Pos 12 /*!< Interrupt every edge clear for pin 12 */ +#define GPIO_INTEDGECLR_PIN13_Pos 13 /*!< Interrupt every edge clear for pin 13 */ +#define GPIO_INTEDGECLR_PIN14_Pos 14 /*!< Interrupt every edge clear for pin 14 */ +#define GPIO_INTEDGECLR_PIN15_Pos 15 /*!< Interrupt every edge clear for pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTEDGECLR_PIN0_Msk 0x00000001UL /*!< Interrupt every edge clear for pin 0 */ +#define GPIO_INTEDGECLR_PIN1_Msk 0x00000002UL /*!< Interrupt every edge clear for pin 1 */ +#define GPIO_INTEDGECLR_PIN2_Msk 0x00000004UL /*!< Interrupt every edge clear for pin 2 */ +#define GPIO_INTEDGECLR_PIN3_Msk 0x00000008UL /*!< Interrupt every edge clear for pin 3 */ +#define GPIO_INTEDGECLR_PIN4_Msk 0x00000010UL /*!< Interrupt every edge clear for pin 4 */ +#define GPIO_INTEDGECLR_PIN5_Msk 0x00000020UL /*!< Interrupt every edge clear for pin 5 */ +#define GPIO_INTEDGECLR_PIN6_Msk 0x00000040UL /*!< Interrupt every edge clear for pin 6 */ +#define GPIO_INTEDGECLR_PIN7_Msk 0x00000080UL /*!< Interrupt every edge clear for pin 7 */ +#define GPIO_INTEDGECLR_PIN8_Msk 0x00000100UL /*!< Interrupt every edge clear for pin 8 */ +#define GPIO_INTEDGECLR_PIN9_Msk 0x00000200UL /*!< Interrupt every edge clear for pin 9 */ +#define GPIO_INTEDGECLR_PIN10_Msk 0x00000400UL /*!< Interrupt every edge clear for pin 10 */ +#define GPIO_INTEDGECLR_PIN11_Msk 0x00000800UL /*!< Interrupt every edge clear for pin 11 */ +#define GPIO_INTEDGECLR_PIN12_Msk 0x00001000UL /*!< Interrupt every edge clear for pin 12 */ +#define GPIO_INTEDGECLR_PIN13_Msk 0x00002000UL /*!< Interrupt every edge clear for pin 13 */ +#define GPIO_INTEDGECLR_PIN14_Msk 0x00004000UL /*!< Interrupt every edge clear for pin 14 */ +#define GPIO_INTEDGECLR_PIN15_Msk 0x00008000UL /*!< Interrupt every edge clear for pin 15 */ + +/*-- INTSTATUS: Interrupt status -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Interrupt status of pin 0 */ + uint32_t PIN1 :1; /*!< Interrupt status of pin 1 */ + uint32_t PIN2 :1; /*!< Interrupt status of pin 2 */ + uint32_t PIN3 :1; /*!< Interrupt status of pin 3 */ + uint32_t PIN4 :1; /*!< Interrupt status of pin 4 */ + uint32_t PIN5 :1; /*!< Interrupt status of pin 5 */ + uint32_t PIN6 :1; /*!< Interrupt status of pin 6 */ + uint32_t PIN7 :1; /*!< Interrupt status of pin 7 */ + uint32_t PIN8 :1; /*!< Interrupt status of pin 8 */ + uint32_t PIN9 :1; /*!< Interrupt status of pin 9 */ + uint32_t PIN10 :1; /*!< Interrupt status of pin 10 */ + uint32_t PIN11 :1; /*!< Interrupt status of pin 11 */ + uint32_t PIN12 :1; /*!< Interrupt status of pin 12 */ + uint32_t PIN13 :1; /*!< Interrupt status of pin 13 */ + uint32_t PIN14 :1; /*!< Interrupt status of pin 14 */ + uint32_t PIN15 :1; /*!< Interrupt status of pin 15 */ +} _GPIO_INTSTATUS_bits; + +/* Bit field positions: */ +#define GPIO_INTSTATUS_PIN0_Pos 0 /*!< Interrupt status of pin 0 */ +#define GPIO_INTSTATUS_PIN1_Pos 1 /*!< Interrupt status of pin 1 */ +#define GPIO_INTSTATUS_PIN2_Pos 2 /*!< Interrupt status of pin 2 */ +#define GPIO_INTSTATUS_PIN3_Pos 3 /*!< Interrupt status of pin 3 */ +#define GPIO_INTSTATUS_PIN4_Pos 4 /*!< Interrupt status of pin 4 */ +#define GPIO_INTSTATUS_PIN5_Pos 5 /*!< Interrupt status of pin 5 */ +#define GPIO_INTSTATUS_PIN6_Pos 6 /*!< Interrupt status of pin 6 */ +#define GPIO_INTSTATUS_PIN7_Pos 7 /*!< Interrupt status of pin 7 */ +#define GPIO_INTSTATUS_PIN8_Pos 8 /*!< Interrupt status of pin 8 */ +#define GPIO_INTSTATUS_PIN9_Pos 9 /*!< Interrupt status of pin 9 */ +#define GPIO_INTSTATUS_PIN10_Pos 10 /*!< Interrupt status of pin 10 */ +#define GPIO_INTSTATUS_PIN11_Pos 11 /*!< Interrupt status of pin 11 */ +#define GPIO_INTSTATUS_PIN12_Pos 12 /*!< Interrupt status of pin 12 */ +#define GPIO_INTSTATUS_PIN13_Pos 13 /*!< Interrupt status of pin 13 */ +#define GPIO_INTSTATUS_PIN14_Pos 14 /*!< Interrupt status of pin 14 */ +#define GPIO_INTSTATUS_PIN15_Pos 15 /*!< Interrupt status of pin 15 */ + +/* Bit field masks: */ +#define GPIO_INTSTATUS_PIN0_Msk 0x00000001UL /*!< Interrupt status of pin 0 */ +#define GPIO_INTSTATUS_PIN1_Msk 0x00000002UL /*!< Interrupt status of pin 1 */ +#define GPIO_INTSTATUS_PIN2_Msk 0x00000004UL /*!< Interrupt status of pin 2 */ +#define GPIO_INTSTATUS_PIN3_Msk 0x00000008UL /*!< Interrupt status of pin 3 */ +#define GPIO_INTSTATUS_PIN4_Msk 0x00000010UL /*!< Interrupt status of pin 4 */ +#define GPIO_INTSTATUS_PIN5_Msk 0x00000020UL /*!< Interrupt status of pin 5 */ +#define GPIO_INTSTATUS_PIN6_Msk 0x00000040UL /*!< Interrupt status of pin 6 */ +#define GPIO_INTSTATUS_PIN7_Msk 0x00000080UL /*!< Interrupt status of pin 7 */ +#define GPIO_INTSTATUS_PIN8_Msk 0x00000100UL /*!< Interrupt status of pin 8 */ +#define GPIO_INTSTATUS_PIN9_Msk 0x00000200UL /*!< Interrupt status of pin 9 */ +#define GPIO_INTSTATUS_PIN10_Msk 0x00000400UL /*!< Interrupt status of pin 10 */ +#define GPIO_INTSTATUS_PIN11_Msk 0x00000800UL /*!< Interrupt status of pin 11 */ +#define GPIO_INTSTATUS_PIN12_Msk 0x00001000UL /*!< Interrupt status of pin 12 */ +#define GPIO_INTSTATUS_PIN13_Msk 0x00002000UL /*!< Interrupt status of pin 13 */ +#define GPIO_INTSTATUS_PIN14_Msk 0x00004000UL /*!< Interrupt status of pin 14 */ +#define GPIO_INTSTATUS_PIN15_Msk 0x00008000UL /*!< Interrupt status of pin 15 */ + +/*-- DMAREQSET: DMA request enable register ------------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< DMA request enable for pin 0 */ + uint32_t PIN1 :1; /*!< DMA request enable for pin 1 */ + uint32_t PIN2 :1; /*!< DMA request enable for pin 2 */ + uint32_t PIN3 :1; /*!< DMA request enable for pin 3 */ + uint32_t PIN4 :1; /*!< DMA request enable for pin 4 */ + uint32_t PIN5 :1; /*!< DMA request enable for pin 5 */ + uint32_t PIN6 :1; /*!< DMA request enable for pin 6 */ + uint32_t PIN7 :1; /*!< DMA request enable for pin 7 */ + uint32_t PIN8 :1; /*!< DMA request enable for pin 8 */ + uint32_t PIN9 :1; /*!< DMA request enable for pin 9 */ + uint32_t PIN10 :1; /*!< DMA request enable for pin 10 */ + uint32_t PIN11 :1; /*!< DMA request enable for pin 11 */ + uint32_t PIN12 :1; /*!< DMA request enable for pin 12 */ + uint32_t PIN13 :1; /*!< DMA request enable for pin 13 */ + uint32_t PIN14 :1; /*!< DMA request enable for pin 14 */ + uint32_t PIN15 :1; /*!< DMA request enable for pin 15 */ +} _GPIO_DMAREQSET_bits; + +/* Bit field positions: */ +#define GPIO_DMAREQSET_PIN0_Pos 0 /*!< DMA request enable for pin 0 */ +#define GPIO_DMAREQSET_PIN1_Pos 1 /*!< DMA request enable for pin 1 */ +#define GPIO_DMAREQSET_PIN2_Pos 2 /*!< DMA request enable for pin 2 */ +#define GPIO_DMAREQSET_PIN3_Pos 3 /*!< DMA request enable for pin 3 */ +#define GPIO_DMAREQSET_PIN4_Pos 4 /*!< DMA request enable for pin 4 */ +#define GPIO_DMAREQSET_PIN5_Pos 5 /*!< DMA request enable for pin 5 */ +#define GPIO_DMAREQSET_PIN6_Pos 6 /*!< DMA request enable for pin 6 */ +#define GPIO_DMAREQSET_PIN7_Pos 7 /*!< DMA request enable for pin 7 */ +#define GPIO_DMAREQSET_PIN8_Pos 8 /*!< DMA request enable for pin 8 */ +#define GPIO_DMAREQSET_PIN9_Pos 9 /*!< DMA request enable for pin 9 */ +#define GPIO_DMAREQSET_PIN10_Pos 10 /*!< DMA request enable for pin 10 */ +#define GPIO_DMAREQSET_PIN11_Pos 11 /*!< DMA request enable for pin 11 */ +#define GPIO_DMAREQSET_PIN12_Pos 12 /*!< DMA request enable for pin 12 */ +#define GPIO_DMAREQSET_PIN13_Pos 13 /*!< DMA request enable for pin 13 */ +#define GPIO_DMAREQSET_PIN14_Pos 14 /*!< DMA request enable for pin 14 */ +#define GPIO_DMAREQSET_PIN15_Pos 15 /*!< DMA request enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_DMAREQSET_PIN0_Msk 0x00000001UL /*!< DMA request enable for pin 0 */ +#define GPIO_DMAREQSET_PIN1_Msk 0x00000002UL /*!< DMA request enable for pin 1 */ +#define GPIO_DMAREQSET_PIN2_Msk 0x00000004UL /*!< DMA request enable for pin 2 */ +#define GPIO_DMAREQSET_PIN3_Msk 0x00000008UL /*!< DMA request enable for pin 3 */ +#define GPIO_DMAREQSET_PIN4_Msk 0x00000010UL /*!< DMA request enable for pin 4 */ +#define GPIO_DMAREQSET_PIN5_Msk 0x00000020UL /*!< DMA request enable for pin 5 */ +#define GPIO_DMAREQSET_PIN6_Msk 0x00000040UL /*!< DMA request enable for pin 6 */ +#define GPIO_DMAREQSET_PIN7_Msk 0x00000080UL /*!< DMA request enable for pin 7 */ +#define GPIO_DMAREQSET_PIN8_Msk 0x00000100UL /*!< DMA request enable for pin 8 */ +#define GPIO_DMAREQSET_PIN9_Msk 0x00000200UL /*!< DMA request enable for pin 9 */ +#define GPIO_DMAREQSET_PIN10_Msk 0x00000400UL /*!< DMA request enable for pin 10 */ +#define GPIO_DMAREQSET_PIN11_Msk 0x00000800UL /*!< DMA request enable for pin 11 */ +#define GPIO_DMAREQSET_PIN12_Msk 0x00001000UL /*!< DMA request enable for pin 12 */ +#define GPIO_DMAREQSET_PIN13_Msk 0x00002000UL /*!< DMA request enable for pin 13 */ +#define GPIO_DMAREQSET_PIN14_Msk 0x00004000UL /*!< DMA request enable for pin 14 */ +#define GPIO_DMAREQSET_PIN15_Msk 0x00008000UL /*!< DMA request enable for pin 15 */ + +/*-- DMAREQCLR: DMA request disable register -----------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< DMA request disable for pin 0 */ + uint32_t PIN1 :1; /*!< DMA request disable for pin 1 */ + uint32_t PIN2 :1; /*!< DMA request disable for pin 2 */ + uint32_t PIN3 :1; /*!< DMA request disable for pin 3 */ + uint32_t PIN4 :1; /*!< DMA request disable for pin 4 */ + uint32_t PIN5 :1; /*!< DMA request disable for pin 5 */ + uint32_t PIN6 :1; /*!< DMA request disable for pin 6 */ + uint32_t PIN7 :1; /*!< DMA request disable for pin 7 */ + uint32_t PIN8 :1; /*!< DMA request disable for pin 8 */ + uint32_t PIN9 :1; /*!< DMA request disable for pin 9 */ + uint32_t PIN10 :1; /*!< DMA request disable for pin 10 */ + uint32_t PIN11 :1; /*!< DMA request disable for pin 11 */ + uint32_t PIN12 :1; /*!< DMA request disable for pin 12 */ + uint32_t PIN13 :1; /*!< DMA request disable for pin 13 */ + uint32_t PIN14 :1; /*!< DMA request disable for pin 14 */ + uint32_t PIN15 :1; /*!< DMA request disable for pin 15 */ +} _GPIO_DMAREQCLR_bits; + +/* Bit field positions: */ +#define GPIO_DMAREQCLR_PIN0_Pos 0 /*!< DMA request disable for pin 0 */ +#define GPIO_DMAREQCLR_PIN1_Pos 1 /*!< DMA request disable for pin 1 */ +#define GPIO_DMAREQCLR_PIN2_Pos 2 /*!< DMA request disable for pin 2 */ +#define GPIO_DMAREQCLR_PIN3_Pos 3 /*!< DMA request disable for pin 3 */ +#define GPIO_DMAREQCLR_PIN4_Pos 4 /*!< DMA request disable for pin 4 */ +#define GPIO_DMAREQCLR_PIN5_Pos 5 /*!< DMA request disable for pin 5 */ +#define GPIO_DMAREQCLR_PIN6_Pos 6 /*!< DMA request disable for pin 6 */ +#define GPIO_DMAREQCLR_PIN7_Pos 7 /*!< DMA request disable for pin 7 */ +#define GPIO_DMAREQCLR_PIN8_Pos 8 /*!< DMA request disable for pin 8 */ +#define GPIO_DMAREQCLR_PIN9_Pos 9 /*!< DMA request disable for pin 9 */ +#define GPIO_DMAREQCLR_PIN10_Pos 10 /*!< DMA request disable for pin 10 */ +#define GPIO_DMAREQCLR_PIN11_Pos 11 /*!< DMA request disable for pin 11 */ +#define GPIO_DMAREQCLR_PIN12_Pos 12 /*!< DMA request disable for pin 12 */ +#define GPIO_DMAREQCLR_PIN13_Pos 13 /*!< DMA request disable for pin 13 */ +#define GPIO_DMAREQCLR_PIN14_Pos 14 /*!< DMA request disable for pin 14 */ +#define GPIO_DMAREQCLR_PIN15_Pos 15 /*!< DMA request disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_DMAREQCLR_PIN0_Msk 0x00000001UL /*!< DMA request disable for pin 0 */ +#define GPIO_DMAREQCLR_PIN1_Msk 0x00000002UL /*!< DMA request disable for pin 1 */ +#define GPIO_DMAREQCLR_PIN2_Msk 0x00000004UL /*!< DMA request disable for pin 2 */ +#define GPIO_DMAREQCLR_PIN3_Msk 0x00000008UL /*!< DMA request disable for pin 3 */ +#define GPIO_DMAREQCLR_PIN4_Msk 0x00000010UL /*!< DMA request disable for pin 4 */ +#define GPIO_DMAREQCLR_PIN5_Msk 0x00000020UL /*!< DMA request disable for pin 5 */ +#define GPIO_DMAREQCLR_PIN6_Msk 0x00000040UL /*!< DMA request disable for pin 6 */ +#define GPIO_DMAREQCLR_PIN7_Msk 0x00000080UL /*!< DMA request disable for pin 7 */ +#define GPIO_DMAREQCLR_PIN8_Msk 0x00000100UL /*!< DMA request disable for pin 8 */ +#define GPIO_DMAREQCLR_PIN9_Msk 0x00000200UL /*!< DMA request disable for pin 9 */ +#define GPIO_DMAREQCLR_PIN10_Msk 0x00000400UL /*!< DMA request disable for pin 10 */ +#define GPIO_DMAREQCLR_PIN11_Msk 0x00000800UL /*!< DMA request disable for pin 11 */ +#define GPIO_DMAREQCLR_PIN12_Msk 0x00001000UL /*!< DMA request disable for pin 12 */ +#define GPIO_DMAREQCLR_PIN13_Msk 0x00002000UL /*!< DMA request disable for pin 13 */ +#define GPIO_DMAREQCLR_PIN14_Msk 0x00004000UL /*!< DMA request disable for pin 14 */ +#define GPIO_DMAREQCLR_PIN15_Msk 0x00008000UL /*!< DMA request disable for pin 15 */ + +/*-- ADCSOCSET: ADC Start Of Conversion enable register ------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< ADC SOC enable for pin 0 */ + uint32_t PIN1 :1; /*!< ADC SOC enable for pin 1 */ + uint32_t PIN2 :1; /*!< ADC SOC enable for pin 2 */ + uint32_t PIN3 :1; /*!< ADC SOC enable for pin 3 */ + uint32_t PIN4 :1; /*!< ADC SOC enable for pin 4 */ + uint32_t PIN5 :1; /*!< ADC SOC enable for pin 5 */ + uint32_t PIN6 :1; /*!< ADC SOC enable for pin 6 */ + uint32_t PIN7 :1; /*!< ADC SOC enable for pin 7 */ + uint32_t PIN8 :1; /*!< ADC SOC enable for pin 8 */ + uint32_t PIN9 :1; /*!< ADC SOC enable for pin 9 */ + uint32_t PIN10 :1; /*!< ADC SOC enable for pin 10 */ + uint32_t PIN11 :1; /*!< ADC SOC enable for pin 11 */ + uint32_t PIN12 :1; /*!< ADC SOC enable for pin 12 */ + uint32_t PIN13 :1; /*!< ADC SOC enable for pin 13 */ + uint32_t PIN14 :1; /*!< ADC SOC enable for pin 14 */ + uint32_t PIN15 :1; /*!< ADC SOC enable for pin 15 */ +} _GPIO_ADCSOCSET_bits; + +/* Bit field positions: */ +#define GPIO_ADCSOCSET_PIN0_Pos 0 /*!< ADC SOC enable for pin 0 */ +#define GPIO_ADCSOCSET_PIN1_Pos 1 /*!< ADC SOC enable for pin 1 */ +#define GPIO_ADCSOCSET_PIN2_Pos 2 /*!< ADC SOC enable for pin 2 */ +#define GPIO_ADCSOCSET_PIN3_Pos 3 /*!< ADC SOC enable for pin 3 */ +#define GPIO_ADCSOCSET_PIN4_Pos 4 /*!< ADC SOC enable for pin 4 */ +#define GPIO_ADCSOCSET_PIN5_Pos 5 /*!< ADC SOC enable for pin 5 */ +#define GPIO_ADCSOCSET_PIN6_Pos 6 /*!< ADC SOC enable for pin 6 */ +#define GPIO_ADCSOCSET_PIN7_Pos 7 /*!< ADC SOC enable for pin 7 */ +#define GPIO_ADCSOCSET_PIN8_Pos 8 /*!< ADC SOC enable for pin 8 */ +#define GPIO_ADCSOCSET_PIN9_Pos 9 /*!< ADC SOC enable for pin 9 */ +#define GPIO_ADCSOCSET_PIN10_Pos 10 /*!< ADC SOC enable for pin 10 */ +#define GPIO_ADCSOCSET_PIN11_Pos 11 /*!< ADC SOC enable for pin 11 */ +#define GPIO_ADCSOCSET_PIN12_Pos 12 /*!< ADC SOC enable for pin 12 */ +#define GPIO_ADCSOCSET_PIN13_Pos 13 /*!< ADC SOC enable for pin 13 */ +#define GPIO_ADCSOCSET_PIN14_Pos 14 /*!< ADC SOC enable for pin 14 */ +#define GPIO_ADCSOCSET_PIN15_Pos 15 /*!< ADC SOC enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_ADCSOCSET_PIN0_Msk 0x00000001UL /*!< ADC SOC enable for pin 0 */ +#define GPIO_ADCSOCSET_PIN1_Msk 0x00000002UL /*!< ADC SOC enable for pin 1 */ +#define GPIO_ADCSOCSET_PIN2_Msk 0x00000004UL /*!< ADC SOC enable for pin 2 */ +#define GPIO_ADCSOCSET_PIN3_Msk 0x00000008UL /*!< ADC SOC enable for pin 3 */ +#define GPIO_ADCSOCSET_PIN4_Msk 0x00000010UL /*!< ADC SOC enable for pin 4 */ +#define GPIO_ADCSOCSET_PIN5_Msk 0x00000020UL /*!< ADC SOC enable for pin 5 */ +#define GPIO_ADCSOCSET_PIN6_Msk 0x00000040UL /*!< ADC SOC enable for pin 6 */ +#define GPIO_ADCSOCSET_PIN7_Msk 0x00000080UL /*!< ADC SOC enable for pin 7 */ +#define GPIO_ADCSOCSET_PIN8_Msk 0x00000100UL /*!< ADC SOC enable for pin 8 */ +#define GPIO_ADCSOCSET_PIN9_Msk 0x00000200UL /*!< ADC SOC enable for pin 9 */ +#define GPIO_ADCSOCSET_PIN10_Msk 0x00000400UL /*!< ADC SOC enable for pin 10 */ +#define GPIO_ADCSOCSET_PIN11_Msk 0x00000800UL /*!< ADC SOC enable for pin 11 */ +#define GPIO_ADCSOCSET_PIN12_Msk 0x00001000UL /*!< ADC SOC enable for pin 12 */ +#define GPIO_ADCSOCSET_PIN13_Msk 0x00002000UL /*!< ADC SOC enable for pin 13 */ +#define GPIO_ADCSOCSET_PIN14_Msk 0x00004000UL /*!< ADC SOC enable for pin 14 */ +#define GPIO_ADCSOCSET_PIN15_Msk 0x00008000UL /*!< ADC SOC enable for pin 15 */ + +/*-- ADCSOCCLR: ADC Start Of Conversion disable register -----------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< ADC SOC disable for pin 0 */ + uint32_t PIN1 :1; /*!< ADC SOC disable for pin 1 */ + uint32_t PIN2 :1; /*!< ADC SOC disable for pin 2 */ + uint32_t PIN3 :1; /*!< ADC SOC disable for pin 3 */ + uint32_t PIN4 :1; /*!< ADC SOC disable for pin 4 */ + uint32_t PIN5 :1; /*!< ADC SOC disable for pin 5 */ + uint32_t PIN6 :1; /*!< ADC SOC disable for pin 6 */ + uint32_t PIN7 :1; /*!< ADC SOC disable for pin 7 */ + uint32_t PIN8 :1; /*!< ADC SOC disable for pin 8 */ + uint32_t PIN9 :1; /*!< ADC SOC disable for pin 9 */ + uint32_t PIN10 :1; /*!< ADC SOC disable for pin 10 */ + uint32_t PIN11 :1; /*!< ADC SOC disable for pin 11 */ + uint32_t PIN12 :1; /*!< ADC SOC disable for pin 12 */ + uint32_t PIN13 :1; /*!< ADC SOC disable for pin 13 */ + uint32_t PIN14 :1; /*!< ADC SOC disable for pin 14 */ + uint32_t PIN15 :1; /*!< ADC SOC disable for pin 15 */ +} _GPIO_ADCSOCCLR_bits; + +/* Bit field positions: */ +#define GPIO_ADCSOCCLR_PIN0_Pos 0 /*!< ADC SOC disable for pin 0 */ +#define GPIO_ADCSOCCLR_PIN1_Pos 1 /*!< ADC SOC disable for pin 1 */ +#define GPIO_ADCSOCCLR_PIN2_Pos 2 /*!< ADC SOC disable for pin 2 */ +#define GPIO_ADCSOCCLR_PIN3_Pos 3 /*!< ADC SOC disable for pin 3 */ +#define GPIO_ADCSOCCLR_PIN4_Pos 4 /*!< ADC SOC disable for pin 4 */ +#define GPIO_ADCSOCCLR_PIN5_Pos 5 /*!< ADC SOC disable for pin 5 */ +#define GPIO_ADCSOCCLR_PIN6_Pos 6 /*!< ADC SOC disable for pin 6 */ +#define GPIO_ADCSOCCLR_PIN7_Pos 7 /*!< ADC SOC disable for pin 7 */ +#define GPIO_ADCSOCCLR_PIN8_Pos 8 /*!< ADC SOC disable for pin 8 */ +#define GPIO_ADCSOCCLR_PIN9_Pos 9 /*!< ADC SOC disable for pin 9 */ +#define GPIO_ADCSOCCLR_PIN10_Pos 10 /*!< ADC SOC disable for pin 10 */ +#define GPIO_ADCSOCCLR_PIN11_Pos 11 /*!< ADC SOC disable for pin 11 */ +#define GPIO_ADCSOCCLR_PIN12_Pos 12 /*!< ADC SOC disable for pin 12 */ +#define GPIO_ADCSOCCLR_PIN13_Pos 13 /*!< ADC SOC disable for pin 13 */ +#define GPIO_ADCSOCCLR_PIN14_Pos 14 /*!< ADC SOC disable for pin 14 */ +#define GPIO_ADCSOCCLR_PIN15_Pos 15 /*!< ADC SOC disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_ADCSOCCLR_PIN0_Msk 0x00000001UL /*!< ADC SOC disable for pin 0 */ +#define GPIO_ADCSOCCLR_PIN1_Msk 0x00000002UL /*!< ADC SOC disable for pin 1 */ +#define GPIO_ADCSOCCLR_PIN2_Msk 0x00000004UL /*!< ADC SOC disable for pin 2 */ +#define GPIO_ADCSOCCLR_PIN3_Msk 0x00000008UL /*!< ADC SOC disable for pin 3 */ +#define GPIO_ADCSOCCLR_PIN4_Msk 0x00000010UL /*!< ADC SOC disable for pin 4 */ +#define GPIO_ADCSOCCLR_PIN5_Msk 0x00000020UL /*!< ADC SOC disable for pin 5 */ +#define GPIO_ADCSOCCLR_PIN6_Msk 0x00000040UL /*!< ADC SOC disable for pin 6 */ +#define GPIO_ADCSOCCLR_PIN7_Msk 0x00000080UL /*!< ADC SOC disable for pin 7 */ +#define GPIO_ADCSOCCLR_PIN8_Msk 0x00000100UL /*!< ADC SOC disable for pin 8 */ +#define GPIO_ADCSOCCLR_PIN9_Msk 0x00000200UL /*!< ADC SOC disable for pin 9 */ +#define GPIO_ADCSOCCLR_PIN10_Msk 0x00000400UL /*!< ADC SOC disable for pin 10 */ +#define GPIO_ADCSOCCLR_PIN11_Msk 0x00000800UL /*!< ADC SOC disable for pin 11 */ +#define GPIO_ADCSOCCLR_PIN12_Msk 0x00001000UL /*!< ADC SOC disable for pin 12 */ +#define GPIO_ADCSOCCLR_PIN13_Msk 0x00002000UL /*!< ADC SOC disable for pin 13 */ +#define GPIO_ADCSOCCLR_PIN14_Msk 0x00004000UL /*!< ADC SOC disable for pin 14 */ +#define GPIO_ADCSOCCLR_PIN15_Msk 0x00008000UL /*!< ADC SOC disable for pin 15 */ + +/*-- RXEVSET: Core RXEV request enable register --------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< RXEV enable for pin 0 */ + uint32_t PIN1 :1; /*!< RXEV enable for pin 1 */ + uint32_t PIN2 :1; /*!< RXEV enable for pin 2 */ + uint32_t PIN3 :1; /*!< RXEV enable for pin 3 */ + uint32_t PIN4 :1; /*!< RXEV enable for pin 4 */ + uint32_t PIN5 :1; /*!< RXEV enable for pin 5 */ + uint32_t PIN6 :1; /*!< RXEV enable for pin 6 */ + uint32_t PIN7 :1; /*!< RXEV enable for pin 7 */ + uint32_t PIN8 :1; /*!< RXEV enable for pin 8 */ + uint32_t PIN9 :1; /*!< RXEV enable for pin 9 */ + uint32_t PIN10 :1; /*!< RXEV enable for pin 10 */ + uint32_t PIN11 :1; /*!< RXEV enable for pin 11 */ + uint32_t PIN12 :1; /*!< RXEV enable for pin 12 */ + uint32_t PIN13 :1; /*!< RXEV enable for pin 13 */ + uint32_t PIN14 :1; /*!< RXEV enable for pin 14 */ + uint32_t PIN15 :1; /*!< RXEV enable for pin 15 */ +} _GPIO_RXEVSET_bits; + +/* Bit field positions: */ +#define GPIO_RXEVSET_PIN0_Pos 0 /*!< RXEV enable for pin 0 */ +#define GPIO_RXEVSET_PIN1_Pos 1 /*!< RXEV enable for pin 1 */ +#define GPIO_RXEVSET_PIN2_Pos 2 /*!< RXEV enable for pin 2 */ +#define GPIO_RXEVSET_PIN3_Pos 3 /*!< RXEV enable for pin 3 */ +#define GPIO_RXEVSET_PIN4_Pos 4 /*!< RXEV enable for pin 4 */ +#define GPIO_RXEVSET_PIN5_Pos 5 /*!< RXEV enable for pin 5 */ +#define GPIO_RXEVSET_PIN6_Pos 6 /*!< RXEV enable for pin 6 */ +#define GPIO_RXEVSET_PIN7_Pos 7 /*!< RXEV enable for pin 7 */ +#define GPIO_RXEVSET_PIN8_Pos 8 /*!< RXEV enable for pin 8 */ +#define GPIO_RXEVSET_PIN9_Pos 9 /*!< RXEV enable for pin 9 */ +#define GPIO_RXEVSET_PIN10_Pos 10 /*!< RXEV enable for pin 10 */ +#define GPIO_RXEVSET_PIN11_Pos 11 /*!< RXEV enable for pin 11 */ +#define GPIO_RXEVSET_PIN12_Pos 12 /*!< RXEV enable for pin 12 */ +#define GPIO_RXEVSET_PIN13_Pos 13 /*!< RXEV enable for pin 13 */ +#define GPIO_RXEVSET_PIN14_Pos 14 /*!< RXEV enable for pin 14 */ +#define GPIO_RXEVSET_PIN15_Pos 15 /*!< RXEV enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_RXEVSET_PIN0_Msk 0x00000001UL /*!< RXEV enable for pin 0 */ +#define GPIO_RXEVSET_PIN1_Msk 0x00000002UL /*!< RXEV enable for pin 1 */ +#define GPIO_RXEVSET_PIN2_Msk 0x00000004UL /*!< RXEV enable for pin 2 */ +#define GPIO_RXEVSET_PIN3_Msk 0x00000008UL /*!< RXEV enable for pin 3 */ +#define GPIO_RXEVSET_PIN4_Msk 0x00000010UL /*!< RXEV enable for pin 4 */ +#define GPIO_RXEVSET_PIN5_Msk 0x00000020UL /*!< RXEV enable for pin 5 */ +#define GPIO_RXEVSET_PIN6_Msk 0x00000040UL /*!< RXEV enable for pin 6 */ +#define GPIO_RXEVSET_PIN7_Msk 0x00000080UL /*!< RXEV enable for pin 7 */ +#define GPIO_RXEVSET_PIN8_Msk 0x00000100UL /*!< RXEV enable for pin 8 */ +#define GPIO_RXEVSET_PIN9_Msk 0x00000200UL /*!< RXEV enable for pin 9 */ +#define GPIO_RXEVSET_PIN10_Msk 0x00000400UL /*!< RXEV enable for pin 10 */ +#define GPIO_RXEVSET_PIN11_Msk 0x00000800UL /*!< RXEV enable for pin 11 */ +#define GPIO_RXEVSET_PIN12_Msk 0x00001000UL /*!< RXEV enable for pin 12 */ +#define GPIO_RXEVSET_PIN13_Msk 0x00002000UL /*!< RXEV enable for pin 13 */ +#define GPIO_RXEVSET_PIN14_Msk 0x00004000UL /*!< RXEV enable for pin 14 */ +#define GPIO_RXEVSET_PIN15_Msk 0x00008000UL /*!< RXEV enable for pin 15 */ + +/*-- RXEVCLR: Core RXEV request disable register -------------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< RXEV disable for pin 0 */ + uint32_t PIN1 :1; /*!< RXEV disable for pin 1 */ + uint32_t PIN2 :1; /*!< RXEV disable for pin 2 */ + uint32_t PIN3 :1; /*!< RXEV disable for pin 3 */ + uint32_t PIN4 :1; /*!< RXEV disable for pin 4 */ + uint32_t PIN5 :1; /*!< RXEV disable for pin 5 */ + uint32_t PIN6 :1; /*!< RXEV disable for pin 6 */ + uint32_t PIN7 :1; /*!< RXEV disable for pin 7 */ + uint32_t PIN8 :1; /*!< RXEV disable for pin 8 */ + uint32_t PIN9 :1; /*!< RXEV disable for pin 9 */ + uint32_t PIN10 :1; /*!< RXEV disable for pin 10 */ + uint32_t PIN11 :1; /*!< RXEV disable for pin 11 */ + uint32_t PIN12 :1; /*!< RXEV disable for pin 12 */ + uint32_t PIN13 :1; /*!< RXEV disable for pin 13 */ + uint32_t PIN14 :1; /*!< RXEV disable for pin 14 */ + uint32_t PIN15 :1; /*!< RXEV disable for pin 15 */ +} _GPIO_RXEVCLR_bits; + +/* Bit field positions: */ +#define GPIO_RXEVCLR_PIN0_Pos 0 /*!< RXEV disable for pin 0 */ +#define GPIO_RXEVCLR_PIN1_Pos 1 /*!< RXEV disable for pin 1 */ +#define GPIO_RXEVCLR_PIN2_Pos 2 /*!< RXEV disable for pin 2 */ +#define GPIO_RXEVCLR_PIN3_Pos 3 /*!< RXEV disable for pin 3 */ +#define GPIO_RXEVCLR_PIN4_Pos 4 /*!< RXEV disable for pin 4 */ +#define GPIO_RXEVCLR_PIN5_Pos 5 /*!< RXEV disable for pin 5 */ +#define GPIO_RXEVCLR_PIN6_Pos 6 /*!< RXEV disable for pin 6 */ +#define GPIO_RXEVCLR_PIN7_Pos 7 /*!< RXEV disable for pin 7 */ +#define GPIO_RXEVCLR_PIN8_Pos 8 /*!< RXEV disable for pin 8 */ +#define GPIO_RXEVCLR_PIN9_Pos 9 /*!< RXEV disable for pin 9 */ +#define GPIO_RXEVCLR_PIN10_Pos 10 /*!< RXEV disable for pin 10 */ +#define GPIO_RXEVCLR_PIN11_Pos 11 /*!< RXEV disable for pin 11 */ +#define GPIO_RXEVCLR_PIN12_Pos 12 /*!< RXEV disable for pin 12 */ +#define GPIO_RXEVCLR_PIN13_Pos 13 /*!< RXEV disable for pin 13 */ +#define GPIO_RXEVCLR_PIN14_Pos 14 /*!< RXEV disable for pin 14 */ +#define GPIO_RXEVCLR_PIN15_Pos 15 /*!< RXEV disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_RXEVCLR_PIN0_Msk 0x00000001UL /*!< RXEV disable for pin 0 */ +#define GPIO_RXEVCLR_PIN1_Msk 0x00000002UL /*!< RXEV disable for pin 1 */ +#define GPIO_RXEVCLR_PIN2_Msk 0x00000004UL /*!< RXEV disable for pin 2 */ +#define GPIO_RXEVCLR_PIN3_Msk 0x00000008UL /*!< RXEV disable for pin 3 */ +#define GPIO_RXEVCLR_PIN4_Msk 0x00000010UL /*!< RXEV disable for pin 4 */ +#define GPIO_RXEVCLR_PIN5_Msk 0x00000020UL /*!< RXEV disable for pin 5 */ +#define GPIO_RXEVCLR_PIN6_Msk 0x00000040UL /*!< RXEV disable for pin 6 */ +#define GPIO_RXEVCLR_PIN7_Msk 0x00000080UL /*!< RXEV disable for pin 7 */ +#define GPIO_RXEVCLR_PIN8_Msk 0x00000100UL /*!< RXEV disable for pin 8 */ +#define GPIO_RXEVCLR_PIN9_Msk 0x00000200UL /*!< RXEV disable for pin 9 */ +#define GPIO_RXEVCLR_PIN10_Msk 0x00000400UL /*!< RXEV disable for pin 10 */ +#define GPIO_RXEVCLR_PIN11_Msk 0x00000800UL /*!< RXEV disable for pin 11 */ +#define GPIO_RXEVCLR_PIN12_Msk 0x00001000UL /*!< RXEV disable for pin 12 */ +#define GPIO_RXEVCLR_PIN13_Msk 0x00002000UL /*!< RXEV disable for pin 13 */ +#define GPIO_RXEVCLR_PIN14_Msk 0x00004000UL /*!< RXEV disable for pin 14 */ +#define GPIO_RXEVCLR_PIN15_Msk 0x00008000UL /*!< RXEV disable for pin 15 */ + +/*-- LOCKKEY: Key register to unlock LOCKSET/LOCKCLR registers for write (KEY=0xADEADBEE) --------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Key to unlock LOCKSET/LOCKCLR registers for write (KEY=0xADEADBEE) */ +} _GPIO_LOCKKEY_bits; + +/* Bit field positions: */ +#define GPIO_LOCKKEY_VAL_Pos 0 /*!< Key to unlock LOCKSET/LOCKCLR registers for write (KEY=0xADEADBEE) */ + +/* Bit field masks: */ +#define GPIO_LOCKKEY_VAL_Msk 0xFFFFFFFFUL /*!< Key to unlock LOCKSET/LOCKCLR registers for write (KEY=0xADEADBEE) */ + +/* Bit field enums: */ +typedef enum { + GPIO_LOCKKEY_VAL_LOCK = -286331154, /*!< 0xEEEEEEEE, key to lock registers */ + GPIO_LOCKKEY_VAL_UNLOCK = -1377117202, /*!< 0xADEADBEE, key to unlock registers */ +} GPIO_LOCKKEY_VAL_Enum; + +/*-- LOCKSTAT: Write LOCKSET/LOCKCLR enable status register --------------------------------------------------*/ +typedef struct { + uint32_t WREN :1; /*!< Write LOCKSET/LOCKCLR enable status */ +} _GPIO_LOCKSTAT_bits; + +/* Bit field positions: */ +#define GPIO_LOCKSTAT_WREN_Pos 0 /*!< Write LOCKSET/LOCKCLR enable status */ + +/* Bit field masks: */ +#define GPIO_LOCKSTAT_WREN_Msk 0x00000001UL /*!< Write LOCKSET/LOCKCLR enable status */ + +/*-- LOCKSET: Lock pins configuration enable register --------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Lock configuration enable for pin 0 */ + uint32_t PIN1 :1; /*!< Lock configuration enable for pin 1 */ + uint32_t PIN2 :1; /*!< Lock configuration enable for pin 2 */ + uint32_t PIN3 :1; /*!< Lock configuration enable for pin 3 */ + uint32_t PIN4 :1; /*!< Lock configuration enable for pin 4 */ + uint32_t PIN5 :1; /*!< Lock configuration enable for pin 5 */ + uint32_t PIN6 :1; /*!< Lock configuration enable for pin 6 */ + uint32_t PIN7 :1; /*!< Lock configuration enable for pin 7 */ + uint32_t PIN8 :1; /*!< Lock configuration enable for pin 8 */ + uint32_t PIN9 :1; /*!< Lock configuration enable for pin 9 */ + uint32_t PIN10 :1; /*!< Lock configuration enable for pin 10 */ + uint32_t PIN11 :1; /*!< Lock configuration enable for pin 11 */ + uint32_t PIN12 :1; /*!< Lock configuration enable for pin 12 */ + uint32_t PIN13 :1; /*!< Lock configuration enable for pin 13 */ + uint32_t PIN14 :1; /*!< Lock configuration enable for pin 14 */ + uint32_t PIN15 :1; /*!< Lock configuration enable for pin 15 */ +} _GPIO_LOCKSET_bits; + +/* Bit field positions: */ +#define GPIO_LOCKSET_PIN0_Pos 0 /*!< Lock configuration enable for pin 0 */ +#define GPIO_LOCKSET_PIN1_Pos 1 /*!< Lock configuration enable for pin 1 */ +#define GPIO_LOCKSET_PIN2_Pos 2 /*!< Lock configuration enable for pin 2 */ +#define GPIO_LOCKSET_PIN3_Pos 3 /*!< Lock configuration enable for pin 3 */ +#define GPIO_LOCKSET_PIN4_Pos 4 /*!< Lock configuration enable for pin 4 */ +#define GPIO_LOCKSET_PIN5_Pos 5 /*!< Lock configuration enable for pin 5 */ +#define GPIO_LOCKSET_PIN6_Pos 6 /*!< Lock configuration enable for pin 6 */ +#define GPIO_LOCKSET_PIN7_Pos 7 /*!< Lock configuration enable for pin 7 */ +#define GPIO_LOCKSET_PIN8_Pos 8 /*!< Lock configuration enable for pin 8 */ +#define GPIO_LOCKSET_PIN9_Pos 9 /*!< Lock configuration enable for pin 9 */ +#define GPIO_LOCKSET_PIN10_Pos 10 /*!< Lock configuration enable for pin 10 */ +#define GPIO_LOCKSET_PIN11_Pos 11 /*!< Lock configuration enable for pin 11 */ +#define GPIO_LOCKSET_PIN12_Pos 12 /*!< Lock configuration enable for pin 12 */ +#define GPIO_LOCKSET_PIN13_Pos 13 /*!< Lock configuration enable for pin 13 */ +#define GPIO_LOCKSET_PIN14_Pos 14 /*!< Lock configuration enable for pin 14 */ +#define GPIO_LOCKSET_PIN15_Pos 15 /*!< Lock configuration enable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_LOCKSET_PIN0_Msk 0x00000001UL /*!< Lock configuration enable for pin 0 */ +#define GPIO_LOCKSET_PIN1_Msk 0x00000002UL /*!< Lock configuration enable for pin 1 */ +#define GPIO_LOCKSET_PIN2_Msk 0x00000004UL /*!< Lock configuration enable for pin 2 */ +#define GPIO_LOCKSET_PIN3_Msk 0x00000008UL /*!< Lock configuration enable for pin 3 */ +#define GPIO_LOCKSET_PIN4_Msk 0x00000010UL /*!< Lock configuration enable for pin 4 */ +#define GPIO_LOCKSET_PIN5_Msk 0x00000020UL /*!< Lock configuration enable for pin 5 */ +#define GPIO_LOCKSET_PIN6_Msk 0x00000040UL /*!< Lock configuration enable for pin 6 */ +#define GPIO_LOCKSET_PIN7_Msk 0x00000080UL /*!< Lock configuration enable for pin 7 */ +#define GPIO_LOCKSET_PIN8_Msk 0x00000100UL /*!< Lock configuration enable for pin 8 */ +#define GPIO_LOCKSET_PIN9_Msk 0x00000200UL /*!< Lock configuration enable for pin 9 */ +#define GPIO_LOCKSET_PIN10_Msk 0x00000400UL /*!< Lock configuration enable for pin 10 */ +#define GPIO_LOCKSET_PIN11_Msk 0x00000800UL /*!< Lock configuration enable for pin 11 */ +#define GPIO_LOCKSET_PIN12_Msk 0x00001000UL /*!< Lock configuration enable for pin 12 */ +#define GPIO_LOCKSET_PIN13_Msk 0x00002000UL /*!< Lock configuration enable for pin 13 */ +#define GPIO_LOCKSET_PIN14_Msk 0x00004000UL /*!< Lock configuration enable for pin 14 */ +#define GPIO_LOCKSET_PIN15_Msk 0x00008000UL /*!< Lock configuration enable for pin 15 */ + +/*-- LOCKCLR: Lock pins configuration disable register -------------------------------------------------------*/ +typedef struct { + uint32_t PIN0 :1; /*!< Lock configuration disable for pin 0 */ + uint32_t PIN1 :1; /*!< Lock configuration disable for pin 1 */ + uint32_t PIN2 :1; /*!< Lock configuration disable for pin 2 */ + uint32_t PIN3 :1; /*!< Lock configuration disable for pin 3 */ + uint32_t PIN4 :1; /*!< Lock configuration disable for pin 4 */ + uint32_t PIN5 :1; /*!< Lock configuration disable for pin 5 */ + uint32_t PIN6 :1; /*!< Lock configuration disable for pin 6 */ + uint32_t PIN7 :1; /*!< Lock configuration disable for pin 7 */ + uint32_t PIN8 :1; /*!< Lock configuration disable for pin 8 */ + uint32_t PIN9 :1; /*!< Lock configuration disable for pin 9 */ + uint32_t PIN10 :1; /*!< Lock configuration disable for pin 10 */ + uint32_t PIN11 :1; /*!< Lock configuration disable for pin 11 */ + uint32_t PIN12 :1; /*!< Lock configuration disable for pin 12 */ + uint32_t PIN13 :1; /*!< Lock configuration disable for pin 13 */ + uint32_t PIN14 :1; /*!< Lock configuration disable for pin 14 */ + uint32_t PIN15 :1; /*!< Lock configuration disable for pin 15 */ +} _GPIO_LOCKCLR_bits; + +/* Bit field positions: */ +#define GPIO_LOCKCLR_PIN0_Pos 0 /*!< Lock configuration disable for pin 0 */ +#define GPIO_LOCKCLR_PIN1_Pos 1 /*!< Lock configuration disable for pin 1 */ +#define GPIO_LOCKCLR_PIN2_Pos 2 /*!< Lock configuration disable for pin 2 */ +#define GPIO_LOCKCLR_PIN3_Pos 3 /*!< Lock configuration disable for pin 3 */ +#define GPIO_LOCKCLR_PIN4_Pos 4 /*!< Lock configuration disable for pin 4 */ +#define GPIO_LOCKCLR_PIN5_Pos 5 /*!< Lock configuration disable for pin 5 */ +#define GPIO_LOCKCLR_PIN6_Pos 6 /*!< Lock configuration disable for pin 6 */ +#define GPIO_LOCKCLR_PIN7_Pos 7 /*!< Lock configuration disable for pin 7 */ +#define GPIO_LOCKCLR_PIN8_Pos 8 /*!< Lock configuration disable for pin 8 */ +#define GPIO_LOCKCLR_PIN9_Pos 9 /*!< Lock configuration disable for pin 9 */ +#define GPIO_LOCKCLR_PIN10_Pos 10 /*!< Lock configuration disable for pin 10 */ +#define GPIO_LOCKCLR_PIN11_Pos 11 /*!< Lock configuration disable for pin 11 */ +#define GPIO_LOCKCLR_PIN12_Pos 12 /*!< Lock configuration disable for pin 12 */ +#define GPIO_LOCKCLR_PIN13_Pos 13 /*!< Lock configuration disable for pin 13 */ +#define GPIO_LOCKCLR_PIN14_Pos 14 /*!< Lock configuration disable for pin 14 */ +#define GPIO_LOCKCLR_PIN15_Pos 15 /*!< Lock configuration disable for pin 15 */ + +/* Bit field masks: */ +#define GPIO_LOCKCLR_PIN0_Msk 0x00000001UL /*!< Lock configuration disable for pin 0 */ +#define GPIO_LOCKCLR_PIN1_Msk 0x00000002UL /*!< Lock configuration disable for pin 1 */ +#define GPIO_LOCKCLR_PIN2_Msk 0x00000004UL /*!< Lock configuration disable for pin 2 */ +#define GPIO_LOCKCLR_PIN3_Msk 0x00000008UL /*!< Lock configuration disable for pin 3 */ +#define GPIO_LOCKCLR_PIN4_Msk 0x00000010UL /*!< Lock configuration disable for pin 4 */ +#define GPIO_LOCKCLR_PIN5_Msk 0x00000020UL /*!< Lock configuration disable for pin 5 */ +#define GPIO_LOCKCLR_PIN6_Msk 0x00000040UL /*!< Lock configuration disable for pin 6 */ +#define GPIO_LOCKCLR_PIN7_Msk 0x00000080UL /*!< Lock configuration disable for pin 7 */ +#define GPIO_LOCKCLR_PIN8_Msk 0x00000100UL /*!< Lock configuration disable for pin 8 */ +#define GPIO_LOCKCLR_PIN9_Msk 0x00000200UL /*!< Lock configuration disable for pin 9 */ +#define GPIO_LOCKCLR_PIN10_Msk 0x00000400UL /*!< Lock configuration disable for pin 10 */ +#define GPIO_LOCKCLR_PIN11_Msk 0x00000800UL /*!< Lock configuration disable for pin 11 */ +#define GPIO_LOCKCLR_PIN12_Msk 0x00001000UL /*!< Lock configuration disable for pin 12 */ +#define GPIO_LOCKCLR_PIN13_Msk 0x00002000UL /*!< Lock configuration disable for pin 13 */ +#define GPIO_LOCKCLR_PIN14_Msk 0x00004000UL /*!< Lock configuration disable for pin 14 */ +#define GPIO_LOCKCLR_PIN15_Msk 0x00008000UL /*!< Lock configuration disable for pin 15 */ + +/*-- MASKLB: MASKLB: Mask register low byte of port -----------------------------------------------------------*/ +typedef struct { + uint32_t VAL :8; /*!< Mask low byte */ +} _GPIO_MASKLB_MASKLB_bits; + +/* Bit field positions: */ +#define GPIO_MASKLB_MASKLB_VAL_Pos 0 /*!< Mask low byte */ + +/* Bit field masks: */ +#define GPIO_MASKLB_MASKLB_VAL_Msk 0x000000FFUL /*!< Mask low byte */ + +/*-- MASKHB: MASKHB: Mask register High byte of port ----------------------------------------------------------*/ +typedef struct { + uint32_t :8; /*!< RESERVED */ + uint32_t VAL :8; /*!< Mask high byte */ +} _GPIO_MASKHB_MASKHB_bits; + +/* Bit field positions: */ +#define GPIO_MASKHB_MASKHB_VAL_Pos 8 /*!< Mask high byte */ + +/* Bit field masks: */ +#define GPIO_MASKHB_MASKHB_VAL_Msk 0x0000FF00UL /*!< Mask high byte */ + +//Cluster MASKLB: +typedef struct { + union { + /*!< Mask register low byte of port */ + __IO uint32_t MASKLB; /*!< MASKLB : type used for word access */ + __IO _GPIO_MASKLB_MASKLB_bits MASKLB_bit; /*!< MASKLB_bit: structure used for bit access */ + }; +} _GPIO_MASKLB_TypeDef; +//Cluster MASKHB: +typedef struct { + union { + /*!< Mask register High byte of port */ + __IO uint32_t MASKHB; /*!< MASKHB : type used for word access */ + __IO _GPIO_MASKHB_MASKHB_bits MASKHB_bit; /*!< MASKHB_bit: structure used for bit access */ + }; +} _GPIO_MASKHB_TypeDef; +typedef struct { + union { /*!< Data Input register */ + __I uint32_t DATA; /*!< DATA : type used for word access */ + __I _GPIO_DATA_bits DATA_bit; /*!< DATA_bit: structure used for bit access */ + }; + union { /*!< Data output register */ + __IO uint32_t DATAOUT; /*!< DATAOUT : type used for word access */ + __IO _GPIO_DATAOUT_bits DATAOUT_bit; /*!< DATAOUT_bit: structure used for bit access */ + }; + union { /*!< Data output set bits register */ + __O uint32_t DATAOUTSET; /*!< DATAOUTSET : type used for word access */ + __O _GPIO_DATAOUTSET_bits DATAOUTSET_bit; /*!< DATAOUTSET_bit: structure used for bit access */ + }; + union { /*!< Data output clear bits register */ + __O uint32_t DATAOUTCLR; /*!< DATAOUTCLR : type used for word access */ + __O _GPIO_DATAOUTCLR_bits DATAOUTCLR_bit; /*!< DATAOUTCLR_bit: structure used for bit access */ + }; + union { /*!< Data output toogle bits register */ + __O uint32_t DATAOUTTGL; /*!< DATAOUTTGL : type used for word access */ + __O _GPIO_DATAOUTTGL_bits DATAOUTTGL_bit; /*!< DATAOUTTGL_bit: structure used for bit access */ + }; + union { /*!< Digital function (PAD) enable register */ + __IO uint32_t DENSET; /*!< DENSET : type used for word access */ + __IO _GPIO_DENSET_bits DENSET_bit; /*!< DENSET_bit: structure used for bit access */ + }; + union { /*!< Digital function (PAD) disable register */ + __O uint32_t DENCLR; /*!< DENCLR : type used for word access */ + __O _GPIO_DENCLR_bits DENCLR_bit; /*!< DENCLR_bit: structure used for bit access */ + }; + union { /*!< Select input mode register */ + __IO uint32_t INMODE; /*!< INMODE : type used for word access */ + __IO _GPIO_INMODE_bits INMODE_bit; /*!< INMODE_bit: structure used for bit access */ + }; + union { /*!< Select pull mode register */ + __IO uint32_t PULLMODE; /*!< PULLMODE : type used for word access */ + __IO _GPIO_PULLMODE_bits PULLMODE_bit; /*!< PULLMODE_bit: structure used for bit access */ + }; + union { /*!< Select output mode register */ + __IO uint32_t OUTMODE; /*!< OUTMODE : type used for word access */ + __IO _GPIO_OUTMODE_bits OUTMODE_bit; /*!< OUTMODE_bit: structure used for bit access */ + }; + union { /*!< Select drive mode register */ + __IO uint32_t DRIVEMODE; /*!< DRIVEMODE : type used for word access */ + __IO _GPIO_DRIVEMODE_bits DRIVEMODE_bit; /*!< DRIVEMODE_bit: structure used for bit access */ + }; + union { /*!< Output enable register */ + __IO uint32_t OUTENSET; /*!< OUTENSET : type used for word access */ + __IO _GPIO_OUTENSET_bits OUTENSET_bit; /*!< OUTENSET_bit: structure used for bit access */ + }; + union { /*!< Output disable register */ + __O uint32_t OUTENCLR; /*!< OUTENCLR : type used for word access */ + __O _GPIO_OUTENCLR_bits OUTENCLR_bit; /*!< OUTENCLR_bit: structure used for bit access */ + }; + union { /*!< Alternative function enable register */ + __IO uint32_t ALTFUNCSET; /*!< ALTFUNCSET : type used for word access */ + __IO _GPIO_ALTFUNCSET_bits ALTFUNCSET_bit; /*!< ALTFUNCSET_bit: structure used for bit access */ + }; + union { /*!< Alternative function disable register */ + __O uint32_t ALTFUNCCLR; /*!< ALTFUNCCLR : type used for word access */ + __O _GPIO_ALTFUNCCLR_bits ALTFUNCCLR_bit; /*!< ALTFUNCCLR_bit: structure used for bit access */ + }; + union { /*!< Alternative function number register */ + __IO uint32_t ALTFUNCNUM0; /*!< ALTFUNCNUM0 : type used for word access */ + __IO _GPIO_ALTFUNCNUM0_bits ALTFUNCNUM0_bit; /*!< ALTFUNCNUM0_bit: structure used for bit access */ + }; + union { /*!< Alternative function number register */ + __IO uint32_t ALTFUNCNUM1; /*!< ALTFUNCNUM1 : type used for word access */ + __IO _GPIO_ALTFUNCNUM1_bits ALTFUNCNUM1_bit; /*!< ALTFUNCNUM1_bit: structure used for bit access */ + }; + union { /*!< Additional double flip-flop syncronization enable register */ + __IO uint32_t SYNCSET; /*!< SYNCSET : type used for word access */ + __IO _GPIO_SYNCSET_bits SYNCSET_bit; /*!< SYNCSET_bit: structure used for bit access */ + }; + union { /*!< Additional double flip-flop syncronization disable register */ + __O uint32_t SYNCCLR; /*!< SYNCCLR : type used for word access */ + __O _GPIO_SYNCCLR_bits SYNCCLR_bit; /*!< SYNCCLR_bit: structure used for bit access */ + }; + union { /*!< Qualifier enable register */ + __IO uint32_t QUALSET; /*!< QUALSET : type used for word access */ + __IO _GPIO_QUALSET_bits QUALSET_bit; /*!< QUALSET_bit: structure used for bit access */ + }; + union { /*!< Qualifier disable register */ + __O uint32_t QUALCLR; /*!< QUALCLR : type used for word access */ + __O _GPIO_QUALCLR_bits QUALCLR_bit; /*!< QUALCLR_bit: structure used for bit access */ + }; + union { /*!< Qualifier mode set register */ + __IO uint32_t QUALMODESET; /*!< QUALMODESET : type used for word access */ + __IO _GPIO_QUALMODESET_bits QUALMODESET_bit; /*!< QUALMODESET_bit: structure used for bit access */ + }; + union { /*!< Qualifier mode clear register */ + __O uint32_t QUALMODECLR; /*!< QUALMODECLR : type used for word access */ + __O _GPIO_QUALMODECLR_bits QUALMODECLR_bit; /*!< QUALMODECLR_bit: structure used for bit access */ + }; + union { /*!< Qualifier sample period register */ + __IO uint32_t QUALSAMPLE; /*!< QUALSAMPLE : type used for word access */ + __IO _GPIO_QUALSAMPLE_bits QUALSAMPLE_bit; /*!< QUALSAMPLE_bit: structure used for bit access */ + }; + union { /*!< Interrupt enable register */ + __IO uint32_t INTENSET; /*!< INTENSET : type used for word access */ + __IO _GPIO_INTENSET_bits INTENSET_bit; /*!< INTENSET_bit: structure used for bit access */ + }; + union { /*!< Interrupt disable register */ + __O uint32_t INTENCLR; /*!< INTENCLR : type used for word access */ + __O _GPIO_INTENCLR_bits INTENCLR_bit; /*!< INTENCLR_bit: structure used for bit access */ + }; + union { /*!< Interrupt type set register */ + __IO uint32_t INTTYPESET; /*!< INTTYPESET : type used for word access */ + __IO _GPIO_INTTYPESET_bits INTTYPESET_bit; /*!< INTTYPESET_bit: structure used for bit access */ + }; + union { /*!< Interrupt type clear register */ + __O uint32_t INTTYPECLR; /*!< INTTYPECLR : type used for word access */ + __O _GPIO_INTTYPECLR_bits INTTYPECLR_bit; /*!< INTTYPECLR_bit: structure used for bit access */ + }; + union { /*!< Interrupt polarity set register */ + __IO uint32_t INTPOLSET; /*!< INTPOLSET : type used for word access */ + __IO _GPIO_INTPOLSET_bits INTPOLSET_bit; /*!< INTPOLSET_bit: structure used for bit access */ + }; + union { /*!< Interrupt polarity clear register */ + __O uint32_t INTPOLCLR; /*!< INTPOLCLR : type used for word access */ + __O _GPIO_INTPOLCLR_bits INTPOLCLR_bit; /*!< INTPOLCLR_bit: structure used for bit access */ + }; + union { /*!< Interrupt every edge set register */ + __IO uint32_t INTEDGESET; /*!< INTEDGESET : type used for word access */ + __IO _GPIO_INTEDGESET_bits INTEDGESET_bit; /*!< INTEDGESET_bit: structure used for bit access */ + }; + union { /*!< Interrupt every edge clear register */ + __O uint32_t INTEDGECLR; /*!< INTEDGECLR : type used for word access */ + __O _GPIO_INTEDGECLR_bits INTEDGECLR_bit; /*!< INTEDGECLR_bit: structure used for bit access */ + }; + union { /*!< Interrupt status */ + __IO uint32_t INTSTATUS; /*!< INTSTATUS : type used for word access */ + __IO _GPIO_INTSTATUS_bits INTSTATUS_bit; /*!< INTSTATUS_bit: structure used for bit access */ + }; + union { /*!< DMA request enable register */ + __IO uint32_t DMAREQSET; /*!< DMAREQSET : type used for word access */ + __IO _GPIO_DMAREQSET_bits DMAREQSET_bit; /*!< DMAREQSET_bit: structure used for bit access */ + }; + union { /*!< DMA request disable register */ + __O uint32_t DMAREQCLR; /*!< DMAREQCLR : type used for word access */ + __O _GPIO_DMAREQCLR_bits DMAREQCLR_bit; /*!< DMAREQCLR_bit: structure used for bit access */ + }; + union { /*!< ADC Start Of Conversion enable register */ + __IO uint32_t ADCSOCSET; /*!< ADCSOCSET : type used for word access */ + __IO _GPIO_ADCSOCSET_bits ADCSOCSET_bit; /*!< ADCSOCSET_bit: structure used for bit access */ + }; + union { /*!< ADC Start Of Conversion disable register */ + __O uint32_t ADCSOCCLR; /*!< ADCSOCCLR : type used for word access */ + __O _GPIO_ADCSOCCLR_bits ADCSOCCLR_bit; /*!< ADCSOCCLR_bit: structure used for bit access */ + }; + union { /*!< Core RXEV request enable register */ + __IO uint32_t RXEVSET; /*!< RXEVSET : type used for word access */ + __IO _GPIO_RXEVSET_bits RXEVSET_bit; /*!< RXEVSET_bit: structure used for bit access */ + }; + union { /*!< Core RXEV request disable register */ + __O uint32_t RXEVCLR; /*!< RXEVCLR : type used for word access */ + __O _GPIO_RXEVCLR_bits RXEVCLR_bit; /*!< RXEVCLR_bit: structure used for bit access */ + }; + union { + union { /*!< Key register to unlock LOCKSET/LOCKCLR registers for write (KEY=0xADEADBEE) */ + __O uint32_t LOCKKEY; /*!< LOCKKEY : type used for word access */ + __O _GPIO_LOCKKEY_bits LOCKKEY_bit; /*!< LOCKKEY_bit: structure used for bit access */ + }; + struct { + union { /*!< Write LOCKSET/LOCKCLR enable status register */ + __I uint32_t LOCKSTAT; /*!< LOCKSTAT : type used for word access */ + __I _GPIO_LOCKSTAT_bits LOCKSTAT_bit; /*!< LOCKSTAT_bit: structure used for bit access */ + }; + }; + }; + union { /*!< Lock pins configuration enable register */ + __IO uint32_t LOCKSET; /*!< LOCKSET : type used for word access */ + __IO _GPIO_LOCKSET_bits LOCKSET_bit; /*!< LOCKSET_bit: structure used for bit access */ + }; + union { /*!< Lock pins configuration disable register */ + __O uint32_t LOCKCLR; /*!< LOCKCLR : type used for word access */ + __O _GPIO_LOCKCLR_bits LOCKCLR_bit; /*!< LOCKCLR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[214]; + _GPIO_MASKLB_TypeDef MASKLB[256]; + _GPIO_MASKHB_TypeDef MASKHB[256]; +} GPIO_TypeDef; + + +/******************************************************************************/ +/* TUART registers */ +/******************************************************************************/ + +/*-- DATA: Data value register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :8; /*!< Received/Transmitted data character */ +} _TUART_DATA_bits; + +/* Bit field positions: */ +#define TUART_DATA_VAL_Pos 0 /*!< Received/Transmitted data character */ + +/* Bit field masks: */ +#define TUART_DATA_VAL_Msk 0x000000FFUL /*!< Received/Transmitted data character */ + +/*-- STATE: State register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t TXF :1; /*!< TX buffer full */ + uint32_t RXF :1; /*!< RX buffer full */ + uint32_t TO :1; /*!< TX buffer overrun */ + uint32_t RO :1; /*!< RX buffer overrun */ +} _TUART_STATE_bits; + +/* Bit field positions: */ +#define TUART_STATE_TXF_Pos 0 /*!< TX buffer full */ +#define TUART_STATE_RXF_Pos 1 /*!< RX buffer full */ +#define TUART_STATE_TO_Pos 2 /*!< TX buffer overrun */ +#define TUART_STATE_RO_Pos 3 /*!< RX buffer overrun */ + +/* Bit field masks: */ +#define TUART_STATE_TXF_Msk 0x00000001UL /*!< TX buffer full */ +#define TUART_STATE_RXF_Msk 0x00000002UL /*!< RX buffer full */ +#define TUART_STATE_TO_Msk 0x00000004UL /*!< TX buffer overrun */ +#define TUART_STATE_RO_Msk 0x00000008UL /*!< RX buffer overrun */ + +/*-- CTRL: Control register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t TXEN :1; /*!< TX enable */ + uint32_t RXEN :1; /*!< RX enable */ + uint32_t TXIEN :1; /*!< TX interrupt enable */ + uint32_t RXIEN :1; /*!< RX interrupt enable */ + uint32_t TOIEN :1; /*!< TX overrun interrupt enable */ + uint32_t ROIEN :1; /*!< RX overrun interrupt enable */ +} _TUART_CTRL_bits; + +/* Bit field positions: */ +#define TUART_CTRL_TXEN_Pos 0 /*!< TX enable */ +#define TUART_CTRL_RXEN_Pos 1 /*!< RX enable */ +#define TUART_CTRL_TXIEN_Pos 2 /*!< TX interrupt enable */ +#define TUART_CTRL_RXIEN_Pos 3 /*!< RX interrupt enable */ +#define TUART_CTRL_TOIEN_Pos 4 /*!< TX overrun interrupt enable */ +#define TUART_CTRL_ROIEN_Pos 5 /*!< RX overrun interrupt enable */ + +/* Bit field masks: */ +#define TUART_CTRL_TXEN_Msk 0x00000001UL /*!< TX enable */ +#define TUART_CTRL_RXEN_Msk 0x00000002UL /*!< RX enable */ +#define TUART_CTRL_TXIEN_Msk 0x00000004UL /*!< TX interrupt enable */ +#define TUART_CTRL_RXIEN_Msk 0x00000008UL /*!< RX interrupt enable */ +#define TUART_CTRL_TOIEN_Msk 0x00000010UL /*!< TX overrun interrupt enable */ +#define TUART_CTRL_ROIEN_Msk 0x00000020UL /*!< RX overrun interrupt enable */ + +/*-- INTSTATUS: Interrupt status register --------------------------------------------------------------------*/ +typedef struct { + uint32_t TXIS :1; /*!< TX interrupt status */ + uint32_t RXIS :1; /*!< RX interrupt status */ + uint32_t TOIS :1; /*!< TX overrun interrupt status */ + uint32_t ROIS :1; /*!< RX overrun interrupt status */ +} _TUART_INTSTATUS_bits; + +/* Bit field positions: */ +#define TUART_INTSTATUS_TXIS_Pos 0 /*!< TX interrupt status */ +#define TUART_INTSTATUS_RXIS_Pos 1 /*!< RX interrupt status */ +#define TUART_INTSTATUS_TOIS_Pos 2 /*!< TX overrun interrupt status */ +#define TUART_INTSTATUS_ROIS_Pos 3 /*!< RX overrun interrupt status */ + +/* Bit field masks: */ +#define TUART_INTSTATUS_TXIS_Msk 0x00000001UL /*!< TX interrupt status */ +#define TUART_INTSTATUS_RXIS_Msk 0x00000002UL /*!< RX interrupt status */ +#define TUART_INTSTATUS_TOIS_Msk 0x00000004UL /*!< TX overrun interrupt status */ +#define TUART_INTSTATUS_ROIS_Msk 0x00000008UL /*!< RX overrun interrupt status */ + +/*-- BAUDDIV: Baudrate Divider register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :20; /*!< Baud rate divider. The minimum number is 16. */ +} _TUART_BAUDDIV_bits; + +/* Bit field positions: */ +#define TUART_BAUDDIV_VAL_Pos 0 /*!< Baud rate divider. The minimum number is 16. */ + +/* Bit field masks: */ +#define TUART_BAUDDIV_VAL_Msk 0x000FFFFFUL /*!< Baud rate divider. The minimum number is 16. */ + +typedef struct { + union { /*!< Data value register */ + __IO uint32_t DATA; /*!< DATA : type used for word access */ + __IO _TUART_DATA_bits DATA_bit; /*!< DATA_bit: structure used for bit access */ + }; + union { /*!< State register */ + __IO uint32_t STATE; /*!< STATE : type used for word access */ + __IO _TUART_STATE_bits STATE_bit; /*!< STATE_bit: structure used for bit access */ + }; + union { /*!< Control register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _TUART_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; + union { /*!< Interrupt status register */ + __IO uint32_t INTSTATUS; /*!< INTSTATUS : type used for word access */ + __IO _TUART_INTSTATUS_bits INTSTATUS_bit; /*!< INTSTATUS_bit: structure used for bit access */ + }; + union { /*!< Baudrate Divider register */ + __IO uint32_t BAUDDIV; /*!< BAUDDIV : type used for word access */ + __IO _TUART_BAUDDIV_bits BAUDDIV_bit; /*!< BAUDDIV_bit: structure used for bit access */ + }; +} TUART_TypeDef; + + +/******************************************************************************/ +/* OWI registers */ +/******************************************************************************/ + +/*-- CTRL0: Control 0 Register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable OWI */ + uint32_t :15; /*!< RESERVED */ + uint32_t DIV :16; /*!< Clock divider value for one tick */ +} _OWI_CTRL0_bits; + +/* Bit field positions: */ +#define OWI_CTRL0_EN_Pos 0 /*!< Enable OWI */ +#define OWI_CTRL0_DIV_Pos 16 /*!< Clock divider value for one tick */ + +/* Bit field masks: */ +#define OWI_CTRL0_EN_Msk 0x00000001UL /*!< Enable OWI */ +#define OWI_CTRL0_DIV_Msk 0xFFFF0000UL /*!< Clock divider value for one tick */ + +/*-- CTRL1: Control 1 Register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t OBPER :8; /*!< One bit period in ticks */ + uint32_t RSTPER :8; /*!< Reset period in ticks */ + uint32_t PRESPER :8; /*!< Presence period in ticks */ +} _OWI_CTRL1_bits; + +/* Bit field positions: */ +#define OWI_CTRL1_OBPER_Pos 0 /*!< One bit period in ticks */ +#define OWI_CTRL1_RSTPER_Pos 8 /*!< Reset period in ticks */ +#define OWI_CTRL1_PRESPER_Pos 16 /*!< Presence period in ticks */ + +/* Bit field masks: */ +#define OWI_CTRL1_OBPER_Msk 0x000000FFUL /*!< One bit period in ticks */ +#define OWI_CTRL1_RSTPER_Msk 0x0000FF00UL /*!< Reset period in ticks */ +#define OWI_CTRL1_PRESPER_Msk 0x00FF0000UL /*!< Presence period in ticks */ + +/*-- STAT: Status register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DONE :1; /*!< Operation DONE Flag for interrupt */ + uint32_t BUSY :1; /*!< Busy flag status */ + uint32_t PRES :1; /*!< Presence flag status after reset sequence */ +} _OWI_STAT_bits; + +/* Bit field positions: */ +#define OWI_STAT_DONE_Pos 0 /*!< Operation DONE Flag for interrupt */ +#define OWI_STAT_BUSY_Pos 1 /*!< Busy flag status */ +#define OWI_STAT_PRES_Pos 2 /*!< Presence flag status after reset sequence */ + +/* Bit field masks: */ +#define OWI_STAT_DONE_Msk 0x00000001UL /*!< Operation DONE Flag for interrupt */ +#define OWI_STAT_BUSY_Msk 0x00000002UL /*!< Busy flag status */ +#define OWI_STAT_PRES_Msk 0x00000004UL /*!< Presence flag status after reset sequence */ + +/*-- IRQ: Interrupt Control Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable interrupt DONE operation */ +} _OWI_IRQ_bits; + +/* Bit field positions: */ +#define OWI_IRQ_EN_Pos 0 /*!< Enable interrupt DONE operation */ + +/* Bit field masks: */ +#define OWI_IRQ_EN_Msk 0x00000001UL /*!< Enable interrupt DONE operation */ + +/*-- DATA: Data register -------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DATA :8; /*!< Data register. On write - init tx write operation. On read - get read value after RDCMD done. */ +} _OWI_DATA_bits; + +/* Bit field positions: */ +#define OWI_DATA_DATA_Pos 0 /*!< Data register. On write - init tx write operation. On read - get read value after RDCMD done. */ + +/* Bit field masks: */ +#define OWI_DATA_DATA_Msk 0x000000FFUL /*!< Data register. On write - init tx write operation. On read - get read value after RDCMD done. */ + +/*-- CMD: Command Regiser ------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t RDCMD :1; /*!< Initialize read command */ + uint32_t RSTCMD :1; /*!< Initialize reset sequence command */ +} _OWI_CMD_bits; + +/* Bit field positions: */ +#define OWI_CMD_RDCMD_Pos 0 /*!< Initialize read command */ +#define OWI_CMD_RSTCMD_Pos 1 /*!< Initialize reset sequence command */ + +/* Bit field masks: */ +#define OWI_CMD_RDCMD_Msk 0x00000001UL /*!< Initialize read command */ +#define OWI_CMD_RSTCMD_Msk 0x00000002UL /*!< Initialize reset sequence command */ + +typedef struct { + union { /*!< Control 0 Register */ + __IO uint32_t CTRL0; /*!< CTRL0 : type used for word access */ + __IO _OWI_CTRL0_bits CTRL0_bit; /*!< CTRL0_bit: structure used for bit access */ + }; + union { /*!< Control 1 Register */ + __IO uint32_t CTRL1; /*!< CTRL1 : type used for word access */ + __IO _OWI_CTRL1_bits CTRL1_bit; /*!< CTRL1_bit: structure used for bit access */ + }; + union { /*!< Status register */ + __IO uint32_t STAT; /*!< STAT : type used for word access */ + __IO _OWI_STAT_bits STAT_bit; /*!< STAT_bit: structure used for bit access */ + }; + union { /*!< Interrupt Control Register */ + __IO uint32_t IRQ; /*!< IRQ : type used for word access */ + __IO _OWI_IRQ_bits IRQ_bit; /*!< IRQ_bit: structure used for bit access */ + }; + union { /*!< Data register */ + __IO uint32_t DATA; /*!< DATA : type used for word access */ + __IO _OWI_DATA_bits DATA_bit; /*!< DATA_bit: structure used for bit access */ + }; + union { /*!< Command Regiser */ + __O uint32_t CMD; /*!< CMD : type used for word access */ + __O _OWI_CMD_bits CMD_bit; /*!< CMD_bit: structure used for bit access */ + }; +} OWI_TypeDef; + + +/******************************************************************************/ +/* UART registers */ +/******************************************************************************/ + +/*-- DR: Data Register ---------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DATA :8; /*!< Received/Transmitted data character */ + uint32_t FE :1; /*!< Framing error */ + uint32_t PE :1; /*!< Parity error */ + uint32_t BE :1; /*!< Break error */ + uint32_t OE :1; /*!< Overrun error */ +} _UART_DR_bits; + +/* Bit field positions: */ +#define UART_DR_DATA_Pos 0 /*!< Received/Transmitted data character */ +#define UART_DR_FE_Pos 8 /*!< Framing error */ +#define UART_DR_PE_Pos 9 /*!< Parity error */ +#define UART_DR_BE_Pos 10 /*!< Break error */ +#define UART_DR_OE_Pos 11 /*!< Overrun error */ + +/* Bit field masks: */ +#define UART_DR_DATA_Msk 0x000000FFUL /*!< Received/Transmitted data character */ +#define UART_DR_FE_Msk 0x00000100UL /*!< Framing error */ +#define UART_DR_PE_Msk 0x00000200UL /*!< Parity error */ +#define UART_DR_BE_Msk 0x00000400UL /*!< Break error */ +#define UART_DR_OE_Msk 0x00000800UL /*!< Overrun error */ + +/*-- RSR: Receive Status Register/Error Clear Register -------------------------------------------------------*/ +typedef struct { + uint32_t FE :1; /*!< Framing error */ + uint32_t PE :1; /*!< Parity error */ + uint32_t BE :1; /*!< Break error */ + uint32_t OE :1; /*!< Overrun error */ +} _UART_RSR_bits; + +/* Bit field positions: */ +#define UART_RSR_FE_Pos 0 /*!< Framing error */ +#define UART_RSR_PE_Pos 1 /*!< Parity error */ +#define UART_RSR_BE_Pos 2 /*!< Break error */ +#define UART_RSR_OE_Pos 3 /*!< Overrun error */ + +/* Bit field masks: */ +#define UART_RSR_FE_Msk 0x00000001UL /*!< Framing error */ +#define UART_RSR_PE_Msk 0x00000002UL /*!< Parity error */ +#define UART_RSR_BE_Msk 0x00000004UL /*!< Break error */ +#define UART_RSR_OE_Msk 0x00000008UL /*!< Overrun error */ + +/*-- FR: Flag Register ---------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t CTS :1; /*!< Clear to send */ + uint32_t DSR :1; /*!< Data set ready */ + uint32_t DCD :1; /*!< Data carrier detect */ + uint32_t BUSY :1; /*!< UART busy */ + uint32_t RXFE :1; /*!< Receive FIFO empty */ + uint32_t TXFF :1; /*!< Transmit FIFO full */ + uint32_t RXFF :1; /*!< Receive FIFO full */ + uint32_t TXFE :1; /*!< Transmit FIFO empty */ + uint32_t RI :1; /*!< Ring indicator */ +} _UART_FR_bits; + +/* Bit field positions: */ +#define UART_FR_CTS_Pos 0 /*!< Clear to send */ +#define UART_FR_DSR_Pos 1 /*!< Data set ready */ +#define UART_FR_DCD_Pos 2 /*!< Data carrier detect */ +#define UART_FR_BUSY_Pos 3 /*!< UART busy */ +#define UART_FR_RXFE_Pos 4 /*!< Receive FIFO empty */ +#define UART_FR_TXFF_Pos 5 /*!< Transmit FIFO full */ +#define UART_FR_RXFF_Pos 6 /*!< Receive FIFO full */ +#define UART_FR_TXFE_Pos 7 /*!< Transmit FIFO empty */ +#define UART_FR_RI_Pos 8 /*!< Ring indicator */ + +/* Bit field masks: */ +#define UART_FR_CTS_Msk 0x00000001UL /*!< Clear to send */ +#define UART_FR_DSR_Msk 0x00000002UL /*!< Data set ready */ +#define UART_FR_DCD_Msk 0x00000004UL /*!< Data carrier detect */ +#define UART_FR_BUSY_Msk 0x00000008UL /*!< UART busy */ +#define UART_FR_RXFE_Msk 0x00000010UL /*!< Receive FIFO empty */ +#define UART_FR_TXFF_Msk 0x00000020UL /*!< Transmit FIFO full */ +#define UART_FR_RXFF_Msk 0x00000040UL /*!< Receive FIFO full */ +#define UART_FR_TXFE_Msk 0x00000080UL /*!< Transmit FIFO empty */ +#define UART_FR_RI_Msk 0x00000100UL /*!< Ring indicator */ + +/*-- ILPR: IrDA Low-Power Counter Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t ILPDVSR :8; /*!< 8-bit low-power divisor value */ +} _UART_ILPR_bits; + +/* Bit field positions: */ +#define UART_ILPR_ILPDVSR_Pos 0 /*!< 8-bit low-power divisor value */ + +/* Bit field masks: */ +#define UART_ILPR_ILPDVSR_Msk 0x000000FFUL /*!< 8-bit low-power divisor value */ + +/*-- IBRD: Integer Baud Rate Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t DIVINT :16; /*!< The integer baud rate divisor */ +} _UART_IBRD_bits; + +/* Bit field positions: */ +#define UART_IBRD_DIVINT_Pos 0 /*!< The integer baud rate divisor */ + +/* Bit field masks: */ +#define UART_IBRD_DIVINT_Msk 0x0000FFFFUL /*!< The integer baud rate divisor */ + +/*-- FBRD: Fractional Baud Rate Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t DIVFRAC :6; /*!< The fractional baud rate divisor */ +} _UART_FBRD_bits; + +/* Bit field positions: */ +#define UART_FBRD_DIVFRAC_Pos 0 /*!< The fractional baud rate divisor */ + +/* Bit field masks: */ +#define UART_FBRD_DIVFRAC_Msk 0x0000003FUL /*!< The fractional baud rate divisor */ + +/*-- LCRH: Line Control Register -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t BRK :1; /*!< Send break */ + uint32_t PEN :1; /*!< Parity enable */ + uint32_t EPS :1; /*!< Even parity select */ + uint32_t STP2 :1; /*!< Two stop bits select */ + uint32_t FEN :1; /*!< Enable FIFOs */ + uint32_t WLEN :2; /*!< Word length */ + uint32_t SPS :1; /*!< Stick parity select */ +} _UART_LCRH_bits; + +/* Bit field positions: */ +#define UART_LCRH_BRK_Pos 0 /*!< Send break */ +#define UART_LCRH_PEN_Pos 1 /*!< Parity enable */ +#define UART_LCRH_EPS_Pos 2 /*!< Even parity select */ +#define UART_LCRH_STP2_Pos 3 /*!< Two stop bits select */ +#define UART_LCRH_FEN_Pos 4 /*!< Enable FIFOs */ +#define UART_LCRH_WLEN_Pos 5 /*!< Word length */ +#define UART_LCRH_SPS_Pos 7 /*!< Stick parity select */ + +/* Bit field masks: */ +#define UART_LCRH_BRK_Msk 0x00000001UL /*!< Send break */ +#define UART_LCRH_PEN_Msk 0x00000002UL /*!< Parity enable */ +#define UART_LCRH_EPS_Msk 0x00000004UL /*!< Even parity select */ +#define UART_LCRH_STP2_Msk 0x00000008UL /*!< Two stop bits select */ +#define UART_LCRH_FEN_Msk 0x00000010UL /*!< Enable FIFOs */ +#define UART_LCRH_WLEN_Msk 0x00000060UL /*!< Word length */ +#define UART_LCRH_SPS_Msk 0x00000080UL /*!< Stick parity select */ + +/* Bit field enums: */ +typedef enum { + UART_LCRH_WLEN_5bit = 0x0UL, /*!< 5 bit in informational word */ + UART_LCRH_WLEN_6bit = 0x1UL, /*!< 6 bit in informational word */ + UART_LCRH_WLEN_7bit = 0x2UL, /*!< 7 bit in informational word */ + UART_LCRH_WLEN_8bit = 0x3UL, /*!< 8 bit in informational word */ +} UART_LCRH_WLEN_Enum; + +/*-- CR: Control Register ------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t UARTEN :1; /*!< UART enable */ + uint32_t :7; /*!< RESERVED */ + uint32_t TXE :1; /*!< Transmit enable */ + uint32_t RXE :1; /*!< Receive enable */ + uint32_t DTR :1; /*!< Data transmit ready */ + uint32_t RTS :1; /*!< Request to send */ + uint32_t :2; /*!< RESERVED */ + uint32_t RTSEN :1; /*!< RTS hardware flow control enable */ + uint32_t CTSEN :1; /*!< CTS hardware flow control enable */ +} _UART_CR_bits; + +/* Bit field positions: */ +#define UART_CR_UARTEN_Pos 0 /*!< UART enable */ +#define UART_CR_TXE_Pos 8 /*!< Transmit enable */ +#define UART_CR_RXE_Pos 9 /*!< Receive enable */ +#define UART_CR_DTR_Pos 10 /*!< Data transmit ready */ +#define UART_CR_RTS_Pos 11 /*!< Request to send */ +#define UART_CR_RTSEN_Pos 14 /*!< RTS hardware flow control enable */ +#define UART_CR_CTSEN_Pos 15 /*!< CTS hardware flow control enable */ + +/* Bit field masks: */ +#define UART_CR_UARTEN_Msk 0x00000001UL /*!< UART enable */ +#define UART_CR_TXE_Msk 0x00000100UL /*!< Transmit enable */ +#define UART_CR_RXE_Msk 0x00000200UL /*!< Receive enable */ +#define UART_CR_DTR_Msk 0x00000400UL /*!< Data transmit ready */ +#define UART_CR_RTS_Msk 0x00000800UL /*!< Request to send */ +#define UART_CR_RTSEN_Msk 0x00004000UL /*!< RTS hardware flow control enable */ +#define UART_CR_CTSEN_Msk 0x00008000UL /*!< CTS hardware flow control enable */ + +/*-- IFLS: Interrupt FIFO Level Select Register --------------------------------------------------------------*/ +typedef struct { + uint32_t TXIFLSEL :3; /*!< Transmit interrupt FIFO level select */ + uint32_t RXIFLSEL :3; /*!< Receive interrupt FIFO level select */ +} _UART_IFLS_bits; + +/* Bit field positions: */ +#define UART_IFLS_TXIFLSEL_Pos 0 /*!< Transmit interrupt FIFO level select */ +#define UART_IFLS_RXIFLSEL_Pos 3 /*!< Receive interrupt FIFO level select */ + +/* Bit field masks: */ +#define UART_IFLS_TXIFLSEL_Msk 0x00000007UL /*!< Transmit interrupt FIFO level select */ +#define UART_IFLS_RXIFLSEL_Msk 0x00000038UL /*!< Receive interrupt FIFO level select */ + +/* Bit field enums: */ +typedef enum { + UART_IFLS_TXIFLSEL_Lvl18 = 0x0UL, /*!< interrupt on 1/8 */ + UART_IFLS_TXIFLSEL_Lvl14 = 0x1UL, /*!< interrupt on 1/4 */ + UART_IFLS_TXIFLSEL_Lvl12 = 0x2UL, /*!< interrupt on 1/2 */ + UART_IFLS_TXIFLSEL_Lvl34 = 0x3UL, /*!< interrupt on 3/4 */ + UART_IFLS_TXIFLSEL_Lvl78 = 0x4UL, /*!< interrupt on 7/8 */ +} UART_IFLS_TXIFLSEL_Enum; + +typedef enum { + UART_IFLS_RXIFLSEL_Lvl18 = 0x0UL, /*!< interrupt on 1/8 */ + UART_IFLS_RXIFLSEL_Lvl14 = 0x1UL, /*!< interrupt on 1/4 */ + UART_IFLS_RXIFLSEL_Lvl12 = 0x2UL, /*!< interrupt on 1/2 */ + UART_IFLS_RXIFLSEL_Lvl34 = 0x3UL, /*!< interrupt on 3/4 */ + UART_IFLS_RXIFLSEL_Lvl78 = 0x4UL, /*!< interrupt on 7/8 */ +} UART_IFLS_RXIFLSEL_Enum; + +/*-- IMSC: Interrupt Mask Set/Clear Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t RIMIM :1; /*!< nUARTRI modem interrupt mask */ + uint32_t CTSMIM :1; /*!< nUARTCTS modem interrupt mask */ + uint32_t DCDMIM :1; /*!< nUARTDCD modem interrupt mask */ + uint32_t DSRMIM :1; /*!< nUARTDSR modem interrupt mask */ + uint32_t RXIM :1; /*!< Receive interrupt mask */ + uint32_t TXIM :1; /*!< Transmit interrupt mask */ + uint32_t RTIM :1; /*!< Receive timeout interrupt mask */ + uint32_t FERIM :1; /*!< Framing error interrupt mask */ + uint32_t PERIM :1; /*!< Parity error interrupt mask */ + uint32_t BERIM :1; /*!< Break error interrupt mask */ + uint32_t OERIM :1; /*!< Overrun error interrupt mask */ + uint32_t TDIM :1; /*!< Transmit done interrupt mask */ +} _UART_IMSC_bits; + +/* Bit field positions: */ +#define UART_IMSC_RIMIM_Pos 0 /*!< nUARTRI modem interrupt mask */ +#define UART_IMSC_CTSMIM_Pos 1 /*!< nUARTCTS modem interrupt mask */ +#define UART_IMSC_DCDMIM_Pos 2 /*!< nUARTDCD modem interrupt mask */ +#define UART_IMSC_DSRMIM_Pos 3 /*!< nUARTDSR modem interrupt mask */ +#define UART_IMSC_RXIM_Pos 4 /*!< Receive interrupt mask */ +#define UART_IMSC_TXIM_Pos 5 /*!< Transmit interrupt mask */ +#define UART_IMSC_RTIM_Pos 6 /*!< Receive timeout interrupt mask */ +#define UART_IMSC_FERIM_Pos 7 /*!< Framing error interrupt mask */ +#define UART_IMSC_PERIM_Pos 8 /*!< Parity error interrupt mask */ +#define UART_IMSC_BERIM_Pos 9 /*!< Break error interrupt mask */ +#define UART_IMSC_OERIM_Pos 10 /*!< Overrun error interrupt mask */ +#define UART_IMSC_TDIM_Pos 11 /*!< Transmit done interrupt mask */ + +/* Bit field masks: */ +#define UART_IMSC_RIMIM_Msk 0x00000001UL /*!< nUARTRI modem interrupt mask */ +#define UART_IMSC_CTSMIM_Msk 0x00000002UL /*!< nUARTCTS modem interrupt mask */ +#define UART_IMSC_DCDMIM_Msk 0x00000004UL /*!< nUARTDCD modem interrupt mask */ +#define UART_IMSC_DSRMIM_Msk 0x00000008UL /*!< nUARTDSR modem interrupt mask */ +#define UART_IMSC_RXIM_Msk 0x00000010UL /*!< Receive interrupt mask */ +#define UART_IMSC_TXIM_Msk 0x00000020UL /*!< Transmit interrupt mask */ +#define UART_IMSC_RTIM_Msk 0x00000040UL /*!< Receive timeout interrupt mask */ +#define UART_IMSC_FERIM_Msk 0x00000080UL /*!< Framing error interrupt mask */ +#define UART_IMSC_PERIM_Msk 0x00000100UL /*!< Parity error interrupt mask */ +#define UART_IMSC_BERIM_Msk 0x00000200UL /*!< Break error interrupt mask */ +#define UART_IMSC_OERIM_Msk 0x00000400UL /*!< Overrun error interrupt mask */ +#define UART_IMSC_TDIM_Msk 0x00000800UL /*!< Transmit done interrupt mask */ + +/*-- RIS: Raw Interrupt Status Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t RIRMIS :1; /*!< nUARTRI modem interrupt status */ + uint32_t CTSRMIS :1; /*!< nUARTCTS modem interrupt status */ + uint32_t DCDRMIS :1; /*!< nUARTDCD modem interrupt status */ + uint32_t DSRRMIS :1; /*!< nUARTDSR modem interrupt status */ + uint32_t RXRIS :1; /*!< Receive interrupt status */ + uint32_t TXRIS :1; /*!< Transmit interrupt status */ + uint32_t RTRIS :1; /*!< Receive timeout interrupt status */ + uint32_t FERIS :1; /*!< Framing error interrupt status */ + uint32_t PERIS :1; /*!< Parity error interrupt status */ + uint32_t BERIS :1; /*!< Break error interrupt status */ + uint32_t OERIS :1; /*!< Overrun error interrupt status */ + uint32_t TDRIS :1; /*!< Transmit done raw interrupt status */ +} _UART_RIS_bits; + +/* Bit field positions: */ +#define UART_RIS_RIRMIS_Pos 0 /*!< nUARTRI modem interrupt status */ +#define UART_RIS_CTSRMIS_Pos 1 /*!< nUARTCTS modem interrupt status */ +#define UART_RIS_DCDRMIS_Pos 2 /*!< nUARTDCD modem interrupt status */ +#define UART_RIS_DSRRMIS_Pos 3 /*!< nUARTDSR modem interrupt status */ +#define UART_RIS_RXRIS_Pos 4 /*!< Receive interrupt status */ +#define UART_RIS_TXRIS_Pos 5 /*!< Transmit interrupt status */ +#define UART_RIS_RTRIS_Pos 6 /*!< Receive timeout interrupt status */ +#define UART_RIS_FERIS_Pos 7 /*!< Framing error interrupt status */ +#define UART_RIS_PERIS_Pos 8 /*!< Parity error interrupt status */ +#define UART_RIS_BERIS_Pos 9 /*!< Break error interrupt status */ +#define UART_RIS_OERIS_Pos 10 /*!< Overrun error interrupt status */ +#define UART_RIS_TDRIS_Pos 11 /*!< Transmit done raw interrupt status */ + +/* Bit field masks: */ +#define UART_RIS_RIRMIS_Msk 0x00000001UL /*!< nUARTRI modem interrupt status */ +#define UART_RIS_CTSRMIS_Msk 0x00000002UL /*!< nUARTCTS modem interrupt status */ +#define UART_RIS_DCDRMIS_Msk 0x00000004UL /*!< nUARTDCD modem interrupt status */ +#define UART_RIS_DSRRMIS_Msk 0x00000008UL /*!< nUARTDSR modem interrupt status */ +#define UART_RIS_RXRIS_Msk 0x00000010UL /*!< Receive interrupt status */ +#define UART_RIS_TXRIS_Msk 0x00000020UL /*!< Transmit interrupt status */ +#define UART_RIS_RTRIS_Msk 0x00000040UL /*!< Receive timeout interrupt status */ +#define UART_RIS_FERIS_Msk 0x00000080UL /*!< Framing error interrupt status */ +#define UART_RIS_PERIS_Msk 0x00000100UL /*!< Parity error interrupt status */ +#define UART_RIS_BERIS_Msk 0x00000200UL /*!< Break error interrupt status */ +#define UART_RIS_OERIS_Msk 0x00000400UL /*!< Overrun error interrupt status */ +#define UART_RIS_TDRIS_Msk 0x00000800UL /*!< Transmit done raw interrupt status */ + +/*-- MIS: Masked Interrupt Status Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t RIMMIS :1; /*!< nUARTRI modem masked interrupt status */ + uint32_t CTSMMIS :1; /*!< nUARTCTS modem masked interrupt status */ + uint32_t DCDMMIS :1; /*!< nUARTDCD modem masked interrupt status */ + uint32_t DSRMMIS :1; /*!< nUARTDSR modem masked interrupt status */ + uint32_t RXMIS :1; /*!< Receive masked interrupt status */ + uint32_t TXMIS :1; /*!< Transmit masked interrupt status */ + uint32_t RTMIS :1; /*!< Receive timeout masked interrupt status */ + uint32_t FEMIS :1; /*!< Framing error masked interrupt status */ + uint32_t PEMIS :1; /*!< Parity error masked interrupt status */ + uint32_t BEMIS :1; /*!< Break error masked interrupt status */ + uint32_t OEMIS :1; /*!< Overrun error masked interrupt status */ + uint32_t TDMIS :1; /*!< Transmit done masked interrupt status */ +} _UART_MIS_bits; + +/* Bit field positions: */ +#define UART_MIS_RIMMIS_Pos 0 /*!< nUARTRI modem masked interrupt status */ +#define UART_MIS_CTSMMIS_Pos 1 /*!< nUARTCTS modem masked interrupt status */ +#define UART_MIS_DCDMMIS_Pos 2 /*!< nUARTDCD modem masked interrupt status */ +#define UART_MIS_DSRMMIS_Pos 3 /*!< nUARTDSR modem masked interrupt status */ +#define UART_MIS_RXMIS_Pos 4 /*!< Receive masked interrupt status */ +#define UART_MIS_TXMIS_Pos 5 /*!< Transmit masked interrupt status */ +#define UART_MIS_RTMIS_Pos 6 /*!< Receive timeout masked interrupt status */ +#define UART_MIS_FEMIS_Pos 7 /*!< Framing error masked interrupt status */ +#define UART_MIS_PEMIS_Pos 8 /*!< Parity error masked interrupt status */ +#define UART_MIS_BEMIS_Pos 9 /*!< Break error masked interrupt status */ +#define UART_MIS_OEMIS_Pos 10 /*!< Overrun error masked interrupt status */ +#define UART_MIS_TDMIS_Pos 11 /*!< Transmit done masked interrupt status */ + +/* Bit field masks: */ +#define UART_MIS_RIMMIS_Msk 0x00000001UL /*!< nUARTRI modem masked interrupt status */ +#define UART_MIS_CTSMMIS_Msk 0x00000002UL /*!< nUARTCTS modem masked interrupt status */ +#define UART_MIS_DCDMMIS_Msk 0x00000004UL /*!< nUARTDCD modem masked interrupt status */ +#define UART_MIS_DSRMMIS_Msk 0x00000008UL /*!< nUARTDSR modem masked interrupt status */ +#define UART_MIS_RXMIS_Msk 0x00000010UL /*!< Receive masked interrupt status */ +#define UART_MIS_TXMIS_Msk 0x00000020UL /*!< Transmit masked interrupt status */ +#define UART_MIS_RTMIS_Msk 0x00000040UL /*!< Receive timeout masked interrupt status */ +#define UART_MIS_FEMIS_Msk 0x00000080UL /*!< Framing error masked interrupt status */ +#define UART_MIS_PEMIS_Msk 0x00000100UL /*!< Parity error masked interrupt status */ +#define UART_MIS_BEMIS_Msk 0x00000200UL /*!< Break error masked interrupt status */ +#define UART_MIS_OEMIS_Msk 0x00000400UL /*!< Overrun error masked interrupt status */ +#define UART_MIS_TDMIS_Msk 0x00000800UL /*!< Transmit done masked interrupt status */ + +/*-- ICR: Interrupt Clear Register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t RIMIC :1; /*!< nUARTRI modem interrupt clear */ + uint32_t CTSMIC :1; /*!< nUARTCTS modem interrupt clear */ + uint32_t DCDMIC :1; /*!< nUARTDCD modem interrupt clear */ + uint32_t DSRMIC :1; /*!< nUARTDSR modem interrupt clear */ + uint32_t RXIC :1; /*!< Receive interrupt clear */ + uint32_t TXIC :1; /*!< Transmit interrupt clear */ + uint32_t RTIC :1; /*!< Receive timeout interrupt clear */ + uint32_t FEIC :1; /*!< Framing error interrupt clear */ + uint32_t PEIC :1; /*!< Parity error interrupt clear */ + uint32_t BEIC :1; /*!< Break error interrupt clear */ + uint32_t OEIC :1; /*!< Overrun error interrupt clear */ + uint32_t TDIC :1; /*!< Transmit done interrupt clear */ +} _UART_ICR_bits; + +/* Bit field positions: */ +#define UART_ICR_RIMIC_Pos 0 /*!< nUARTRI modem interrupt clear */ +#define UART_ICR_CTSMIC_Pos 1 /*!< nUARTCTS modem interrupt clear */ +#define UART_ICR_DCDMIC_Pos 2 /*!< nUARTDCD modem interrupt clear */ +#define UART_ICR_DSRMIC_Pos 3 /*!< nUARTDSR modem interrupt clear */ +#define UART_ICR_RXIC_Pos 4 /*!< Receive interrupt clear */ +#define UART_ICR_TXIC_Pos 5 /*!< Transmit interrupt clear */ +#define UART_ICR_RTIC_Pos 6 /*!< Receive timeout interrupt clear */ +#define UART_ICR_FEIC_Pos 7 /*!< Framing error interrupt clear */ +#define UART_ICR_PEIC_Pos 8 /*!< Parity error interrupt clear */ +#define UART_ICR_BEIC_Pos 9 /*!< Break error interrupt clear */ +#define UART_ICR_OEIC_Pos 10 /*!< Overrun error interrupt clear */ +#define UART_ICR_TDIC_Pos 11 /*!< Transmit done interrupt clear */ + +/* Bit field masks: */ +#define UART_ICR_RIMIC_Msk 0x00000001UL /*!< nUARTRI modem interrupt clear */ +#define UART_ICR_CTSMIC_Msk 0x00000002UL /*!< nUARTCTS modem interrupt clear */ +#define UART_ICR_DCDMIC_Msk 0x00000004UL /*!< nUARTDCD modem interrupt clear */ +#define UART_ICR_DSRMIC_Msk 0x00000008UL /*!< nUARTDSR modem interrupt clear */ +#define UART_ICR_RXIC_Msk 0x00000010UL /*!< Receive interrupt clear */ +#define UART_ICR_TXIC_Msk 0x00000020UL /*!< Transmit interrupt clear */ +#define UART_ICR_RTIC_Msk 0x00000040UL /*!< Receive timeout interrupt clear */ +#define UART_ICR_FEIC_Msk 0x00000080UL /*!< Framing error interrupt clear */ +#define UART_ICR_PEIC_Msk 0x00000100UL /*!< Parity error interrupt clear */ +#define UART_ICR_BEIC_Msk 0x00000200UL /*!< Break error interrupt clear */ +#define UART_ICR_OEIC_Msk 0x00000400UL /*!< Overrun error interrupt clear */ +#define UART_ICR_TDIC_Msk 0x00000800UL /*!< Transmit done interrupt clear */ + +/*-- DMACR: DMA Control Register -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t RXDMAE :1; /*!< Receive DMA enable */ + uint32_t TXDMAE :1; /*!< Transmit DMA enable */ + uint32_t DMAONERR :1; /*!< DMA on error */ +} _UART_DMACR_bits; + +/* Bit field positions: */ +#define UART_DMACR_RXDMAE_Pos 0 /*!< Receive DMA enable */ +#define UART_DMACR_TXDMAE_Pos 1 /*!< Transmit DMA enable */ +#define UART_DMACR_DMAONERR_Pos 2 /*!< DMA on error */ + +/* Bit field masks: */ +#define UART_DMACR_RXDMAE_Msk 0x00000001UL /*!< Receive DMA enable */ +#define UART_DMACR_TXDMAE_Msk 0x00000002UL /*!< Transmit DMA enable */ +#define UART_DMACR_DMAONERR_Msk 0x00000004UL /*!< DMA on error */ + +typedef struct { + union { /*!< Data Register */ + __IO uint32_t DR; /*!< DR : type used for word access */ + __IO _UART_DR_bits DR_bit; /*!< DR_bit: structure used for bit access */ + }; + union { /*!< Receive Status Register/Error Clear Register */ + __IO uint32_t RSR; /*!< RSR : type used for word access */ + __IO _UART_RSR_bits RSR_bit; /*!< RSR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[4]; + union { /*!< Flag Register */ + __I uint32_t FR; /*!< FR : type used for word access */ + __I _UART_FR_bits FR_bit; /*!< FR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1; + union { /*!< IrDA Low-Power Counter Register */ + __IO uint32_t ILPR; /*!< ILPR : type used for word access */ + __IO _UART_ILPR_bits ILPR_bit; /*!< ILPR_bit: structure used for bit access */ + }; + union { /*!< Integer Baud Rate Register */ + __IO uint32_t IBRD; /*!< IBRD : type used for word access */ + __IO _UART_IBRD_bits IBRD_bit; /*!< IBRD_bit: structure used for bit access */ + }; + union { /*!< Fractional Baud Rate Register */ + __IO uint32_t FBRD; /*!< FBRD : type used for word access */ + __IO _UART_FBRD_bits FBRD_bit; /*!< FBRD_bit: structure used for bit access */ + }; + union { /*!< Line Control Register */ + __IO uint32_t LCRH; /*!< LCRH : type used for word access */ + __IO _UART_LCRH_bits LCRH_bit; /*!< LCRH_bit: structure used for bit access */ + }; + union { /*!< Control Register */ + __IO uint32_t CR; /*!< CR : type used for word access */ + __IO _UART_CR_bits CR_bit; /*!< CR_bit: structure used for bit access */ + }; + union { /*!< Interrupt FIFO Level Select Register */ + __IO uint32_t IFLS; /*!< IFLS : type used for word access */ + __IO _UART_IFLS_bits IFLS_bit; /*!< IFLS_bit: structure used for bit access */ + }; + union { /*!< Interrupt Mask Set/Clear Register */ + __IO uint32_t IMSC; /*!< IMSC : type used for word access */ + __IO _UART_IMSC_bits IMSC_bit; /*!< IMSC_bit: structure used for bit access */ + }; + union { /*!< Raw Interrupt Status Register */ + __I uint32_t RIS; /*!< RIS : type used for word access */ + __I _UART_RIS_bits RIS_bit; /*!< RIS_bit: structure used for bit access */ + }; + union { /*!< Masked Interrupt Status Register */ + __I uint32_t MIS; /*!< MIS : type used for word access */ + __I _UART_MIS_bits MIS_bit; /*!< MIS_bit: structure used for bit access */ + }; + union { /*!< Interrupt Clear Register */ + __O uint32_t ICR; /*!< ICR : type used for word access */ + __O _UART_ICR_bits ICR_bit; /*!< ICR_bit: structure used for bit access */ + }; + union { /*!< DMA Control Register */ + __IO uint32_t DMACR; /*!< DMACR : type used for word access */ + __IO _UART_DMACR_bits DMACR_bit; /*!< DMACR_bit: structure used for bit access */ + }; +} UART_TypeDef; + + +/******************************************************************************/ +/* DMA registers */ +/******************************************************************************/ + +/*-- STATUS: Status DMA register -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t MASTEREN :1; /*!< Indicate enable DMA */ + uint32_t :3; /*!< RESERVED */ + uint32_t STATE :4; /*!< State of DMA */ + uint32_t :8; /*!< RESERVED */ + uint32_t CHNLS :5; /*!< Number channel DMA (write: N-1) */ +} _DMA_STATUS_bits; + +/* Bit field positions: */ +#define DMA_STATUS_MASTEREN_Pos 0 /*!< Indicate enable DMA */ +#define DMA_STATUS_STATE_Pos 4 /*!< State of DMA */ +#define DMA_STATUS_CHNLS_Pos 16 /*!< Number channel DMA (write: N-1) */ + +/* Bit field masks: */ +#define DMA_STATUS_MASTEREN_Msk 0x00000001UL /*!< Indicate enable DMA */ +#define DMA_STATUS_STATE_Msk 0x000000F0UL /*!< State of DMA */ +#define DMA_STATUS_CHNLS_Msk 0x001F0000UL /*!< Number channel DMA (write: N-1) */ + +/* Bit field enums: */ +typedef enum { + DMA_STATUS_STATE_Free = 0x0UL, /*!< At rest */ + DMA_STATUS_STATE_ReadConfigData = 0x1UL, /*!< Reading the config data structure */ + DMA_STATUS_STATE_ReadSrcDataEndPtr = 0x2UL, /*!< Reading sourse data end pointer */ + DMA_STATUS_STATE_ReadDstDataEndPtr = 0x3UL, /*!< Reading destination data end pointer */ + DMA_STATUS_STATE_ReadSrcData = 0x4UL, /*!< Reading source data */ + DMA_STATUS_STATE_WrireDstData = 0x5UL, /*!< Writing data to the destination */ + DMA_STATUS_STATE_WaitReq = 0x6UL, /*!< Waiting for a request */ + DMA_STATUS_STATE_WriteConfigData = 0x7UL, /*!< Write config structure of the channel */ + DMA_STATUS_STATE_Pause = 0x8UL, /*!< Suspended */ + DMA_STATUS_STATE_Done = 0x9UL, /*!< Executed */ + DMA_STATUS_STATE_PeriphScatGath = 0xAUL, /*!< mode "peripheral scather-gather" */ +} DMA_STATUS_STATE_Enum; + +/*-- CFG: DMA configuration register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t MASTEREN :1; /*!< Enable DMA */ + uint32_t :4; /*!< RESERVED */ + uint32_t CHPROT :3; /*!< Sets the AHB-Lite protection */ +} _DMA_CFG_bits; + +/* Bit field positions: */ +#define DMA_CFG_MASTEREN_Pos 0 /*!< Enable DMA */ +#define DMA_CFG_CHPROT_Pos 5 /*!< Sets the AHB-Lite protection */ + +/* Bit field masks: */ +#define DMA_CFG_MASTEREN_Msk 0x00000001UL /*!< Enable DMA */ +#define DMA_CFG_CHPROT_Msk 0x000000E0UL /*!< Sets the AHB-Lite protection */ + +/*-- BASEPTR: Channel control data base pointer --------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Base address of the primary control data */ +} _DMA_BASEPTR_bits; + +/* Bit field positions: */ +#define DMA_BASEPTR_VAL_Pos 0 /*!< Base address of the primary control data */ + +/* Bit field masks: */ +#define DMA_BASEPTR_VAL_Msk 0xFFFFFFFFUL /*!< Base address of the primary control data */ + +/*-- ALTBASEPTR: Channel alternate control data base pointer -------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Base address of alternative control data */ +} _DMA_ALTBASEPTR_bits; + +/* Bit field positions: */ +#define DMA_ALTBASEPTR_VAL_Pos 0 /*!< Base address of alternative control data */ + +/* Bit field masks: */ +#define DMA_ALTBASEPTR_VAL_Msk 0xFFFFFFFFUL /*!< Base address of alternative control data */ + +/*-- WAITONREQ: Channel wait on request status ---------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH1 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH2 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH3 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH4 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH5 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH6 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH7 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH8 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH9 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH10 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH11 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH12 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH13 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH14 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH15 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH16 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH17 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH18 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH19 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH20 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH21 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH22 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH23 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH24 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH25 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH26 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH27 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH28 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH29 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH30 :1; /*!< Returns the status of the DMA request signals */ + uint32_t CH31 :1; /*!< Returns the status of the DMA request signals */ +} _DMA_WAITONREQ_bits; + +/* Bit field positions: */ +#define DMA_WAITONREQ_CH0_Pos 0 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH1_Pos 1 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH2_Pos 2 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH3_Pos 3 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH4_Pos 4 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH5_Pos 5 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH6_Pos 6 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH7_Pos 7 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH8_Pos 8 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH9_Pos 9 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH10_Pos 10 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH11_Pos 11 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH12_Pos 12 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH13_Pos 13 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH14_Pos 14 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH15_Pos 15 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH16_Pos 16 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH17_Pos 17 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH18_Pos 18 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH19_Pos 19 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH20_Pos 20 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH21_Pos 21 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH22_Pos 22 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH23_Pos 23 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH24_Pos 24 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH25_Pos 25 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH26_Pos 26 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH27_Pos 27 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH28_Pos 28 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH29_Pos 29 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH30_Pos 30 /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH31_Pos 31 /*!< Returns the status of the DMA request signals */ + +/* Bit field masks: */ +#define DMA_WAITONREQ_CH0_Msk 0x00000001UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH1_Msk 0x00000002UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH2_Msk 0x00000004UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH3_Msk 0x00000008UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH4_Msk 0x00000010UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH5_Msk 0x00000020UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH6_Msk 0x00000040UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH7_Msk 0x00000080UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH8_Msk 0x00000100UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH9_Msk 0x00000200UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH10_Msk 0x00000400UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH11_Msk 0x00000800UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH12_Msk 0x00001000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH13_Msk 0x00002000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH14_Msk 0x00004000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH15_Msk 0x00008000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH16_Msk 0x00010000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH17_Msk 0x00020000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH18_Msk 0x00040000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH19_Msk 0x00080000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH20_Msk 0x00100000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH21_Msk 0x00200000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH22_Msk 0x00400000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH23_Msk 0x00800000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH24_Msk 0x01000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH25_Msk 0x02000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH26_Msk 0x04000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH27_Msk 0x08000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH28_Msk 0x10000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH29_Msk 0x20000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH30_Msk 0x40000000UL /*!< Returns the status of the DMA request signals */ +#define DMA_WAITONREQ_CH31_Msk 0x80000000UL /*!< Returns the status of the DMA request signals */ + +/*-- SWREQ: Channel software request -------------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Set software request on channel */ + uint32_t CH1 :1; /*!< Set software request on channel */ + uint32_t CH2 :1; /*!< Set software request on channel */ + uint32_t CH3 :1; /*!< Set software request on channel */ + uint32_t CH4 :1; /*!< Set software request on channel */ + uint32_t CH5 :1; /*!< Set software request on channel */ + uint32_t CH6 :1; /*!< Set software request on channel */ + uint32_t CH7 :1; /*!< Set software request on channel */ + uint32_t CH8 :1; /*!< Set software request on channel */ + uint32_t CH9 :1; /*!< Set software request on channel */ + uint32_t CH10 :1; /*!< Set software request on channel */ + uint32_t CH11 :1; /*!< Set software request on channel */ + uint32_t CH12 :1; /*!< Set software request on channel */ + uint32_t CH13 :1; /*!< Set software request on channel */ + uint32_t CH14 :1; /*!< Set software request on channel */ + uint32_t CH15 :1; /*!< Set software request on channel */ + uint32_t CH16 :1; /*!< Set software request on channel */ + uint32_t CH17 :1; /*!< Set software request on channel */ + uint32_t CH18 :1; /*!< Set software request on channel */ + uint32_t CH19 :1; /*!< Set software request on channel */ + uint32_t CH20 :1; /*!< Set software request on channel */ + uint32_t CH21 :1; /*!< Set software request on channel */ + uint32_t CH22 :1; /*!< Set software request on channel */ + uint32_t CH23 :1; /*!< Set software request on channel */ + uint32_t CH24 :1; /*!< Set software request on channel */ + uint32_t CH25 :1; /*!< Set software request on channel */ + uint32_t CH26 :1; /*!< Set software request on channel */ + uint32_t CH27 :1; /*!< Set software request on channel */ + uint32_t CH28 :1; /*!< Set software request on channel */ + uint32_t CH29 :1; /*!< Set software request on channel */ + uint32_t CH30 :1; /*!< Set software request on channel */ + uint32_t CH31 :1; /*!< Set software request on channel */ +} _DMA_SWREQ_bits; + +/* Bit field positions: */ +#define DMA_SWREQ_CH0_Pos 0 /*!< Set software request on channel */ +#define DMA_SWREQ_CH1_Pos 1 /*!< Set software request on channel */ +#define DMA_SWREQ_CH2_Pos 2 /*!< Set software request on channel */ +#define DMA_SWREQ_CH3_Pos 3 /*!< Set software request on channel */ +#define DMA_SWREQ_CH4_Pos 4 /*!< Set software request on channel */ +#define DMA_SWREQ_CH5_Pos 5 /*!< Set software request on channel */ +#define DMA_SWREQ_CH6_Pos 6 /*!< Set software request on channel */ +#define DMA_SWREQ_CH7_Pos 7 /*!< Set software request on channel */ +#define DMA_SWREQ_CH8_Pos 8 /*!< Set software request on channel */ +#define DMA_SWREQ_CH9_Pos 9 /*!< Set software request on channel */ +#define DMA_SWREQ_CH10_Pos 10 /*!< Set software request on channel */ +#define DMA_SWREQ_CH11_Pos 11 /*!< Set software request on channel */ +#define DMA_SWREQ_CH12_Pos 12 /*!< Set software request on channel */ +#define DMA_SWREQ_CH13_Pos 13 /*!< Set software request on channel */ +#define DMA_SWREQ_CH14_Pos 14 /*!< Set software request on channel */ +#define DMA_SWREQ_CH15_Pos 15 /*!< Set software request on channel */ +#define DMA_SWREQ_CH16_Pos 16 /*!< Set software request on channel */ +#define DMA_SWREQ_CH17_Pos 17 /*!< Set software request on channel */ +#define DMA_SWREQ_CH18_Pos 18 /*!< Set software request on channel */ +#define DMA_SWREQ_CH19_Pos 19 /*!< Set software request on channel */ +#define DMA_SWREQ_CH20_Pos 20 /*!< Set software request on channel */ +#define DMA_SWREQ_CH21_Pos 21 /*!< Set software request on channel */ +#define DMA_SWREQ_CH22_Pos 22 /*!< Set software request on channel */ +#define DMA_SWREQ_CH23_Pos 23 /*!< Set software request on channel */ +#define DMA_SWREQ_CH24_Pos 24 /*!< Set software request on channel */ +#define DMA_SWREQ_CH25_Pos 25 /*!< Set software request on channel */ +#define DMA_SWREQ_CH26_Pos 26 /*!< Set software request on channel */ +#define DMA_SWREQ_CH27_Pos 27 /*!< Set software request on channel */ +#define DMA_SWREQ_CH28_Pos 28 /*!< Set software request on channel */ +#define DMA_SWREQ_CH29_Pos 29 /*!< Set software request on channel */ +#define DMA_SWREQ_CH30_Pos 30 /*!< Set software request on channel */ +#define DMA_SWREQ_CH31_Pos 31 /*!< Set software request on channel */ + +/* Bit field masks: */ +#define DMA_SWREQ_CH0_Msk 0x00000001UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH1_Msk 0x00000002UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH2_Msk 0x00000004UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH3_Msk 0x00000008UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH4_Msk 0x00000010UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH5_Msk 0x00000020UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH6_Msk 0x00000040UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH7_Msk 0x00000080UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH8_Msk 0x00000100UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH9_Msk 0x00000200UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH10_Msk 0x00000400UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH11_Msk 0x00000800UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH12_Msk 0x00001000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH13_Msk 0x00002000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH14_Msk 0x00004000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH15_Msk 0x00008000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH16_Msk 0x00010000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH17_Msk 0x00020000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH18_Msk 0x00040000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH19_Msk 0x00080000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH20_Msk 0x00100000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH21_Msk 0x00200000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH22_Msk 0x00400000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH23_Msk 0x00800000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH24_Msk 0x01000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH25_Msk 0x02000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH26_Msk 0x04000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH27_Msk 0x08000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH28_Msk 0x10000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH29_Msk 0x20000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH30_Msk 0x40000000UL /*!< Set software request on channel */ +#define DMA_SWREQ_CH31_Msk 0x80000000UL /*!< Set software request on channel */ + +/*-- USEBURSTSET: Channel useburst set -----------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Enable single requests */ + uint32_t CH1 :1; /*!< Enable single requests */ + uint32_t CH2 :1; /*!< Enable single requests */ + uint32_t CH3 :1; /*!< Enable single requests */ + uint32_t CH4 :1; /*!< Enable single requests */ + uint32_t CH5 :1; /*!< Enable single requests */ + uint32_t CH6 :1; /*!< Enable single requests */ + uint32_t CH7 :1; /*!< Enable single requests */ + uint32_t CH8 :1; /*!< Enable single requests */ + uint32_t CH9 :1; /*!< Enable single requests */ + uint32_t CH10 :1; /*!< Enable single requests */ + uint32_t CH11 :1; /*!< Enable single requests */ + uint32_t CH12 :1; /*!< Enable single requests */ + uint32_t CH13 :1; /*!< Enable single requests */ + uint32_t CH14 :1; /*!< Enable single requests */ + uint32_t CH15 :1; /*!< Enable single requests */ + uint32_t CH16 :1; /*!< Enable single requests */ + uint32_t CH17 :1; /*!< Enable single requests */ + uint32_t CH18 :1; /*!< Enable single requests */ + uint32_t CH19 :1; /*!< Enable single requests */ + uint32_t CH20 :1; /*!< Enable single requests */ + uint32_t CH21 :1; /*!< Enable single requests */ + uint32_t CH22 :1; /*!< Enable single requests */ + uint32_t CH23 :1; /*!< Enable single requests */ + uint32_t CH24 :1; /*!< Enable single requests */ + uint32_t CH25 :1; /*!< Enable single requests */ + uint32_t CH26 :1; /*!< Enable single requests */ + uint32_t CH27 :1; /*!< Enable single requests */ + uint32_t CH28 :1; /*!< Enable single requests */ + uint32_t CH29 :1; /*!< Enable single requests */ + uint32_t CH30 :1; /*!< Enable single requests */ + uint32_t CH31 :1; /*!< Enable single requests */ +} _DMA_USEBURSTSET_bits; + +/* Bit field positions: */ +#define DMA_USEBURSTSET_CH0_Pos 0 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH1_Pos 1 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH2_Pos 2 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH3_Pos 3 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH4_Pos 4 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH5_Pos 5 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH6_Pos 6 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH7_Pos 7 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH8_Pos 8 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH9_Pos 9 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH10_Pos 10 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH11_Pos 11 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH12_Pos 12 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH13_Pos 13 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH14_Pos 14 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH15_Pos 15 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH16_Pos 16 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH17_Pos 17 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH18_Pos 18 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH19_Pos 19 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH20_Pos 20 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH21_Pos 21 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH22_Pos 22 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH23_Pos 23 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH24_Pos 24 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH25_Pos 25 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH26_Pos 26 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH27_Pos 27 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH28_Pos 28 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH29_Pos 29 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH30_Pos 30 /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH31_Pos 31 /*!< Enable single requests */ + +/* Bit field masks: */ +#define DMA_USEBURSTSET_CH0_Msk 0x00000001UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH1_Msk 0x00000002UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH2_Msk 0x00000004UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH3_Msk 0x00000008UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH4_Msk 0x00000010UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH5_Msk 0x00000020UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH6_Msk 0x00000040UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH7_Msk 0x00000080UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH8_Msk 0x00000100UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH9_Msk 0x00000200UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH10_Msk 0x00000400UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH11_Msk 0x00000800UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH12_Msk 0x00001000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH13_Msk 0x00002000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH14_Msk 0x00004000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH15_Msk 0x00008000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH16_Msk 0x00010000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH17_Msk 0x00020000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH18_Msk 0x00040000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH19_Msk 0x00080000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH20_Msk 0x00100000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH21_Msk 0x00200000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH22_Msk 0x00400000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH23_Msk 0x00800000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH24_Msk 0x01000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH25_Msk 0x02000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH26_Msk 0x04000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH27_Msk 0x08000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH28_Msk 0x10000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH29_Msk 0x20000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH30_Msk 0x40000000UL /*!< Enable single requests */ +#define DMA_USEBURSTSET_CH31_Msk 0x80000000UL /*!< Enable single requests */ + +/*-- USEBURSTCLR: Channel useburst clear ---------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Disable single requests */ + uint32_t CH1 :1; /*!< Disable single requests */ + uint32_t CH2 :1; /*!< Disable single requests */ + uint32_t CH3 :1; /*!< Disable single requests */ + uint32_t CH4 :1; /*!< Disable single requests */ + uint32_t CH5 :1; /*!< Disable single requests */ + uint32_t CH6 :1; /*!< Disable single requests */ + uint32_t CH7 :1; /*!< Disable single requests */ + uint32_t CH8 :1; /*!< Disable single requests */ + uint32_t CH9 :1; /*!< Disable single requests */ + uint32_t CH10 :1; /*!< Disable single requests */ + uint32_t CH11 :1; /*!< Disable single requests */ + uint32_t CH12 :1; /*!< Disable single requests */ + uint32_t CH13 :1; /*!< Disable single requests */ + uint32_t CH14 :1; /*!< Disable single requests */ + uint32_t CH15 :1; /*!< Disable single requests */ + uint32_t CH16 :1; /*!< Disable single requests */ + uint32_t CH17 :1; /*!< Disable single requests */ + uint32_t CH18 :1; /*!< Disable single requests */ + uint32_t CH19 :1; /*!< Disable single requests */ + uint32_t CH20 :1; /*!< Disable single requests */ + uint32_t CH21 :1; /*!< Disable single requests */ + uint32_t CH22 :1; /*!< Disable single requests */ + uint32_t CH23 :1; /*!< Disable single requests */ + uint32_t CH24 :1; /*!< Disable single requests */ + uint32_t CH25 :1; /*!< Disable single requests */ + uint32_t CH26 :1; /*!< Disable single requests */ + uint32_t CH27 :1; /*!< Disable single requests */ + uint32_t CH28 :1; /*!< Disable single requests */ + uint32_t CH29 :1; /*!< Disable single requests */ + uint32_t CH30 :1; /*!< Disable single requests */ + uint32_t CH31 :1; /*!< Disable single requests */ +} _DMA_USEBURSTCLR_bits; + +/* Bit field positions: */ +#define DMA_USEBURSTCLR_CH0_Pos 0 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH1_Pos 1 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH2_Pos 2 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH3_Pos 3 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH4_Pos 4 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH5_Pos 5 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH6_Pos 6 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH7_Pos 7 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH8_Pos 8 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH9_Pos 9 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH10_Pos 10 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH11_Pos 11 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH12_Pos 12 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH13_Pos 13 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH14_Pos 14 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH15_Pos 15 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH16_Pos 16 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH17_Pos 17 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH18_Pos 18 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH19_Pos 19 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH20_Pos 20 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH21_Pos 21 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH22_Pos 22 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH23_Pos 23 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH24_Pos 24 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH25_Pos 25 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH26_Pos 26 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH27_Pos 27 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH28_Pos 28 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH29_Pos 29 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH30_Pos 30 /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH31_Pos 31 /*!< Disable single requests */ + +/* Bit field masks: */ +#define DMA_USEBURSTCLR_CH0_Msk 0x00000001UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH1_Msk 0x00000002UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH2_Msk 0x00000004UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH3_Msk 0x00000008UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH4_Msk 0x00000010UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH5_Msk 0x00000020UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH6_Msk 0x00000040UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH7_Msk 0x00000080UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH8_Msk 0x00000100UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH9_Msk 0x00000200UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH10_Msk 0x00000400UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH11_Msk 0x00000800UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH12_Msk 0x00001000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH13_Msk 0x00002000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH14_Msk 0x00004000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH15_Msk 0x00008000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH16_Msk 0x00010000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH17_Msk 0x00020000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH18_Msk 0x00040000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH19_Msk 0x00080000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH20_Msk 0x00100000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH21_Msk 0x00200000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH22_Msk 0x00400000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH23_Msk 0x00800000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH24_Msk 0x01000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH25_Msk 0x02000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH26_Msk 0x04000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH27_Msk 0x08000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH28_Msk 0x10000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH29_Msk 0x20000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH30_Msk 0x40000000UL /*!< Disable single requests */ +#define DMA_USEBURSTCLR_CH31_Msk 0x80000000UL /*!< Disable single requests */ + +/*-- REQMASKSET: Channel request mask set --------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< External requests are enabled for channel */ + uint32_t CH1 :1; /*!< External requests are enabled for channel */ + uint32_t CH2 :1; /*!< External requests are enabled for channel */ + uint32_t CH3 :1; /*!< External requests are enabled for channel */ + uint32_t CH4 :1; /*!< External requests are enabled for channel */ + uint32_t CH5 :1; /*!< External requests are enabled for channel */ + uint32_t CH6 :1; /*!< External requests are enabled for channel */ + uint32_t CH7 :1; /*!< External requests are enabled for channel */ + uint32_t CH8 :1; /*!< External requests are enabled for channel */ + uint32_t CH9 :1; /*!< External requests are enabled for channel */ + uint32_t CH10 :1; /*!< External requests are enabled for channel */ + uint32_t CH11 :1; /*!< External requests are enabled for channel */ + uint32_t CH12 :1; /*!< External requests are enabled for channel */ + uint32_t CH13 :1; /*!< External requests are enabled for channel */ + uint32_t CH14 :1; /*!< External requests are enabled for channel */ + uint32_t CH15 :1; /*!< External requests are enabled for channel */ + uint32_t CH16 :1; /*!< External requests are enabled for channel */ + uint32_t CH17 :1; /*!< External requests are enabled for channel */ + uint32_t CH18 :1; /*!< External requests are enabled for channel */ + uint32_t CH19 :1; /*!< External requests are enabled for channel */ + uint32_t CH20 :1; /*!< External requests are enabled for channel */ + uint32_t CH21 :1; /*!< External requests are enabled for channel */ + uint32_t CH22 :1; /*!< External requests are enabled for channel */ + uint32_t CH23 :1; /*!< External requests are enabled for channel */ + uint32_t CH24 :1; /*!< External requests are enabled for channel */ + uint32_t CH25 :1; /*!< External requests are enabled for channel */ + uint32_t CH26 :1; /*!< External requests are enabled for channel */ + uint32_t CH27 :1; /*!< External requests are enabled for channel */ + uint32_t CH28 :1; /*!< External requests are enabled for channel */ + uint32_t CH29 :1; /*!< External requests are enabled for channel */ + uint32_t CH30 :1; /*!< External requests are enabled for channel */ + uint32_t CH31 :1; /*!< External requests are enabled for channel */ +} _DMA_REQMASKSET_bits; + +/* Bit field positions: */ +#define DMA_REQMASKSET_CH0_Pos 0 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH1_Pos 1 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH2_Pos 2 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH3_Pos 3 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH4_Pos 4 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH5_Pos 5 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH6_Pos 6 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH7_Pos 7 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH8_Pos 8 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH9_Pos 9 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH10_Pos 10 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH11_Pos 11 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH12_Pos 12 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH13_Pos 13 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH14_Pos 14 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH15_Pos 15 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH16_Pos 16 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH17_Pos 17 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH18_Pos 18 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH19_Pos 19 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH20_Pos 20 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH21_Pos 21 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH22_Pos 22 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH23_Pos 23 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH24_Pos 24 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH25_Pos 25 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH26_Pos 26 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH27_Pos 27 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH28_Pos 28 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH29_Pos 29 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH30_Pos 30 /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH31_Pos 31 /*!< External requests are enabled for channel */ + +/* Bit field masks: */ +#define DMA_REQMASKSET_CH0_Msk 0x00000001UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH1_Msk 0x00000002UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH2_Msk 0x00000004UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH3_Msk 0x00000008UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH4_Msk 0x00000010UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH5_Msk 0x00000020UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH6_Msk 0x00000040UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH7_Msk 0x00000080UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH8_Msk 0x00000100UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH9_Msk 0x00000200UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH10_Msk 0x00000400UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH11_Msk 0x00000800UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH12_Msk 0x00001000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH13_Msk 0x00002000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH14_Msk 0x00004000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH15_Msk 0x00008000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH16_Msk 0x00010000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH17_Msk 0x00020000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH18_Msk 0x00040000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH19_Msk 0x00080000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH20_Msk 0x00100000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH21_Msk 0x00200000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH22_Msk 0x00400000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH23_Msk 0x00800000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH24_Msk 0x01000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH25_Msk 0x02000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH26_Msk 0x04000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH27_Msk 0x08000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH28_Msk 0x10000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH29_Msk 0x20000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH30_Msk 0x40000000UL /*!< External requests are enabled for channel */ +#define DMA_REQMASKSET_CH31_Msk 0x80000000UL /*!< External requests are enabled for channel */ + +/*-- REQMASKCLR: Channel request mask clear ------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< External requests are disabled for channel */ + uint32_t CH1 :1; /*!< External requests are disabled for channel */ + uint32_t CH2 :1; /*!< External requests are disabled for channel */ + uint32_t CH3 :1; /*!< External requests are disabled for channel */ + uint32_t CH4 :1; /*!< External requests are disabled for channel */ + uint32_t CH5 :1; /*!< External requests are disabled for channel */ + uint32_t CH6 :1; /*!< External requests are disabled for channel */ + uint32_t CH7 :1; /*!< External requests are disabled for channel */ + uint32_t CH8 :1; /*!< External requests are disabled for channel */ + uint32_t CH9 :1; /*!< External requests are disabled for channel */ + uint32_t CH10 :1; /*!< External requests are disabled for channel */ + uint32_t CH11 :1; /*!< External requests are disabled for channel */ + uint32_t CH12 :1; /*!< External requests are disabled for channel */ + uint32_t CH13 :1; /*!< External requests are disabled for channel */ + uint32_t CH14 :1; /*!< External requests are disabled for channel */ + uint32_t CH15 :1; /*!< External requests are disabled for channel */ + uint32_t CH16 :1; /*!< External requests are disabled for channel */ + uint32_t CH17 :1; /*!< External requests are disabled for channel */ + uint32_t CH18 :1; /*!< External requests are disabled for channel */ + uint32_t CH19 :1; /*!< External requests are disabled for channel */ + uint32_t CH20 :1; /*!< External requests are disabled for channel */ + uint32_t CH21 :1; /*!< External requests are disabled for channel */ + uint32_t CH22 :1; /*!< External requests are disabled for channel */ + uint32_t CH23 :1; /*!< External requests are disabled for channel */ + uint32_t CH24 :1; /*!< External requests are disabled for channel */ + uint32_t CH25 :1; /*!< External requests are disabled for channel */ + uint32_t CH26 :1; /*!< External requests are disabled for channel */ + uint32_t CH27 :1; /*!< External requests are disabled for channel */ + uint32_t CH28 :1; /*!< External requests are disabled for channel */ + uint32_t CH29 :1; /*!< External requests are disabled for channel */ + uint32_t CH30 :1; /*!< External requests are disabled for channel */ + uint32_t CH31 :1; /*!< External requests are disabled for channel */ +} _DMA_REQMASKCLR_bits; + +/* Bit field positions: */ +#define DMA_REQMASKCLR_CH0_Pos 0 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH1_Pos 1 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH2_Pos 2 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH3_Pos 3 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH4_Pos 4 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH5_Pos 5 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH6_Pos 6 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH7_Pos 7 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH8_Pos 8 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH9_Pos 9 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH10_Pos 10 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH11_Pos 11 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH12_Pos 12 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH13_Pos 13 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH14_Pos 14 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH15_Pos 15 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH16_Pos 16 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH17_Pos 17 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH18_Pos 18 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH19_Pos 19 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH20_Pos 20 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH21_Pos 21 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH22_Pos 22 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH23_Pos 23 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH24_Pos 24 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH25_Pos 25 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH26_Pos 26 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH27_Pos 27 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH28_Pos 28 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH29_Pos 29 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH30_Pos 30 /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH31_Pos 31 /*!< External requests are disabled for channel */ + +/* Bit field masks: */ +#define DMA_REQMASKCLR_CH0_Msk 0x00000001UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH1_Msk 0x00000002UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH2_Msk 0x00000004UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH3_Msk 0x00000008UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH4_Msk 0x00000010UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH5_Msk 0x00000020UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH6_Msk 0x00000040UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH7_Msk 0x00000080UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH8_Msk 0x00000100UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH9_Msk 0x00000200UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH10_Msk 0x00000400UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH11_Msk 0x00000800UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH12_Msk 0x00001000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH13_Msk 0x00002000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH14_Msk 0x00004000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH15_Msk 0x00008000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH16_Msk 0x00010000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH17_Msk 0x00020000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH18_Msk 0x00040000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH19_Msk 0x00080000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH20_Msk 0x00100000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH21_Msk 0x00200000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH22_Msk 0x00400000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH23_Msk 0x00800000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH24_Msk 0x01000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH25_Msk 0x02000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH26_Msk 0x04000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH27_Msk 0x08000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH28_Msk 0x10000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH29_Msk 0x20000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH30_Msk 0x40000000UL /*!< External requests are disabled for channel */ +#define DMA_REQMASKCLR_CH31_Msk 0x80000000UL /*!< External requests are disabled for channel */ + +/*-- ENSET: Channel enable set -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Enable channel */ + uint32_t CH1 :1; /*!< Enable channel */ + uint32_t CH2 :1; /*!< Enable channel */ + uint32_t CH3 :1; /*!< Enable channel */ + uint32_t CH4 :1; /*!< Enable channel */ + uint32_t CH5 :1; /*!< Enable channel */ + uint32_t CH6 :1; /*!< Enable channel */ + uint32_t CH7 :1; /*!< Enable channel */ + uint32_t CH8 :1; /*!< Enable channel */ + uint32_t CH9 :1; /*!< Enable channel */ + uint32_t CH10 :1; /*!< Enable channel */ + uint32_t CH11 :1; /*!< Enable channel */ + uint32_t CH12 :1; /*!< Enable channel */ + uint32_t CH13 :1; /*!< Enable channel */ + uint32_t CH14 :1; /*!< Enable channel */ + uint32_t CH15 :1; /*!< Enable channel */ + uint32_t CH16 :1; /*!< Enable channel */ + uint32_t CH17 :1; /*!< Enable channel */ + uint32_t CH18 :1; /*!< Enable channel */ + uint32_t CH19 :1; /*!< Enable channel */ + uint32_t CH20 :1; /*!< Enable channel */ + uint32_t CH21 :1; /*!< Enable channel */ + uint32_t CH22 :1; /*!< Enable channel */ + uint32_t CH23 :1; /*!< Enable channel */ + uint32_t CH24 :1; /*!< Enable channel */ + uint32_t CH25 :1; /*!< Enable channel */ + uint32_t CH26 :1; /*!< Enable channel */ + uint32_t CH27 :1; /*!< Enable channel */ + uint32_t CH28 :1; /*!< Enable channel */ + uint32_t CH29 :1; /*!< Enable channel */ + uint32_t CH30 :1; /*!< Enable channel */ + uint32_t CH31 :1; /*!< Enable channel */ +} _DMA_ENSET_bits; + +/* Bit field positions: */ +#define DMA_ENSET_CH0_Pos 0 /*!< Enable channel */ +#define DMA_ENSET_CH1_Pos 1 /*!< Enable channel */ +#define DMA_ENSET_CH2_Pos 2 /*!< Enable channel */ +#define DMA_ENSET_CH3_Pos 3 /*!< Enable channel */ +#define DMA_ENSET_CH4_Pos 4 /*!< Enable channel */ +#define DMA_ENSET_CH5_Pos 5 /*!< Enable channel */ +#define DMA_ENSET_CH6_Pos 6 /*!< Enable channel */ +#define DMA_ENSET_CH7_Pos 7 /*!< Enable channel */ +#define DMA_ENSET_CH8_Pos 8 /*!< Enable channel */ +#define DMA_ENSET_CH9_Pos 9 /*!< Enable channel */ +#define DMA_ENSET_CH10_Pos 10 /*!< Enable channel */ +#define DMA_ENSET_CH11_Pos 11 /*!< Enable channel */ +#define DMA_ENSET_CH12_Pos 12 /*!< Enable channel */ +#define DMA_ENSET_CH13_Pos 13 /*!< Enable channel */ +#define DMA_ENSET_CH14_Pos 14 /*!< Enable channel */ +#define DMA_ENSET_CH15_Pos 15 /*!< Enable channel */ +#define DMA_ENSET_CH16_Pos 16 /*!< Enable channel */ +#define DMA_ENSET_CH17_Pos 17 /*!< Enable channel */ +#define DMA_ENSET_CH18_Pos 18 /*!< Enable channel */ +#define DMA_ENSET_CH19_Pos 19 /*!< Enable channel */ +#define DMA_ENSET_CH20_Pos 20 /*!< Enable channel */ +#define DMA_ENSET_CH21_Pos 21 /*!< Enable channel */ +#define DMA_ENSET_CH22_Pos 22 /*!< Enable channel */ +#define DMA_ENSET_CH23_Pos 23 /*!< Enable channel */ +#define DMA_ENSET_CH24_Pos 24 /*!< Enable channel */ +#define DMA_ENSET_CH25_Pos 25 /*!< Enable channel */ +#define DMA_ENSET_CH26_Pos 26 /*!< Enable channel */ +#define DMA_ENSET_CH27_Pos 27 /*!< Enable channel */ +#define DMA_ENSET_CH28_Pos 28 /*!< Enable channel */ +#define DMA_ENSET_CH29_Pos 29 /*!< Enable channel */ +#define DMA_ENSET_CH30_Pos 30 /*!< Enable channel */ +#define DMA_ENSET_CH31_Pos 31 /*!< Enable channel */ + +/* Bit field masks: */ +#define DMA_ENSET_CH0_Msk 0x00000001UL /*!< Enable channel */ +#define DMA_ENSET_CH1_Msk 0x00000002UL /*!< Enable channel */ +#define DMA_ENSET_CH2_Msk 0x00000004UL /*!< Enable channel */ +#define DMA_ENSET_CH3_Msk 0x00000008UL /*!< Enable channel */ +#define DMA_ENSET_CH4_Msk 0x00000010UL /*!< Enable channel */ +#define DMA_ENSET_CH5_Msk 0x00000020UL /*!< Enable channel */ +#define DMA_ENSET_CH6_Msk 0x00000040UL /*!< Enable channel */ +#define DMA_ENSET_CH7_Msk 0x00000080UL /*!< Enable channel */ +#define DMA_ENSET_CH8_Msk 0x00000100UL /*!< Enable channel */ +#define DMA_ENSET_CH9_Msk 0x00000200UL /*!< Enable channel */ +#define DMA_ENSET_CH10_Msk 0x00000400UL /*!< Enable channel */ +#define DMA_ENSET_CH11_Msk 0x00000800UL /*!< Enable channel */ +#define DMA_ENSET_CH12_Msk 0x00001000UL /*!< Enable channel */ +#define DMA_ENSET_CH13_Msk 0x00002000UL /*!< Enable channel */ +#define DMA_ENSET_CH14_Msk 0x00004000UL /*!< Enable channel */ +#define DMA_ENSET_CH15_Msk 0x00008000UL /*!< Enable channel */ +#define DMA_ENSET_CH16_Msk 0x00010000UL /*!< Enable channel */ +#define DMA_ENSET_CH17_Msk 0x00020000UL /*!< Enable channel */ +#define DMA_ENSET_CH18_Msk 0x00040000UL /*!< Enable channel */ +#define DMA_ENSET_CH19_Msk 0x00080000UL /*!< Enable channel */ +#define DMA_ENSET_CH20_Msk 0x00100000UL /*!< Enable channel */ +#define DMA_ENSET_CH21_Msk 0x00200000UL /*!< Enable channel */ +#define DMA_ENSET_CH22_Msk 0x00400000UL /*!< Enable channel */ +#define DMA_ENSET_CH23_Msk 0x00800000UL /*!< Enable channel */ +#define DMA_ENSET_CH24_Msk 0x01000000UL /*!< Enable channel */ +#define DMA_ENSET_CH25_Msk 0x02000000UL /*!< Enable channel */ +#define DMA_ENSET_CH26_Msk 0x04000000UL /*!< Enable channel */ +#define DMA_ENSET_CH27_Msk 0x08000000UL /*!< Enable channel */ +#define DMA_ENSET_CH28_Msk 0x10000000UL /*!< Enable channel */ +#define DMA_ENSET_CH29_Msk 0x20000000UL /*!< Enable channel */ +#define DMA_ENSET_CH30_Msk 0x40000000UL /*!< Enable channel */ +#define DMA_ENSET_CH31_Msk 0x80000000UL /*!< Enable channel */ + +/*-- ENCLR: Channel enable clear -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Disable channel */ + uint32_t CH1 :1; /*!< Disable channel */ + uint32_t CH2 :1; /*!< Disable channel */ + uint32_t CH3 :1; /*!< Disable channel */ + uint32_t CH4 :1; /*!< Disable channel */ + uint32_t CH5 :1; /*!< Disable channel */ + uint32_t CH6 :1; /*!< Disable channel */ + uint32_t CH7 :1; /*!< Disable channel */ + uint32_t CH8 :1; /*!< Disable channel */ + uint32_t CH9 :1; /*!< Disable channel */ + uint32_t CH10 :1; /*!< Disable channel */ + uint32_t CH11 :1; /*!< Disable channel */ + uint32_t CH12 :1; /*!< Disable channel */ + uint32_t CH13 :1; /*!< Disable channel */ + uint32_t CH14 :1; /*!< Disable channel */ + uint32_t CH15 :1; /*!< Disable channel */ + uint32_t CH16 :1; /*!< Disable channel */ + uint32_t CH17 :1; /*!< Disable channel */ + uint32_t CH18 :1; /*!< Disable channel */ + uint32_t CH19 :1; /*!< Disable channel */ + uint32_t CH20 :1; /*!< Disable channel */ + uint32_t CH21 :1; /*!< Disable channel */ + uint32_t CH22 :1; /*!< Disable channel */ + uint32_t CH23 :1; /*!< Disable channel */ + uint32_t CH24 :1; /*!< Disable channel */ + uint32_t CH25 :1; /*!< Disable channel */ + uint32_t CH26 :1; /*!< Disable channel */ + uint32_t CH27 :1; /*!< Disable channel */ + uint32_t CH28 :1; /*!< Disable channel */ + uint32_t CH29 :1; /*!< Disable channel */ + uint32_t CH30 :1; /*!< Disable channel */ + uint32_t CH31 :1; /*!< Disable channel */ +} _DMA_ENCLR_bits; + +/* Bit field positions: */ +#define DMA_ENCLR_CH0_Pos 0 /*!< Disable channel */ +#define DMA_ENCLR_CH1_Pos 1 /*!< Disable channel */ +#define DMA_ENCLR_CH2_Pos 2 /*!< Disable channel */ +#define DMA_ENCLR_CH3_Pos 3 /*!< Disable channel */ +#define DMA_ENCLR_CH4_Pos 4 /*!< Disable channel */ +#define DMA_ENCLR_CH5_Pos 5 /*!< Disable channel */ +#define DMA_ENCLR_CH6_Pos 6 /*!< Disable channel */ +#define DMA_ENCLR_CH7_Pos 7 /*!< Disable channel */ +#define DMA_ENCLR_CH8_Pos 8 /*!< Disable channel */ +#define DMA_ENCLR_CH9_Pos 9 /*!< Disable channel */ +#define DMA_ENCLR_CH10_Pos 10 /*!< Disable channel */ +#define DMA_ENCLR_CH11_Pos 11 /*!< Disable channel */ +#define DMA_ENCLR_CH12_Pos 12 /*!< Disable channel */ +#define DMA_ENCLR_CH13_Pos 13 /*!< Disable channel */ +#define DMA_ENCLR_CH14_Pos 14 /*!< Disable channel */ +#define DMA_ENCLR_CH15_Pos 15 /*!< Disable channel */ +#define DMA_ENCLR_CH16_Pos 16 /*!< Disable channel */ +#define DMA_ENCLR_CH17_Pos 17 /*!< Disable channel */ +#define DMA_ENCLR_CH18_Pos 18 /*!< Disable channel */ +#define DMA_ENCLR_CH19_Pos 19 /*!< Disable channel */ +#define DMA_ENCLR_CH20_Pos 20 /*!< Disable channel */ +#define DMA_ENCLR_CH21_Pos 21 /*!< Disable channel */ +#define DMA_ENCLR_CH22_Pos 22 /*!< Disable channel */ +#define DMA_ENCLR_CH23_Pos 23 /*!< Disable channel */ +#define DMA_ENCLR_CH24_Pos 24 /*!< Disable channel */ +#define DMA_ENCLR_CH25_Pos 25 /*!< Disable channel */ +#define DMA_ENCLR_CH26_Pos 26 /*!< Disable channel */ +#define DMA_ENCLR_CH27_Pos 27 /*!< Disable channel */ +#define DMA_ENCLR_CH28_Pos 28 /*!< Disable channel */ +#define DMA_ENCLR_CH29_Pos 29 /*!< Disable channel */ +#define DMA_ENCLR_CH30_Pos 30 /*!< Disable channel */ +#define DMA_ENCLR_CH31_Pos 31 /*!< Disable channel */ + +/* Bit field masks: */ +#define DMA_ENCLR_CH0_Msk 0x00000001UL /*!< Disable channel */ +#define DMA_ENCLR_CH1_Msk 0x00000002UL /*!< Disable channel */ +#define DMA_ENCLR_CH2_Msk 0x00000004UL /*!< Disable channel */ +#define DMA_ENCLR_CH3_Msk 0x00000008UL /*!< Disable channel */ +#define DMA_ENCLR_CH4_Msk 0x00000010UL /*!< Disable channel */ +#define DMA_ENCLR_CH5_Msk 0x00000020UL /*!< Disable channel */ +#define DMA_ENCLR_CH6_Msk 0x00000040UL /*!< Disable channel */ +#define DMA_ENCLR_CH7_Msk 0x00000080UL /*!< Disable channel */ +#define DMA_ENCLR_CH8_Msk 0x00000100UL /*!< Disable channel */ +#define DMA_ENCLR_CH9_Msk 0x00000200UL /*!< Disable channel */ +#define DMA_ENCLR_CH10_Msk 0x00000400UL /*!< Disable channel */ +#define DMA_ENCLR_CH11_Msk 0x00000800UL /*!< Disable channel */ +#define DMA_ENCLR_CH12_Msk 0x00001000UL /*!< Disable channel */ +#define DMA_ENCLR_CH13_Msk 0x00002000UL /*!< Disable channel */ +#define DMA_ENCLR_CH14_Msk 0x00004000UL /*!< Disable channel */ +#define DMA_ENCLR_CH15_Msk 0x00008000UL /*!< Disable channel */ +#define DMA_ENCLR_CH16_Msk 0x00010000UL /*!< Disable channel */ +#define DMA_ENCLR_CH17_Msk 0x00020000UL /*!< Disable channel */ +#define DMA_ENCLR_CH18_Msk 0x00040000UL /*!< Disable channel */ +#define DMA_ENCLR_CH19_Msk 0x00080000UL /*!< Disable channel */ +#define DMA_ENCLR_CH20_Msk 0x00100000UL /*!< Disable channel */ +#define DMA_ENCLR_CH21_Msk 0x00200000UL /*!< Disable channel */ +#define DMA_ENCLR_CH22_Msk 0x00400000UL /*!< Disable channel */ +#define DMA_ENCLR_CH23_Msk 0x00800000UL /*!< Disable channel */ +#define DMA_ENCLR_CH24_Msk 0x01000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH25_Msk 0x02000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH26_Msk 0x04000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH27_Msk 0x08000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH28_Msk 0x10000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH29_Msk 0x20000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH30_Msk 0x40000000UL /*!< Disable channel */ +#define DMA_ENCLR_CH31_Msk 0x80000000UL /*!< Disable channel */ + +/*-- PRIALTSET: Channel primary-alternate set ----------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH1 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH2 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH3 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH4 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH5 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH6 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH7 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH8 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH9 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH10 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH11 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH12 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH13 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH14 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH15 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH16 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH17 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH18 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH19 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH20 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH21 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH22 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH23 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH24 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH25 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH26 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH27 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH28 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH29 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH30 :1; /*!< Set primary / alternate channel control data structure */ + uint32_t CH31 :1; /*!< Set primary / alternate channel control data structure */ +} _DMA_PRIALTSET_bits; + +/* Bit field positions: */ +#define DMA_PRIALTSET_CH0_Pos 0 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH1_Pos 1 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH2_Pos 2 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH3_Pos 3 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH4_Pos 4 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH5_Pos 5 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH6_Pos 6 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH7_Pos 7 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH8_Pos 8 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH9_Pos 9 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH10_Pos 10 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH11_Pos 11 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH12_Pos 12 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH13_Pos 13 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH14_Pos 14 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH15_Pos 15 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH16_Pos 16 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH17_Pos 17 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH18_Pos 18 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH19_Pos 19 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH20_Pos 20 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH21_Pos 21 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH22_Pos 22 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH23_Pos 23 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH24_Pos 24 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH25_Pos 25 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH26_Pos 26 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH27_Pos 27 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH28_Pos 28 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH29_Pos 29 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH30_Pos 30 /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH31_Pos 31 /*!< Set primary / alternate channel control data structure */ + +/* Bit field masks: */ +#define DMA_PRIALTSET_CH0_Msk 0x00000001UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH1_Msk 0x00000002UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH2_Msk 0x00000004UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH3_Msk 0x00000008UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH4_Msk 0x00000010UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH5_Msk 0x00000020UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH6_Msk 0x00000040UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH7_Msk 0x00000080UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH8_Msk 0x00000100UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH9_Msk 0x00000200UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH10_Msk 0x00000400UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH11_Msk 0x00000800UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH12_Msk 0x00001000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH13_Msk 0x00002000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH14_Msk 0x00004000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH15_Msk 0x00008000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH16_Msk 0x00010000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH17_Msk 0x00020000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH18_Msk 0x00040000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH19_Msk 0x00080000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH20_Msk 0x00100000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH21_Msk 0x00200000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH22_Msk 0x00400000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH23_Msk 0x00800000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH24_Msk 0x01000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH25_Msk 0x02000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH26_Msk 0x04000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH27_Msk 0x08000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH28_Msk 0x10000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH29_Msk 0x20000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH30_Msk 0x40000000UL /*!< Set primary / alternate channel control data structure */ +#define DMA_PRIALTSET_CH31_Msk 0x80000000UL /*!< Set primary / alternate channel control data structure */ + +/*-- PRIALTCLR: Channel primary-alternate clear --------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH1 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH2 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH3 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH4 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH5 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH6 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH7 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH8 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH9 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH10 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH11 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH12 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH13 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH14 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH15 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH16 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH17 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH18 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH19 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH20 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH21 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH22 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH23 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH24 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH25 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH26 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH27 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH28 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH29 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH30 :1; /*!< Clear primary / alternate channel control data structure */ + uint32_t CH31 :1; /*!< Clear primary / alternate channel control data structure */ +} _DMA_PRIALTCLR_bits; + +/* Bit field positions: */ +#define DMA_PRIALTCLR_CH0_Pos 0 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH1_Pos 1 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH2_Pos 2 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH3_Pos 3 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH4_Pos 4 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH5_Pos 5 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH6_Pos 6 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH7_Pos 7 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH8_Pos 8 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH9_Pos 9 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH10_Pos 10 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH11_Pos 11 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH12_Pos 12 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH13_Pos 13 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH14_Pos 14 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH15_Pos 15 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH16_Pos 16 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH17_Pos 17 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH18_Pos 18 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH19_Pos 19 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH20_Pos 20 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH21_Pos 21 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH22_Pos 22 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH23_Pos 23 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH24_Pos 24 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH25_Pos 25 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH26_Pos 26 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH27_Pos 27 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH28_Pos 28 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH29_Pos 29 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH30_Pos 30 /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH31_Pos 31 /*!< Clear primary / alternate channel control data structure */ + +/* Bit field masks: */ +#define DMA_PRIALTCLR_CH0_Msk 0x00000001UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH1_Msk 0x00000002UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH2_Msk 0x00000004UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH3_Msk 0x00000008UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH4_Msk 0x00000010UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH5_Msk 0x00000020UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH6_Msk 0x00000040UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH7_Msk 0x00000080UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH8_Msk 0x00000100UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH9_Msk 0x00000200UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH10_Msk 0x00000400UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH11_Msk 0x00000800UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH12_Msk 0x00001000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH13_Msk 0x00002000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH14_Msk 0x00004000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH15_Msk 0x00008000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH16_Msk 0x00010000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH17_Msk 0x00020000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH18_Msk 0x00040000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH19_Msk 0x00080000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH20_Msk 0x00100000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH21_Msk 0x00200000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH22_Msk 0x00400000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH23_Msk 0x00800000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH24_Msk 0x01000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH25_Msk 0x02000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH26_Msk 0x04000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH27_Msk 0x08000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH28_Msk 0x10000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH29_Msk 0x20000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH30_Msk 0x40000000UL /*!< Clear primary / alternate channel control data structure */ +#define DMA_PRIALTCLR_CH31_Msk 0x80000000UL /*!< Clear primary / alternate channel control data structure */ + +/*-- PRIORITYSET: Channel priority set -----------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Set the priority of channel */ + uint32_t CH1 :1; /*!< Set the priority of channel */ + uint32_t CH2 :1; /*!< Set the priority of channel */ + uint32_t CH3 :1; /*!< Set the priority of channel */ + uint32_t CH4 :1; /*!< Set the priority of channel */ + uint32_t CH5 :1; /*!< Set the priority of channel */ + uint32_t CH6 :1; /*!< Set the priority of channel */ + uint32_t CH7 :1; /*!< Set the priority of channel */ + uint32_t CH8 :1; /*!< Set the priority of channel */ + uint32_t CH9 :1; /*!< Set the priority of channel */ + uint32_t CH10 :1; /*!< Set the priority of channel */ + uint32_t CH11 :1; /*!< Set the priority of channel */ + uint32_t CH12 :1; /*!< Set the priority of channel */ + uint32_t CH13 :1; /*!< Set the priority of channel */ + uint32_t CH14 :1; /*!< Set the priority of channel */ + uint32_t CH15 :1; /*!< Set the priority of channel */ + uint32_t CH16 :1; /*!< Set the priority of channel */ + uint32_t CH17 :1; /*!< Set the priority of channel */ + uint32_t CH18 :1; /*!< Set the priority of channel */ + uint32_t CH19 :1; /*!< Set the priority of channel */ + uint32_t CH20 :1; /*!< Set the priority of channel */ + uint32_t CH21 :1; /*!< Set the priority of channel */ + uint32_t CH22 :1; /*!< Set the priority of channel */ + uint32_t CH23 :1; /*!< Set the priority of channel */ + uint32_t CH24 :1; /*!< Set the priority of channel */ + uint32_t CH25 :1; /*!< Set the priority of channel */ + uint32_t CH26 :1; /*!< Set the priority of channel */ + uint32_t CH27 :1; /*!< Set the priority of channel */ + uint32_t CH28 :1; /*!< Set the priority of channel */ + uint32_t CH29 :1; /*!< Set the priority of channel */ + uint32_t CH30 :1; /*!< Set the priority of channel */ + uint32_t CH31 :1; /*!< Set the priority of channel */ +} _DMA_PRIORITYSET_bits; + +/* Bit field positions: */ +#define DMA_PRIORITYSET_CH0_Pos 0 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH1_Pos 1 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH2_Pos 2 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH3_Pos 3 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH4_Pos 4 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH5_Pos 5 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH6_Pos 6 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH7_Pos 7 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH8_Pos 8 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH9_Pos 9 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH10_Pos 10 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH11_Pos 11 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH12_Pos 12 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH13_Pos 13 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH14_Pos 14 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH15_Pos 15 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH16_Pos 16 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH17_Pos 17 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH18_Pos 18 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH19_Pos 19 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH20_Pos 20 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH21_Pos 21 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH22_Pos 22 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH23_Pos 23 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH24_Pos 24 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH25_Pos 25 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH26_Pos 26 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH27_Pos 27 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH28_Pos 28 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH29_Pos 29 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH30_Pos 30 /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH31_Pos 31 /*!< Set the priority of channel */ + +/* Bit field masks: */ +#define DMA_PRIORITYSET_CH0_Msk 0x00000001UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH1_Msk 0x00000002UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH2_Msk 0x00000004UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH3_Msk 0x00000008UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH4_Msk 0x00000010UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH5_Msk 0x00000020UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH6_Msk 0x00000040UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH7_Msk 0x00000080UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH8_Msk 0x00000100UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH9_Msk 0x00000200UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH10_Msk 0x00000400UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH11_Msk 0x00000800UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH12_Msk 0x00001000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH13_Msk 0x00002000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH14_Msk 0x00004000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH15_Msk 0x00008000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH16_Msk 0x00010000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH17_Msk 0x00020000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH18_Msk 0x00040000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH19_Msk 0x00080000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH20_Msk 0x00100000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH21_Msk 0x00200000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH22_Msk 0x00400000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH23_Msk 0x00800000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH24_Msk 0x01000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH25_Msk 0x02000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH26_Msk 0x04000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH27_Msk 0x08000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH28_Msk 0x10000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH29_Msk 0x20000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH30_Msk 0x40000000UL /*!< Set the priority of channel */ +#define DMA_PRIORITYSET_CH31_Msk 0x80000000UL /*!< Set the priority of channel */ + +/*-- PRIORITYCLR: Channel priority clear ---------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Clear the priority */ + uint32_t CH1 :1; /*!< Clear the priority */ + uint32_t CH2 :1; /*!< Clear the priority */ + uint32_t CH3 :1; /*!< Clear the priority */ + uint32_t CH4 :1; /*!< Clear the priority */ + uint32_t CH5 :1; /*!< Clear the priority */ + uint32_t CH6 :1; /*!< Clear the priority */ + uint32_t CH7 :1; /*!< Clear the priority */ + uint32_t CH8 :1; /*!< Clear the priority */ + uint32_t CH9 :1; /*!< Clear the priority */ + uint32_t CH10 :1; /*!< Clear the priority */ + uint32_t CH11 :1; /*!< Clear the priority */ + uint32_t CH12 :1; /*!< Clear the priority */ + uint32_t CH13 :1; /*!< Clear the priority */ + uint32_t CH14 :1; /*!< Clear the priority */ + uint32_t CH15 :1; /*!< Clear the priority */ + uint32_t CH16 :1; /*!< Clear the priority */ + uint32_t CH17 :1; /*!< Clear the priority */ + uint32_t CH18 :1; /*!< Clear the priority */ + uint32_t CH19 :1; /*!< Clear the priority */ + uint32_t CH20 :1; /*!< Clear the priority */ + uint32_t CH21 :1; /*!< Clear the priority */ + uint32_t CH22 :1; /*!< Clear the priority */ + uint32_t CH23 :1; /*!< Clear the priority */ + uint32_t CH24 :1; /*!< Clear the priority */ + uint32_t CH25 :1; /*!< Clear the priority */ + uint32_t CH26 :1; /*!< Clear the priority */ + uint32_t CH27 :1; /*!< Clear the priority */ + uint32_t CH28 :1; /*!< Clear the priority */ + uint32_t CH29 :1; /*!< Clear the priority */ + uint32_t CH30 :1; /*!< Clear the priority */ + uint32_t CH31 :1; /*!< Clear the priority */ +} _DMA_PRIORITYCLR_bits; + +/* Bit field positions: */ +#define DMA_PRIORITYCLR_CH0_Pos 0 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH1_Pos 1 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH2_Pos 2 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH3_Pos 3 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH4_Pos 4 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH5_Pos 5 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH6_Pos 6 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH7_Pos 7 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH8_Pos 8 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH9_Pos 9 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH10_Pos 10 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH11_Pos 11 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH12_Pos 12 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH13_Pos 13 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH14_Pos 14 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH15_Pos 15 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH16_Pos 16 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH17_Pos 17 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH18_Pos 18 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH19_Pos 19 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH20_Pos 20 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH21_Pos 21 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH22_Pos 22 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH23_Pos 23 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH24_Pos 24 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH25_Pos 25 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH26_Pos 26 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH27_Pos 27 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH28_Pos 28 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH29_Pos 29 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH30_Pos 30 /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH31_Pos 31 /*!< Clear the priority */ + +/* Bit field masks: */ +#define DMA_PRIORITYCLR_CH0_Msk 0x00000001UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH1_Msk 0x00000002UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH2_Msk 0x00000004UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH3_Msk 0x00000008UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH4_Msk 0x00000010UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH5_Msk 0x00000020UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH6_Msk 0x00000040UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH7_Msk 0x00000080UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH8_Msk 0x00000100UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH9_Msk 0x00000200UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH10_Msk 0x00000400UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH11_Msk 0x00000800UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH12_Msk 0x00001000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH13_Msk 0x00002000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH14_Msk 0x00004000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH15_Msk 0x00008000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH16_Msk 0x00010000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH17_Msk 0x00020000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH18_Msk 0x00040000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH19_Msk 0x00080000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH20_Msk 0x00100000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH21_Msk 0x00200000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH22_Msk 0x00400000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH23_Msk 0x00800000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH24_Msk 0x01000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH25_Msk 0x02000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH26_Msk 0x04000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH27_Msk 0x08000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH28_Msk 0x10000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH29_Msk 0x20000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH30_Msk 0x40000000UL /*!< Clear the priority */ +#define DMA_PRIORITYCLR_CH31_Msk 0x80000000UL /*!< Clear the priority */ + +/*-- CIRCULARSET: Channel circular set -----------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Set the channel circular mode */ + uint32_t CH1 :1; /*!< Set the channel circular mode */ + uint32_t CH2 :1; /*!< Set the channel circular mode */ + uint32_t CH3 :1; /*!< Set the channel circular mode */ + uint32_t CH4 :1; /*!< Set the channel circular mode */ + uint32_t CH5 :1; /*!< Set the channel circular mode */ + uint32_t CH6 :1; /*!< Set the channel circular mode */ + uint32_t CH7 :1; /*!< Set the channel circular mode */ + uint32_t CH8 :1; /*!< Set the channel circular mode */ + uint32_t CH9 :1; /*!< Set the channel circular mode */ + uint32_t CH10 :1; /*!< Set the channel circular mode */ + uint32_t CH11 :1; /*!< Set the channel circular mode */ + uint32_t CH12 :1; /*!< Set the channel circular mode */ + uint32_t CH13 :1; /*!< Set the channel circular mode */ + uint32_t CH14 :1; /*!< Set the channel circular mode */ + uint32_t CH15 :1; /*!< Set the channel circular mode */ + uint32_t CH16 :1; /*!< Set the channel circular mode */ + uint32_t CH17 :1; /*!< Set the channel circular mode */ + uint32_t CH18 :1; /*!< Set the channel circular mode */ + uint32_t CH19 :1; /*!< Set the channel circular mode */ + uint32_t CH20 :1; /*!< Set the channel circular mode */ + uint32_t CH21 :1; /*!< Set the channel circular mode */ + uint32_t CH22 :1; /*!< Set the channel circular mode */ + uint32_t CH23 :1; /*!< Set the channel circular mode */ + uint32_t CH24 :1; /*!< Set the channel circular mode */ + uint32_t CH25 :1; /*!< Set the channel circular mode */ + uint32_t CH26 :1; /*!< Set the channel circular mode */ + uint32_t CH27 :1; /*!< Set the channel circular mode */ + uint32_t CH28 :1; /*!< Set the channel circular mode */ + uint32_t CH29 :1; /*!< Set the channel circular mode */ + uint32_t CH30 :1; /*!< Set the channel circular mode */ + uint32_t CH31 :1; /*!< Set the channel circular mode */ +} _DMA_CIRCULARSET_bits; + +/* Bit field positions: */ +#define DMA_CIRCULARSET_CH0_Pos 0 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH1_Pos 1 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH2_Pos 2 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH3_Pos 3 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH4_Pos 4 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH5_Pos 5 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH6_Pos 6 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH7_Pos 7 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH8_Pos 8 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH9_Pos 9 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH10_Pos 10 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH11_Pos 11 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH12_Pos 12 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH13_Pos 13 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH14_Pos 14 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH15_Pos 15 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH16_Pos 16 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH17_Pos 17 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH18_Pos 18 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH19_Pos 19 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH20_Pos 20 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH21_Pos 21 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH22_Pos 22 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH23_Pos 23 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH24_Pos 24 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH25_Pos 25 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH26_Pos 26 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH27_Pos 27 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH28_Pos 28 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH29_Pos 29 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH30_Pos 30 /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH31_Pos 31 /*!< Set the channel circular mode */ + +/* Bit field masks: */ +#define DMA_CIRCULARSET_CH0_Msk 0x00000001UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH1_Msk 0x00000002UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH2_Msk 0x00000004UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH3_Msk 0x00000008UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH4_Msk 0x00000010UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH5_Msk 0x00000020UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH6_Msk 0x00000040UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH7_Msk 0x00000080UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH8_Msk 0x00000100UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH9_Msk 0x00000200UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH10_Msk 0x00000400UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH11_Msk 0x00000800UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH12_Msk 0x00001000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH13_Msk 0x00002000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH14_Msk 0x00004000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH15_Msk 0x00008000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH16_Msk 0x00010000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH17_Msk 0x00020000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH18_Msk 0x00040000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH19_Msk 0x00080000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH20_Msk 0x00100000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH21_Msk 0x00200000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH22_Msk 0x00400000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH23_Msk 0x00800000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH24_Msk 0x01000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH25_Msk 0x02000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH26_Msk 0x04000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH27_Msk 0x08000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH28_Msk 0x10000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH29_Msk 0x20000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH30_Msk 0x40000000UL /*!< Set the channel circular mode */ +#define DMA_CIRCULARSET_CH31_Msk 0x80000000UL /*!< Set the channel circular mode */ + +/*-- CIRCULARCLR: Channel circular clear ---------------------------------------------------------------------*/ +typedef struct { + uint32_t CH0 :1; /*!< Clear the channel circular mode */ + uint32_t CH1 :1; /*!< Clear the channel circular mode */ + uint32_t CH2 :1; /*!< Clear the channel circular mode */ + uint32_t CH3 :1; /*!< Clear the channel circular mode */ + uint32_t CH4 :1; /*!< Clear the channel circular mode */ + uint32_t CH5 :1; /*!< Clear the channel circular mode */ + uint32_t CH6 :1; /*!< Clear the channel circular mode */ + uint32_t CH7 :1; /*!< Clear the channel circular mode */ + uint32_t CH8 :1; /*!< Clear the channel circular mode */ + uint32_t CH9 :1; /*!< Clear the channel circular mode */ + uint32_t CH10 :1; /*!< Clear the channel circular mode */ + uint32_t CH11 :1; /*!< Clear the channel circular mode */ + uint32_t CH12 :1; /*!< Clear the channel circular mode */ + uint32_t CH13 :1; /*!< Clear the channel circular mode */ + uint32_t CH14 :1; /*!< Clear the channel circular mode */ + uint32_t CH15 :1; /*!< Clear the channel circular mode */ + uint32_t CH16 :1; /*!< Clear the channel circular mode */ + uint32_t CH17 :1; /*!< Clear the channel circular mode */ + uint32_t CH18 :1; /*!< Clear the channel circular mode */ + uint32_t CH19 :1; /*!< Clear the channel circular mode */ + uint32_t CH20 :1; /*!< Clear the channel circular mode */ + uint32_t CH21 :1; /*!< Clear the channel circular mode */ + uint32_t CH22 :1; /*!< Clear the channel circular mode */ + uint32_t CH23 :1; /*!< Clear the channel circular mode */ + uint32_t CH24 :1; /*!< Clear the channel circular mode */ + uint32_t CH25 :1; /*!< Clear the channel circular mode */ + uint32_t CH26 :1; /*!< Clear the channel circular mode */ + uint32_t CH27 :1; /*!< Clear the channel circular mode */ + uint32_t CH28 :1; /*!< Clear the channel circular mode */ + uint32_t CH29 :1; /*!< Clear the channel circular mode */ + uint32_t CH30 :1; /*!< Clear the channel circular mode */ + uint32_t CH31 :1; /*!< Clear the channel circular mode */ +} _DMA_CIRCULARCLR_bits; + +/* Bit field positions: */ +#define DMA_CIRCULARCLR_CH0_Pos 0 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH1_Pos 1 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH2_Pos 2 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH3_Pos 3 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH4_Pos 4 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH5_Pos 5 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH6_Pos 6 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH7_Pos 7 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH8_Pos 8 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH9_Pos 9 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH10_Pos 10 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH11_Pos 11 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH12_Pos 12 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH13_Pos 13 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH14_Pos 14 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH15_Pos 15 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH16_Pos 16 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH17_Pos 17 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH18_Pos 18 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH19_Pos 19 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH20_Pos 20 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH21_Pos 21 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH22_Pos 22 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH23_Pos 23 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH24_Pos 24 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH25_Pos 25 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH26_Pos 26 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH27_Pos 27 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH28_Pos 28 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH29_Pos 29 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH30_Pos 30 /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH31_Pos 31 /*!< Clear the channel circular mode */ + +/* Bit field masks: */ +#define DMA_CIRCULARCLR_CH0_Msk 0x00000001UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH1_Msk 0x00000002UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH2_Msk 0x00000004UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH3_Msk 0x00000008UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH4_Msk 0x00000010UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH5_Msk 0x00000020UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH6_Msk 0x00000040UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH7_Msk 0x00000080UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH8_Msk 0x00000100UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH9_Msk 0x00000200UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH10_Msk 0x00000400UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH11_Msk 0x00000800UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH12_Msk 0x00001000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH13_Msk 0x00002000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH14_Msk 0x00004000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH15_Msk 0x00008000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH16_Msk 0x00010000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH17_Msk 0x00020000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH18_Msk 0x00040000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH19_Msk 0x00080000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH20_Msk 0x00100000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH21_Msk 0x00200000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH22_Msk 0x00400000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH23_Msk 0x00800000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH24_Msk 0x01000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH25_Msk 0x02000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH26_Msk 0x04000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH27_Msk 0x08000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH28_Msk 0x10000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH29_Msk 0x20000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH30_Msk 0x40000000UL /*!< Clear the channel circular mode */ +#define DMA_CIRCULARCLR_CH31_Msk 0x80000000UL /*!< Clear the channel circular mode */ + +/*-- ERRCLR: Bus error register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :1; /*!< Indicate Error on bus AHB-Lite */ +} _DMA_ERRCLR_bits; + +/* Bit field positions: */ +#define DMA_ERRCLR_VAL_Pos 0 /*!< Indicate Error on bus AHB-Lite */ + +/* Bit field masks: */ +#define DMA_ERRCLR_VAL_Msk 0x00000001UL /*!< Indicate Error on bus AHB-Lite */ + +typedef struct { + union { /*!< Status DMA register */ + __I uint32_t STATUS; /*!< STATUS : type used for word access */ + __I _DMA_STATUS_bits STATUS_bit; /*!< STATUS_bit: structure used for bit access */ + }; + union { /*!< DMA configuration register */ + __O uint32_t CFG; /*!< CFG : type used for word access */ + __O _DMA_CFG_bits CFG_bit; /*!< CFG_bit: structure used for bit access */ + }; + union { /*!< Channel control data base pointer */ + __IO uint32_t BASEPTR; /*!< BASEPTR : type used for word access */ + __IO _DMA_BASEPTR_bits BASEPTR_bit; /*!< BASEPTR_bit: structure used for bit access */ + }; + union { /*!< Channel alternate control data base pointer */ + __I uint32_t ALTBASEPTR; /*!< ALTBASEPTR : type used for word access */ + __I _DMA_ALTBASEPTR_bits ALTBASEPTR_bit; /*!< ALTBASEPTR_bit: structure used for bit access */ + }; + union { /*!< Channel wait on request status */ + __I uint32_t WAITONREQ; /*!< WAITONREQ : type used for word access */ + __I _DMA_WAITONREQ_bits WAITONREQ_bit; /*!< WAITONREQ_bit: structure used for bit access */ + }; + union { /*!< Channel software request */ + __O uint32_t SWREQ; /*!< SWREQ : type used for word access */ + __O _DMA_SWREQ_bits SWREQ_bit; /*!< SWREQ_bit: structure used for bit access */ + }; + union { /*!< Channel useburst set */ + __IO uint32_t USEBURSTSET; /*!< USEBURSTSET : type used for word access */ + __IO _DMA_USEBURSTSET_bits USEBURSTSET_bit; /*!< USEBURSTSET_bit: structure used for bit access */ + }; + union { /*!< Channel useburst clear */ + __O uint32_t USEBURSTCLR; /*!< USEBURSTCLR : type used for word access */ + __O _DMA_USEBURSTCLR_bits USEBURSTCLR_bit; /*!< USEBURSTCLR_bit: structure used for bit access */ + }; + union { /*!< Channel request mask set */ + __IO uint32_t REQMASKSET; /*!< REQMASKSET : type used for word access */ + __IO _DMA_REQMASKSET_bits REQMASKSET_bit; /*!< REQMASKSET_bit: structure used for bit access */ + }; + union { /*!< Channel request mask clear */ + __O uint32_t REQMASKCLR; /*!< REQMASKCLR : type used for word access */ + __O _DMA_REQMASKCLR_bits REQMASKCLR_bit; /*!< REQMASKCLR_bit: structure used for bit access */ + }; + union { /*!< Channel enable set */ + __IO uint32_t ENSET; /*!< ENSET : type used for word access */ + __IO _DMA_ENSET_bits ENSET_bit; /*!< ENSET_bit: structure used for bit access */ + }; + union { /*!< Channel enable clear */ + __O uint32_t ENCLR; /*!< ENCLR : type used for word access */ + __O _DMA_ENCLR_bits ENCLR_bit; /*!< ENCLR_bit: structure used for bit access */ + }; + union { /*!< Channel primary-alternate set */ + __IO uint32_t PRIALTSET; /*!< PRIALTSET : type used for word access */ + __IO _DMA_PRIALTSET_bits PRIALTSET_bit; /*!< PRIALTSET_bit: structure used for bit access */ + }; + union { /*!< Channel primary-alternate clear */ + __O uint32_t PRIALTCLR; /*!< PRIALTCLR : type used for word access */ + __O _DMA_PRIALTCLR_bits PRIALTCLR_bit; /*!< PRIALTCLR_bit: structure used for bit access */ + }; + union { /*!< Channel priority set */ + __IO uint32_t PRIORITYSET; /*!< PRIORITYSET : type used for word access */ + __IO _DMA_PRIORITYSET_bits PRIORITYSET_bit; /*!< PRIORITYSET_bit: structure used for bit access */ + }; + union { /*!< Channel priority clear */ + __O uint32_t PRIORITYCLR; /*!< PRIORITYCLR : type used for word access */ + __O _DMA_PRIORITYCLR_bits PRIORITYCLR_bit; /*!< PRIORITYCLR_bit: structure used for bit access */ + }; + union { /*!< Channel circular set */ + __IO uint32_t CIRCULARSET; /*!< CIRCULARSET : type used for word access */ + __IO _DMA_CIRCULARSET_bits CIRCULARSET_bit; /*!< CIRCULARSET_bit: structure used for bit access */ + }; + union { /*!< Channel circular clear */ + __O uint32_t CIRCULARCLR; /*!< CIRCULARCLR : type used for word access */ + __O _DMA_CIRCULARCLR_bits CIRCULARCLR_bit; /*!< CIRCULARCLR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0; + union { /*!< Bus error register */ + __IO uint32_t ERRCLR; /*!< ERRCLR : type used for word access */ + __IO _DMA_ERRCLR_bits ERRCLR_bit; /*!< ERRCLR_bit: structure used for bit access */ + }; +} DMA_TypeDef; + + +/******************************************************************************/ +/* MFLASH registers */ +/******************************************************************************/ + +/*-- ADDR: Address Register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :21; /*!< Address value for flash operations */ +} _MFLASH_ADDR_bits; + +/* Bit field positions: */ +#define MFLASH_ADDR_VAL_Pos 0 /*!< Address value for flash operations */ + +/* Bit field masks: */ +#define MFLASH_ADDR_VAL_Msk 0x001FFFFFUL /*!< Address value for flash operations */ + +/*-- DATA: DATA: Data Register --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Data register value for flash operations */ +} _MFLASH_DATA_DATA_bits; + +/* Bit field positions: */ +#define MFLASH_DATA_DATA_VAL_Pos 0 /*!< Data register value for flash operations */ + +/* Bit field masks: */ +#define MFLASH_DATA_DATA_VAL_Msk 0xFFFFFFFFUL /*!< Data register value for flash operations */ + +/*-- CMD: Command Register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t RD :1; /*!< Read enable command */ + uint32_t WR :1; /*!< Write enable command */ + uint32_t ERSEC :1; /*!< Erase sector enable command */ + uint32_t ALLSEC :1; /*!< Select all sectors for erase */ + uint32_t :4; /*!< RESERVED */ + uint32_t NVRON :1; /*!< NVR access bit */ + uint32_t :7; /*!< RESERVED */ + uint32_t KEY :16; /*!< Magic Key for flash access "C0DE" */ +} _MFLASH_CMD_bits; + +/* Bit field positions: */ +#define MFLASH_CMD_RD_Pos 0 /*!< Read enable command */ +#define MFLASH_CMD_WR_Pos 1 /*!< Write enable command */ +#define MFLASH_CMD_ERSEC_Pos 2 /*!< Erase sector enable command */ +#define MFLASH_CMD_ALLSEC_Pos 3 /*!< Select all sectors for erase */ +#define MFLASH_CMD_NVRON_Pos 8 /*!< NVR access bit */ +#define MFLASH_CMD_KEY_Pos 16 /*!< Magic Key for flash access "C0DE" */ + +/* Bit field masks: */ +#define MFLASH_CMD_RD_Msk 0x00000001UL /*!< Read enable command */ +#define MFLASH_CMD_WR_Msk 0x00000002UL /*!< Write enable command */ +#define MFLASH_CMD_ERSEC_Msk 0x00000004UL /*!< Erase sector enable command */ +#define MFLASH_CMD_ALLSEC_Msk 0x00000008UL /*!< Select all sectors for erase */ +#define MFLASH_CMD_NVRON_Msk 0x00000100UL /*!< NVR access bit */ +#define MFLASH_CMD_KEY_Msk 0xFFFF0000UL /*!< Magic Key for flash access "C0DE" */ + +/* Bit field enums: */ +typedef enum { + MFLASH_CMD_KEY_Access = 0xC0DEUL, /*!< magic Key for flash access */ +} MFLASH_CMD_KEY_Enum; + +/*-- STAT: Status Register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BUSY :1; /*!< Busy status bit when command is processing */ + uint32_t IRQF :1; /*!< IRQ Flag set when command done. Set by hardware only if IRQEN bit is set. */ +} _MFLASH_STAT_bits; + +/* Bit field positions: */ +#define MFLASH_STAT_BUSY_Pos 0 /*!< Busy status bit when command is processing */ +#define MFLASH_STAT_IRQF_Pos 1 /*!< IRQ Flag set when command done. Set by hardware only if IRQEN bit is set. */ + +/* Bit field masks: */ +#define MFLASH_STAT_BUSY_Msk 0x00000001UL /*!< Busy status bit when command is processing */ +#define MFLASH_STAT_IRQF_Msk 0x00000002UL /*!< IRQ Flag set when command done. Set by hardware only if IRQEN bit is set. */ + +/*-- CTRL: Control Register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t ICEN :1; /*!< I-Cache enable bit */ + uint32_t DCEN :1; /*!< D-Cache enable bit */ + uint32_t :1; /*!< RESERVED */ + uint32_t IRQEN :1; /*!< Interrupt enable bit */ + uint32_t :3; /*!< RESERVED */ + uint32_t IFLUSH :1; /*!< Flush I-Cache request bit */ + uint32_t DFLUSH :1; /*!< Flush D-Cache request bit */ + uint32_t :6; /*!< RESERVED */ + uint32_t LAT :4; /*!< */ +} _MFLASH_CTRL_bits; + +/* Bit field positions: */ +#define MFLASH_CTRL_ICEN_Pos 1 /*!< I-Cache enable bit */ +#define MFLASH_CTRL_DCEN_Pos 2 /*!< D-Cache enable bit */ +#define MFLASH_CTRL_IRQEN_Pos 4 /*!< Interrupt enable bit */ +#define MFLASH_CTRL_IFLUSH_Pos 8 /*!< Flush I-Cache request bit */ +#define MFLASH_CTRL_DFLUSH_Pos 9 /*!< Flush D-Cache request bit */ +#define MFLASH_CTRL_LAT_Pos 16 /*!< */ + +/* Bit field masks: */ +#define MFLASH_CTRL_ICEN_Msk 0x00000002UL /*!< I-Cache enable bit */ +#define MFLASH_CTRL_DCEN_Msk 0x00000004UL /*!< D-Cache enable bit */ +#define MFLASH_CTRL_IRQEN_Msk 0x00000010UL /*!< Interrupt enable bit */ +#define MFLASH_CTRL_IFLUSH_Msk 0x00000100UL /*!< Flush I-Cache request bit */ +#define MFLASH_CTRL_DFLUSH_Msk 0x00000200UL /*!< Flush D-Cache request bit */ +#define MFLASH_CTRL_LAT_Msk 0x000F0000UL /*!< */ + +/*-- ICSTAT: I-CACHE Status Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t BUSY :1; /*!< I-Cache busy */ +} _MFLASH_ICSTAT_bits; + +/* Bit field positions: */ +#define MFLASH_ICSTAT_BUSY_Pos 0 /*!< I-Cache busy */ + +/* Bit field masks: */ +#define MFLASH_ICSTAT_BUSY_Msk 0x00000001UL /*!< I-Cache busy */ + +/*-- DCSTAT: D-CACHE Status Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t BUSY :1; /*!< D-Cache busy */ +} _MFLASH_DCSTAT_bits; + +/* Bit field positions: */ +#define MFLASH_DCSTAT_BUSY_Pos 0 /*!< D-Cache busy */ + +/* Bit field masks: */ +#define MFLASH_DCSTAT_BUSY_Msk 0x00000001UL /*!< D-Cache busy */ + +//Cluster DATA: +typedef struct { + union { + /*!< Data Register */ + __IO uint32_t DATA; /*!< DATA : type used for word access */ + __IO _MFLASH_DATA_DATA_bits DATA_bit; /*!< DATA_bit: structure used for bit access */ + }; +} _MFLASH_DATA_TypeDef; +typedef struct { + union { /*!< Address Register */ + __IO uint32_t ADDR; /*!< ADDR : type used for word access */ + __IO _MFLASH_ADDR_bits ADDR_bit; /*!< ADDR_bit: structure used for bit access */ + }; + _MFLASH_DATA_TypeDef DATA[16]; + union { /*!< Command Register */ + __IO uint32_t CMD; /*!< CMD : type used for word access */ + __IO _MFLASH_CMD_bits CMD_bit; /*!< CMD_bit: structure used for bit access */ + }; + union { /*!< Status Register */ + __IO uint32_t STAT; /*!< STAT : type used for word access */ + __IO _MFLASH_STAT_bits STAT_bit; /*!< STAT_bit: structure used for bit access */ + }; + union { /*!< Control Register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _MFLASH_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; + union { /*!< I-CACHE Status Register */ + __I uint32_t ICSTAT; /*!< ICSTAT : type used for word access */ + __I _MFLASH_ICSTAT_bits ICSTAT_bit; /*!< ICSTAT_bit: structure used for bit access */ + }; + union { /*!< D-CACHE Status Register */ + __I uint32_t DCSTAT; /*!< DCSTAT : type used for word access */ + __I _MFLASH_DCSTAT_bits DCSTAT_bit; /*!< DCSTAT_bit: structure used for bit access */ + }; +} MFLASH_TypeDef; + + +/******************************************************************************/ +/* BFLASH registers */ +/******************************************************************************/ + +/*-- ADDR: Address Register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :19; /*!< Address value for flash operations */ +} _BFLASH_ADDR_bits; + +/* Bit field positions: */ +#define BFLASH_ADDR_VAL_Pos 0 /*!< Address value for flash operations */ + +/* Bit field masks: */ +#define BFLASH_ADDR_VAL_Msk 0x0007FFFFUL /*!< Address value for flash operations */ + +/*-- DATA: DATA: Data Register --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Data register value for flash operations */ +} _BFLASH_DATA_DATA_bits; + +/* Bit field positions: */ +#define BFLASH_DATA_DATA_VAL_Pos 0 /*!< Data register value for flash operations */ + +/* Bit field masks: */ +#define BFLASH_DATA_DATA_VAL_Msk 0xFFFFFFFFUL /*!< Data register value for flash operations */ + +/*-- CMD: Command Register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t RD :1; /*!< Read enable command */ + uint32_t WR :1; /*!< Write enable command */ + uint32_t ERSEC :1; /*!< Erase sector enable command */ + uint32_t ALLSEC :1; /*!< Enable Erase all flash memory */ + uint32_t :4; /*!< RESERVED */ + uint32_t NVRON :1; /*!< INFO access bit */ + uint32_t :7; /*!< RESERVED */ + uint32_t KEY :16; /*!< Magic Key for flash access "C0DE" */ +} _BFLASH_CMD_bits; + +/* Bit field positions: */ +#define BFLASH_CMD_RD_Pos 0 /*!< Read enable command */ +#define BFLASH_CMD_WR_Pos 1 /*!< Write enable command */ +#define BFLASH_CMD_ERSEC_Pos 2 /*!< Erase sector enable command */ +#define BFLASH_CMD_ALLSEC_Pos 3 /*!< Enable Erase all flash memory */ +#define BFLASH_CMD_NVRON_Pos 8 /*!< INFO access bit */ +#define BFLASH_CMD_KEY_Pos 16 /*!< Magic Key for flash access "C0DE" */ + +/* Bit field masks: */ +#define BFLASH_CMD_RD_Msk 0x00000001UL /*!< Read enable command */ +#define BFLASH_CMD_WR_Msk 0x00000002UL /*!< Write enable command */ +#define BFLASH_CMD_ERSEC_Msk 0x00000004UL /*!< Erase sector enable command */ +#define BFLASH_CMD_ALLSEC_Msk 0x00000008UL /*!< Enable Erase all flash memory */ +#define BFLASH_CMD_NVRON_Msk 0x00000100UL /*!< INFO access bit */ +#define BFLASH_CMD_KEY_Msk 0xFFFF0000UL /*!< Magic Key for flash access "C0DE" */ + +/* Bit field enums: */ +typedef enum { + BFLASH_CMD_KEY_Access = 0xC0DEUL, /*!< magic Key for flash access */ +} BFLASH_CMD_KEY_Enum; + +/*-- STAT: Status Register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BUSY :1; /*!< Busy status bit when command is processing */ + uint32_t IRQF :1; /*!< IRQ Flag set when command done. Set by hardware only if IRQEN bit is set. */ +} _BFLASH_STAT_bits; + +/* Bit field positions: */ +#define BFLASH_STAT_BUSY_Pos 0 /*!< Busy status bit when command is processing */ +#define BFLASH_STAT_IRQF_Pos 1 /*!< IRQ Flag set when command done. Set by hardware only if IRQEN bit is set. */ + +/* Bit field masks: */ +#define BFLASH_STAT_BUSY_Msk 0x00000001UL /*!< Busy status bit when command is processing */ +#define BFLASH_STAT_IRQF_Msk 0x00000002UL /*!< IRQ Flag set when command done. Set by hardware only if IRQEN bit is set. */ + +/*-- CTRL: Control Register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t :4; /*!< RESERVED */ + uint32_t IRQEN :1; /*!< Interrupt enable bit */ + uint32_t :11; /*!< RESERVED */ + uint32_t LAT :4; /*!< Flash latency */ +} _BFLASH_CTRL_bits; + +/* Bit field positions: */ +#define BFLASH_CTRL_IRQEN_Pos 4 /*!< Interrupt enable bit */ +#define BFLASH_CTRL_LAT_Pos 16 /*!< Flash latency */ + +/* Bit field masks: */ +#define BFLASH_CTRL_IRQEN_Msk 0x00000010UL /*!< Interrupt enable bit */ +#define BFLASH_CTRL_LAT_Msk 0x000F0000UL /*!< Flash latency */ + +//Cluster DATA: +typedef struct { + union { + /*!< Data Register */ + __IO uint32_t DATA; /*!< DATA : type used for word access */ + __IO _BFLASH_DATA_DATA_bits DATA_bit; /*!< DATA_bit: structure used for bit access */ + }; +} _BFLASH_DATA_TypeDef; +typedef struct { + union { /*!< Address Register */ + __IO uint32_t ADDR; /*!< ADDR : type used for word access */ + __IO _BFLASH_ADDR_bits ADDR_bit; /*!< ADDR_bit: structure used for bit access */ + }; + _BFLASH_DATA_TypeDef DATA[4]; + __IO uint32_t Reserved0[12]; + union { /*!< Command Register */ + __IO uint32_t CMD; /*!< CMD : type used for word access */ + __IO _BFLASH_CMD_bits CMD_bit; /*!< CMD_bit: structure used for bit access */ + }; + union { /*!< Status Register */ + __IO uint32_t STAT; /*!< STAT : type used for word access */ + __IO _BFLASH_STAT_bits STAT_bit; /*!< STAT_bit: structure used for bit access */ + }; + union { /*!< Control Register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _BFLASH_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; +} BFLASH_TypeDef; + + +/******************************************************************************/ +/* EXTMEM registers */ +/******************************************************************************/ + +/*-- WINCFG: WINCFG: Window Configuration ---------------------------------------------------------------------*/ +typedef struct { + uint32_t MODE :1; /*!< 8/16 bit mode. When 1 - 16 bit mode enabled */ + uint32_t :7; /*!< RESERVED */ + uint32_t RDCYC :4; /*!< Additional Read cycles */ + uint32_t :4; /*!< RESERVED */ + uint32_t WRCYC :4; /*!< Additional Write cycles */ + uint32_t :4; /*!< RESERVED */ + uint32_t TACYC :4; /*!< Turnaround cycles */ +} _EXTMEM_WINCFG_WINCFG_bits; + +/* Bit field positions: */ +#define EXTMEM_WINCFG_WINCFG_MODE_Pos 0 /*!< 8/16 bit mode. When 1 - 16 bit mode enabled */ +#define EXTMEM_WINCFG_WINCFG_RDCYC_Pos 8 /*!< Additional Read cycles */ +#define EXTMEM_WINCFG_WINCFG_WRCYC_Pos 16 /*!< Additional Write cycles */ +#define EXTMEM_WINCFG_WINCFG_TACYC_Pos 24 /*!< Turnaround cycles */ + +/* Bit field masks: */ +#define EXTMEM_WINCFG_WINCFG_MODE_Msk 0x00000001UL /*!< 8/16 bit mode. When 1 - 16 bit mode enabled */ +#define EXTMEM_WINCFG_WINCFG_RDCYC_Msk 0x00000F00UL /*!< Additional Read cycles */ +#define EXTMEM_WINCFG_WINCFG_WRCYC_Msk 0x000F0000UL /*!< Additional Write cycles */ +#define EXTMEM_WINCFG_WINCFG_TACYC_Msk 0x0F000000UL /*!< Turnaround cycles */ + +//Cluster WINCFG: +typedef struct { + union { + /*!< Window Configuration */ + __IO uint32_t WINCFG; /*!< WINCFG : type used for word access */ + __IO _EXTMEM_WINCFG_WINCFG_bits WINCFG_bit; /*!< WINCFG_bit: structure used for bit access */ + }; +} _EXTMEM_WINCFG_TypeDef; +typedef struct { + _EXTMEM_WINCFG_TypeDef WINCFG[8]; +} EXTMEM_TypeDef; + + +/******************************************************************************/ +/* PWM registers */ +/******************************************************************************/ + +/*-- TBCTL: Time-Base Control Register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t CTRMODE :2; /*!< Counter mode */ + uint32_t PHSEN :1; /*!< Counter register load from phase register enable */ + uint32_t PRDLD :1; /*!< Active period register load from shadow register select */ + uint32_t SYNCOSEL :2; /*!< Synchronization Output Select. These bits select the source of the PWM_SYNCO signal. */ + uint32_t SWFSYNC :1; /*!< Software forced synchronization pulse */ + uint32_t HSPCLKDIV :3; /*!< High speed time-base clock prescale bits */ + uint32_t CLKDIV :3; /*!< Time-base clock prescale bits */ + uint32_t PHSDIR :1; /*!< Phase direction bit */ + uint32_t FREESOFT :2; /*!< Emulation mode bits - select the behavior of the time-base counter during emulation events */ + uint32_t SHDWGLOB :1; /*!< Global enabe for all shadow loads */ +} _PWM_TBCTL_bits; + +/* Bit field positions: */ +#define PWM_TBCTL_CTRMODE_Pos 0 /*!< Counter mode */ +#define PWM_TBCTL_PHSEN_Pos 2 /*!< Counter register load from phase register enable */ +#define PWM_TBCTL_PRDLD_Pos 3 /*!< Active period register load from shadow register select */ +#define PWM_TBCTL_SYNCOSEL_Pos 4 /*!< Synchronization Output Select. These bits select the source of the PWM_SYNCO signal. */ +#define PWM_TBCTL_SWFSYNC_Pos 6 /*!< Software forced synchronization pulse */ +#define PWM_TBCTL_HSPCLKDIV_Pos 7 /*!< High speed time-base clock prescale bits */ +#define PWM_TBCTL_CLKDIV_Pos 10 /*!< Time-base clock prescale bits */ +#define PWM_TBCTL_PHSDIR_Pos 13 /*!< Phase direction bit */ +#define PWM_TBCTL_FREESOFT_Pos 14 /*!< Emulation mode bits - select the behavior of the time-base counter during emulation events */ +#define PWM_TBCTL_SHDWGLOB_Pos 16 /*!< Global enabe for all shadow loads */ + +/* Bit field masks: */ +#define PWM_TBCTL_CTRMODE_Msk 0x00000003UL /*!< Counter mode */ +#define PWM_TBCTL_PHSEN_Msk 0x00000004UL /*!< Counter register load from phase register enable */ +#define PWM_TBCTL_PRDLD_Msk 0x00000008UL /*!< Active period register load from shadow register select */ +#define PWM_TBCTL_SYNCOSEL_Msk 0x00000030UL /*!< Synchronization Output Select. These bits select the source of the PWM_SYNCO signal. */ +#define PWM_TBCTL_SWFSYNC_Msk 0x00000040UL /*!< Software forced synchronization pulse */ +#define PWM_TBCTL_HSPCLKDIV_Msk 0x00000380UL /*!< High speed time-base clock prescale bits */ +#define PWM_TBCTL_CLKDIV_Msk 0x00001C00UL /*!< Time-base clock prescale bits */ +#define PWM_TBCTL_PHSDIR_Msk 0x00002000UL /*!< Phase direction bit */ +#define PWM_TBCTL_FREESOFT_Msk 0x0000C000UL /*!< Emulation mode bits - select the behavior of the time-base counter during emulation events */ +#define PWM_TBCTL_SHDWGLOB_Msk 0x00010000UL /*!< Global enabe for all shadow loads */ + +/* Bit field enums: */ +typedef enum { + PWM_TBCTL_CTRMODE_Up = 0x0UL, /*!< count direction up */ + PWM_TBCTL_CTRMODE_Down = 0x1UL, /*!< count direction down */ + PWM_TBCTL_CTRMODE_UpDown = 0x2UL, /*!< count direction up-down */ + PWM_TBCTL_CTRMODE_Stop = 0x3UL, /*!< counter stopped */ +} PWM_TBCTL_CTRMODE_Enum; + +typedef enum { + PWM_TBCTL_SYNCOSEL_SYNCI = 0x0UL, /*!< PWM_SYNCI is source for PWM_SYNCO */ + PWM_TBCTL_SYNCOSEL_CTREqZero = 0x1UL, /*!< CTR = 0000h is source for PWM_SYNCO */ + PWM_TBCTL_SYNCOSEL_CTREqCMPB = 0x2UL, /*!< CTR = CMPB is source for PWM_SYNCO */ + PWM_TBCTL_SYNCOSEL_Disable = 0x3UL, /*!< PWM_SYNCO generation disabled */ +} PWM_TBCTL_SYNCOSEL_Enum; + +typedef enum { + PWM_TBCTL_HSPCLKDIV_Div1 = 0x0UL, /*!< clock not divided */ + PWM_TBCTL_HSPCLKDIV_Div2 = 0x1UL, /*!< clock divided by 2 */ + PWM_TBCTL_HSPCLKDIV_Div4 = 0x2UL, /*!< clock divided by 4 */ + PWM_TBCTL_HSPCLKDIV_Div6 = 0x3UL, /*!< clock divided by 6 */ + PWM_TBCTL_HSPCLKDIV_Div8 = 0x4UL, /*!< clock divided by 8 */ + PWM_TBCTL_HSPCLKDIV_Div10 = 0x5UL, /*!< clock divided by 10 */ + PWM_TBCTL_HSPCLKDIV_Div12 = 0x6UL, /*!< clock divided by 12 */ + PWM_TBCTL_HSPCLKDIV_Div14 = 0x7UL, /*!< clock divided by 14 */ +} PWM_TBCTL_HSPCLKDIV_Enum; + +typedef enum { + PWM_TBCTL_CLKDIV_Div1 = 0x0UL, /*!< clock not divided */ + PWM_TBCTL_CLKDIV_Div2 = 0x1UL, /*!< clock divided by 2 */ + PWM_TBCTL_CLKDIV_Div4 = 0x2UL, /*!< clock divided by 4 */ + PWM_TBCTL_CLKDIV_Div8 = 0x3UL, /*!< clock divided by 8 */ + PWM_TBCTL_CLKDIV_Div16 = 0x4UL, /*!< clock divided by 16 */ + PWM_TBCTL_CLKDIV_Div32 = 0x5UL, /*!< clock divided by 32 */ + PWM_TBCTL_CLKDIV_Div64 = 0x6UL, /*!< clock divided by 64 */ + PWM_TBCTL_CLKDIV_Div128 = 0x7UL, /*!< clock divided by 128 */ +} PWM_TBCTL_CLKDIV_Enum; + +typedef enum { + PWM_TBCTL_FREESOFT_StopAtTBCLK = 0x0UL, /*!< stop timer at next TBCLK tact */ + PWM_TBCTL_FREESOFT_StopAtPeriod = 0x1UL, /*!< stop timer when period ends */ + PWM_TBCTL_FREESOFT_FreeRun = 0x2UL, /*!< free run mode */ +} PWM_TBCTL_FREESOFT_Enum; + +/*-- TBSTS: Time-Base Status Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t CTRDIR :1; /*!< Time-Base counter direction status bit */ + uint32_t SYNCI :1; /*!< Input synchronization latched status bit */ + uint32_t CTRMAX :1; /*!< Time-Base counter max latched status bit */ +} _PWM_TBSTS_bits; + +/* Bit field positions: */ +#define PWM_TBSTS_CTRDIR_Pos 0 /*!< Time-Base counter direction status bit */ +#define PWM_TBSTS_SYNCI_Pos 1 /*!< Input synchronization latched status bit */ +#define PWM_TBSTS_CTRMAX_Pos 2 /*!< Time-Base counter max latched status bit */ + +/* Bit field masks: */ +#define PWM_TBSTS_CTRDIR_Msk 0x00000001UL /*!< Time-Base counter direction status bit */ +#define PWM_TBSTS_SYNCI_Msk 0x00000002UL /*!< Input synchronization latched status bit */ +#define PWM_TBSTS_CTRMAX_Msk 0x00000004UL /*!< Time-Base counter max latched status bit */ + +/*-- TBPHS: Time-Base Phase Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t :8; /*!< RESERVED */ + uint32_t TBPHSHR :8; /*!< Time-base counter phase in High-Resolution mode */ + uint32_t TBPHS :16; /*!< Time-base counter phase */ +} _PWM_TBPHS_bits; + +/* Bit field positions: */ +#define PWM_TBPHS_TBPHSHR_Pos 8 /*!< Time-base counter phase in High-Resolution mode */ +#define PWM_TBPHS_TBPHS_Pos 16 /*!< Time-base counter phase */ + +/* Bit field masks: */ +#define PWM_TBPHS_TBPHSHR_Msk 0x0000FF00UL /*!< Time-base counter phase in High-Resolution mode */ +#define PWM_TBPHS_TBPHS_Msk 0xFFFF0000UL /*!< Time-base counter phase */ + +/*-- TBCTR: Time-Base Counter Register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :16; /*!< Current time-base counter value */ +} _PWM_TBCTR_bits; + +/* Bit field positions: */ +#define PWM_TBCTR_VAL_Pos 0 /*!< Current time-base counter value */ + +/* Bit field masks: */ +#define PWM_TBCTR_VAL_Msk 0x0000FFFFUL /*!< Current time-base counter value */ + +/*-- TBPRD: Time-Base Period Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :16; /*!< Period of the time-base counter */ +} _PWM_TBPRD_bits; + +/* Bit field positions: */ +#define PWM_TBPRD_VAL_Pos 0 /*!< Period of the time-base counter */ + +/* Bit field masks: */ +#define PWM_TBPRD_VAL_Msk 0x0000FFFFUL /*!< Period of the time-base counter */ + +/*-- CMPCTL: Counter-Compare Control Register ----------------------------------------------------------------*/ +typedef struct { + uint32_t LOADAMODE :2; /*!< Active CMPA load from shadow select mode */ + uint32_t LOADBMODE :2; /*!< Active CMPB load from shadow select mode */ + uint32_t SHDWAMODE :1; /*!< CMPA register operating mode */ + uint32_t :1; /*!< RESERVED */ + uint32_t SHDWBMODE :1; /*!< CMPB register operating mode */ + uint32_t :1; /*!< RESERVED */ + uint32_t SHDWAFULL :1; /*!< CMPA shadow register full status flag */ + uint32_t SHDWBFULL :1; /*!< CMPB shadow register full status flag */ +} _PWM_CMPCTL_bits; + +/* Bit field positions: */ +#define PWM_CMPCTL_LOADAMODE_Pos 0 /*!< Active CMPA load from shadow select mode */ +#define PWM_CMPCTL_LOADBMODE_Pos 2 /*!< Active CMPB load from shadow select mode */ +#define PWM_CMPCTL_SHDWAMODE_Pos 4 /*!< CMPA register operating mode */ +#define PWM_CMPCTL_SHDWBMODE_Pos 6 /*!< CMPB register operating mode */ +#define PWM_CMPCTL_SHDWAFULL_Pos 8 /*!< CMPA shadow register full status flag */ +#define PWM_CMPCTL_SHDWBFULL_Pos 9 /*!< CMPB shadow register full status flag */ + +/* Bit field masks: */ +#define PWM_CMPCTL_LOADAMODE_Msk 0x00000003UL /*!< Active CMPA load from shadow select mode */ +#define PWM_CMPCTL_LOADBMODE_Msk 0x0000000CUL /*!< Active CMPB load from shadow select mode */ +#define PWM_CMPCTL_SHDWAMODE_Msk 0x00000010UL /*!< CMPA register operating mode */ +#define PWM_CMPCTL_SHDWBMODE_Msk 0x00000040UL /*!< CMPB register operating mode */ +#define PWM_CMPCTL_SHDWAFULL_Msk 0x00000100UL /*!< CMPA shadow register full status flag */ +#define PWM_CMPCTL_SHDWBFULL_Msk 0x00000200UL /*!< CMPB shadow register full status flag */ + +/* Bit field enums: */ +typedef enum { + PWM_CMPCTL_LOADAMODE_CTREqZero = 0x0UL, /*!< shadow load for CMPx (x=A,B) when CTR = 0 */ + PWM_CMPCTL_LOADAMODE_CTREqPRD = 0x1UL, /*!< shadow load for CMPx (x=A,B) when CTR = PRD */ + PWM_CMPCTL_LOADAMODE_CTREqZeroPRD = 0x2UL, /*!< shadow load for CMPx (x=A,B) when CTR = 0 or CTR = PRD */ + PWM_CMPCTL_LOADAMODE_Disable = 0x3UL, /*!< shadow load for CMPx (x=A,B) disabled */ +} PWM_CMPCTL_LOADAMODE_Enum; + +typedef enum { + PWM_CMPCTL_LOADBMODE_CTREqZero = 0x0UL, /*!< shadow load for CMPx (x=A,B) when CTR = 0 */ + PWM_CMPCTL_LOADBMODE_CTREqPRD = 0x1UL, /*!< shadow load for CMPx (x=A,B) when CTR = PRD */ + PWM_CMPCTL_LOADBMODE_CTREqZeroPRD = 0x2UL, /*!< shadow load for CMPx (x=A,B) when CTR = 0 or CTR = PRD */ + PWM_CMPCTL_LOADBMODE_Disable = 0x3UL, /*!< shadow load for CMPx (x=A,B) disabled */ +} PWM_CMPCTL_LOADBMODE_Enum; + +/*-- CMPA: Counter-Compare A Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t :8; /*!< RESERVED */ + uint32_t CMPAHR :8; /*!< The value compared to the time-base counter (TBCTR) in High-Resolution mode */ + uint32_t CMPA :16; /*!< The value compared to the time-base counter (TBCTR) */ +} _PWM_CMPA_bits; + +/* Bit field positions: */ +#define PWM_CMPA_CMPAHR_Pos 8 /*!< The value compared to the time-base counter (TBCTR) in High-Resolution mode */ +#define PWM_CMPA_CMPA_Pos 16 /*!< The value compared to the time-base counter (TBCTR) */ + +/* Bit field masks: */ +#define PWM_CMPA_CMPAHR_Msk 0x0000FF00UL /*!< The value compared to the time-base counter (TBCTR) in High-Resolution mode */ +#define PWM_CMPA_CMPA_Msk 0xFFFF0000UL /*!< The value compared to the time-base counter (TBCTR) */ + +/*-- CMPB: Counter-Compare B Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t :16; /*!< RESERVED */ + uint32_t CMPB :16; /*!< The value compared to the time-base counter (TBCTR) */ +} _PWM_CMPB_bits; + +/* Bit field positions: */ +#define PWM_CMPB_CMPB_Pos 16 /*!< The value compared to the time-base counter (TBCTR) */ + +/* Bit field masks: */ +#define PWM_CMPB_CMPB_Msk 0xFFFF0000UL /*!< The value compared to the time-base counter (TBCTR) */ + +/*-- AQCTLA: Action-Qualifier Output A Control Register ------------------------------------------------------*/ +typedef struct { + uint32_t ZRO :2; /*!< Action when counter equals zero */ + uint32_t PRD :2; /*!< Action when the counter equals the period */ + uint32_t CAU :2; /*!< Action when the counter equals the active CMPA register and the counter is incrementing */ + uint32_t CAD :2; /*!< Action when the counter equals the active CMPA register and the counter is decrementing */ + uint32_t CBU :2; /*!< Action when the counter equals the active CMPB register and the counter is incrementing */ + uint32_t CBD :2; /*!< Action when the time-base counter equals the active CMPB register and the counter is decrementing + */ +} _PWM_AQCTLA_bits; + +/* Bit field positions: */ +#define PWM_AQCTLA_ZRO_Pos 0 /*!< Action when counter equals zero */ +#define PWM_AQCTLA_PRD_Pos 2 /*!< Action when the counter equals the period */ +#define PWM_AQCTLA_CAU_Pos 4 /*!< Action when the counter equals the active CMPA register and the counter is incrementing */ +#define PWM_AQCTLA_CAD_Pos 6 /*!< Action when the counter equals the active CMPA register and the counter is decrementing */ +#define PWM_AQCTLA_CBU_Pos 8 /*!< Action when the counter equals the active CMPB register and the counter is incrementing */ +#define PWM_AQCTLA_CBD_Pos 10 /*!< Action when the time-base counter equals the active CMPB register and the counter is decrementing + */ + +/* Bit field masks: */ +#define PWM_AQCTLA_ZRO_Msk 0x00000003UL /*!< Action when counter equals zero */ +#define PWM_AQCTLA_PRD_Msk 0x0000000CUL /*!< Action when the counter equals the period */ +#define PWM_AQCTLA_CAU_Msk 0x00000030UL /*!< Action when the counter equals the active CMPA register and the counter is incrementing */ +#define PWM_AQCTLA_CAD_Msk 0x000000C0UL /*!< Action when the counter equals the active CMPA register and the counter is decrementing */ +#define PWM_AQCTLA_CBU_Msk 0x00000300UL /*!< Action when the counter equals the active CMPB register and the counter is incrementing */ +#define PWM_AQCTLA_CBD_Msk 0x00000C00UL /*!< Action when the time-base counter equals the active CMPB register and the counter is decrementing + */ + +/* Bit field enums: */ +typedef enum { + PWM_AQCTLA_ZRO_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLA_ZRO_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLA_ZRO_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLA_ZRO_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLA_ZRO_Enum; + +typedef enum { + PWM_AQCTLA_PRD_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLA_PRD_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLA_PRD_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLA_PRD_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLA_PRD_Enum; + +typedef enum { + PWM_AQCTLA_CAU_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLA_CAU_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLA_CAU_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLA_CAU_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLA_CAU_Enum; + +typedef enum { + PWM_AQCTLA_CAD_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLA_CAD_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLA_CAD_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLA_CAD_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLA_CAD_Enum; + +typedef enum { + PWM_AQCTLA_CBU_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLA_CBU_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLA_CBU_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLA_CBU_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLA_CBU_Enum; + +typedef enum { + PWM_AQCTLA_CBD_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLA_CBD_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLA_CBD_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLA_CBD_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLA_CBD_Enum; + +/*-- AQCTLB: Action-Qualifier Output B Control Register ------------------------------------------------------*/ +typedef struct { + uint32_t ZRO :2; /*!< Action when counter equals zero */ + uint32_t PRD :2; /*!< Action when the counter equals the period */ + uint32_t CAU :2; /*!< Action when the counter equals the active CMPA register and the counter is incrementing */ + uint32_t CAD :2; /*!< Action when the counter equals the active CMPA register and the counter is decrementing */ + uint32_t CBU :2; /*!< Action when the counter equals the active CMPB register and the counter is incrementing */ + uint32_t CBD :2; /*!< Action when the time-base counter equals the active CMPB register and the counter is decrementing + */ +} _PWM_AQCTLB_bits; + +/* Bit field positions: */ +#define PWM_AQCTLB_ZRO_Pos 0 /*!< Action when counter equals zero */ +#define PWM_AQCTLB_PRD_Pos 2 /*!< Action when the counter equals the period */ +#define PWM_AQCTLB_CAU_Pos 4 /*!< Action when the counter equals the active CMPA register and the counter is incrementing */ +#define PWM_AQCTLB_CAD_Pos 6 /*!< Action when the counter equals the active CMPA register and the counter is decrementing */ +#define PWM_AQCTLB_CBU_Pos 8 /*!< Action when the counter equals the active CMPB register and the counter is incrementing */ +#define PWM_AQCTLB_CBD_Pos 10 /*!< Action when the time-base counter equals the active CMPB register and the counter is decrementing + */ + +/* Bit field masks: */ +#define PWM_AQCTLB_ZRO_Msk 0x00000003UL /*!< Action when counter equals zero */ +#define PWM_AQCTLB_PRD_Msk 0x0000000CUL /*!< Action when the counter equals the period */ +#define PWM_AQCTLB_CAU_Msk 0x00000030UL /*!< Action when the counter equals the active CMPA register and the counter is incrementing */ +#define PWM_AQCTLB_CAD_Msk 0x000000C0UL /*!< Action when the counter equals the active CMPA register and the counter is decrementing */ +#define PWM_AQCTLB_CBU_Msk 0x00000300UL /*!< Action when the counter equals the active CMPB register and the counter is incrementing */ +#define PWM_AQCTLB_CBD_Msk 0x00000C00UL /*!< Action when the time-base counter equals the active CMPB register and the counter is decrementing + */ + +/* Bit field enums: */ +typedef enum { + PWM_AQCTLB_ZRO_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLB_ZRO_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLB_ZRO_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLB_ZRO_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLB_ZRO_Enum; + +typedef enum { + PWM_AQCTLB_PRD_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLB_PRD_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLB_PRD_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLB_PRD_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLB_PRD_Enum; + +typedef enum { + PWM_AQCTLB_CAU_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLB_CAU_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLB_CAU_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLB_CAU_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLB_CAU_Enum; + +typedef enum { + PWM_AQCTLB_CAD_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLB_CAD_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLB_CAD_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLB_CAD_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLB_CAD_Enum; + +typedef enum { + PWM_AQCTLB_CBU_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLB_CBU_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLB_CBU_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLB_CBU_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLB_CBU_Enum; + +typedef enum { + PWM_AQCTLB_CBD_NoAction = 0x0UL, /*!< no action */ + PWM_AQCTLB_CBD_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCTLB_CBD_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQCTLB_CBD_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQCTLB_CBD_Enum; + +/*-- AQSFRC: Action-Qualifier Software Force Register --------------------------------------------------------*/ +typedef struct { + uint32_t ACTSFA :2; /*!< Action when one-time software force A is invoked */ + uint32_t OTSFA :1; /*!< One-time software forced event on output A */ + uint32_t ACTSFB :2; /*!< Action when one-time software force B is invoked */ + uint32_t OTSFB :1; /*!< One-time software forced event on output B */ + uint32_t RLDCSF :2; /*!< AQCSFRC active register reload from shadow options */ +} _PWM_AQSFRC_bits; + +/* Bit field positions: */ +#define PWM_AQSFRC_ACTSFA_Pos 0 /*!< Action when one-time software force A is invoked */ +#define PWM_AQSFRC_OTSFA_Pos 2 /*!< One-time software forced event on output A */ +#define PWM_AQSFRC_ACTSFB_Pos 3 /*!< Action when one-time software force B is invoked */ +#define PWM_AQSFRC_OTSFB_Pos 5 /*!< One-time software forced event on output B */ +#define PWM_AQSFRC_RLDCSF_Pos 6 /*!< AQCSFRC active register reload from shadow options */ + +/* Bit field masks: */ +#define PWM_AQSFRC_ACTSFA_Msk 0x00000003UL /*!< Action when one-time software force A is invoked */ +#define PWM_AQSFRC_OTSFA_Msk 0x00000004UL /*!< One-time software forced event on output A */ +#define PWM_AQSFRC_ACTSFB_Msk 0x00000018UL /*!< Action when one-time software force B is invoked */ +#define PWM_AQSFRC_OTSFB_Msk 0x00000020UL /*!< One-time software forced event on output B */ +#define PWM_AQSFRC_RLDCSF_Msk 0x000000C0UL /*!< AQCSFRC active register reload from shadow options */ + +/* Bit field enums: */ +typedef enum { + PWM_AQSFRC_ACTSFA_NoAction = 0x0UL, /*!< no action */ + PWM_AQSFRC_ACTSFA_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQSFRC_ACTSFA_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQSFRC_ACTSFA_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQSFRC_ACTSFA_Enum; + +typedef enum { + PWM_AQSFRC_ACTSFB_NoAction = 0x0UL, /*!< no action */ + PWM_AQSFRC_ACTSFB_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQSFRC_ACTSFB_Set = 0x2UL, /*!< set PWMA/PWMB */ + PWM_AQSFRC_ACTSFB_Toogle = 0x3UL, /*!< inverse PWMA/PWMB */ +} PWM_AQSFRC_ACTSFB_Enum; + +typedef enum { + PWM_AQSFRC_RLDCSF_CTREqZero = 0x0UL, /*!< load when CTR = 0 */ + PWM_AQSFRC_RLDCSF_CTREqPRD = 0x1UL, /*!< load when CTR = PRD */ + PWM_AQSFRC_RLDCSF_CTREqZeroPRD = 0x2UL, /*!< load when CTR = 0 or CTR = PRD */ + PWM_AQSFRC_RLDCSF_NoShadow = 0x3UL, /*!< load immediatelly */ +} PWM_AQSFRC_RLDCSF_Enum; + +/*-- AQCSFRC: Action-Qualifier Continuous Software Force Register --------------------------------------------*/ +typedef struct { + uint32_t CSFA :2; /*!< Continuous software force on output A */ + uint32_t CSFB :2; /*!< Continuous software force on output B */ +} _PWM_AQCSFRC_bits; + +/* Bit field positions: */ +#define PWM_AQCSFRC_CSFA_Pos 0 /*!< Continuous software force on output A */ +#define PWM_AQCSFRC_CSFB_Pos 2 /*!< Continuous software force on output B */ + +/* Bit field masks: */ +#define PWM_AQCSFRC_CSFA_Msk 0x00000003UL /*!< Continuous software force on output A */ +#define PWM_AQCSFRC_CSFB_Msk 0x0000000CUL /*!< Continuous software force on output B */ + +/* Bit field enums: */ +typedef enum { + PWM_AQCSFRC_CSFA_NoAction = 0x0UL, /*!< no action */ + PWM_AQCSFRC_CSFA_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCSFRC_CSFA_Set = 0x2UL, /*!< set PWMA/PWMB */ +} PWM_AQCSFRC_CSFA_Enum; + +typedef enum { + PWM_AQCSFRC_CSFB_NoAction = 0x0UL, /*!< no action */ + PWM_AQCSFRC_CSFB_Clear = 0x1UL, /*!< clear PWMA/PWMB */ + PWM_AQCSFRC_CSFB_Set = 0x2UL, /*!< set PWMA/PWMB */ +} PWM_AQCSFRC_CSFB_Enum; + +/*-- DBCTL: Dead-Band Generator Control Register -------------------------------------------------------------*/ +typedef struct { + uint32_t OUTMODE :2; /*!< Dead-band output mode control */ + uint32_t POLSEL :2; /*!< Polarity select control */ + uint32_t INMODE :2; /*!< Dead band input mode control */ +} _PWM_DBCTL_bits; + +/* Bit field positions: */ +#define PWM_DBCTL_OUTMODE_Pos 0 /*!< Dead-band output mode control */ +#define PWM_DBCTL_POLSEL_Pos 2 /*!< Polarity select control */ +#define PWM_DBCTL_INMODE_Pos 4 /*!< Dead band input mode control */ + +/* Bit field masks: */ +#define PWM_DBCTL_OUTMODE_Msk 0x00000003UL /*!< Dead-band output mode control */ +#define PWM_DBCTL_POLSEL_Msk 0x0000000CUL /*!< Polarity select control */ +#define PWM_DBCTL_INMODE_Msk 0x00000030UL /*!< Dead band input mode control */ + +/* Bit field enums: */ +typedef enum { + PWM_DBCTL_OUTMODE_NoSpec = 0x0UL, /*!< edge for deadtime is no specified */ + PWM_DBCTL_OUTMODE_BNeg = 0x1UL, /*!< deadtime on PWMB negedge */ + PWM_DBCTL_OUTMODE_APos = 0x2UL, /*!< deadtime on PWMA posedge */ + PWM_DBCTL_OUTMODE_Apos_BNeg = 0x3UL, /*!< deadtime on PWMA posedge and PWMB negedge */ +} PWM_DBCTL_OUTMODE_Enum; + +typedef enum { + PWM_DBCTL_POLSEL_InvDisable = 0x0UL, /*!< inverse disabled */ + PWM_DBCTL_POLSEL_InvA = 0x1UL, /*!< inverse on PWMA */ + PWM_DBCTL_POLSEL_InvB = 0x2UL, /*!< inverse on PWMB */ + PWM_DBCTL_POLSEL_InvAB = 0x3UL, /*!< inverse on PWMA and PWMB */ +} PWM_DBCTL_POLSEL_Enum; + +typedef enum { + PWM_DBCTL_INMODE_APosNeg = 0x0UL, /*!< PWMA is used for posedge and negedge control */ + PWM_DBCTL_INMODE_ANeg_BPos = 0x1UL, /*!< PWMA is used for negedge and PWMB is used for posedge control */ + PWM_DBCTL_INMODE_APos_BNeg = 0x2UL, /*!< PWMA is used for posedge and PWMB is used for negedge control */ + PWM_DBCTL_INMODE_BPosNeg = 0x3UL, /*!< PWMB is used for posedge and negedge control */ +} PWM_DBCTL_INMODE_Enum; + +/*-- DBRED: Dead-Band Generator Rising Edge Delay Register ---------------------------------------------------*/ +typedef struct { + uint32_t DEL :10; /*!< Rising edge delay count */ +} _PWM_DBRED_bits; + +/* Bit field positions: */ +#define PWM_DBRED_DEL_Pos 0 /*!< Rising edge delay count */ + +/* Bit field masks: */ +#define PWM_DBRED_DEL_Msk 0x000003FFUL /*!< Rising edge delay count */ + +/*-- DBFED: Dead-Band Generator Falling Edge Delay Register --------------------------------------------------*/ +typedef struct { + uint32_t DEL :10; /*!< Falling edge delay count */ +} _PWM_DBFED_bits; + +/* Bit field positions: */ +#define PWM_DBFED_DEL_Pos 0 /*!< Falling edge delay count */ + +/* Bit field masks: */ +#define PWM_DBFED_DEL_Msk 0x000003FFUL /*!< Falling edge delay count */ + +/*-- TZSEL: Trip-Zone Select Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t CBC0 :1; /*!< Cycle-by-Cycle trip-zone 0 enable + */ + uint32_t CBC1 :1; /*!< Cycle-by-Cycle trip-zone 1 enable + */ + uint32_t CBC2 :1; /*!< Cycle-by-Cycle trip-zone 2 enable + */ + uint32_t CBC3 :1; /*!< Cycle-by-Cycle trip-zone 3 enable + */ + uint32_t CBC4 :1; /*!< Cycle-by-Cycle trip-zone 4 enable + */ + uint32_t CBC5 :1; /*!< Cycle-by-Cycle trip-zone 5 enable + */ + uint32_t :2; /*!< RESERVED */ + uint32_t OST0 :1; /*!< One-Shot trip-zone 0 enable */ + uint32_t OST1 :1; /*!< One-Shot trip-zone 1 enable */ + uint32_t OST2 :1; /*!< One-Shot trip-zone 2 enable */ + uint32_t OST3 :1; /*!< One-Shot trip-zone 3 enable */ + uint32_t OST4 :1; /*!< One-Shot trip-zone 4 enable */ + uint32_t OST5 :1; /*!< One-Shot trip-zone 5 enable */ +} _PWM_TZSEL_bits; + +/* Bit field positions: */ +#define PWM_TZSEL_CBC0_Pos 0 /*!< Cycle-by-Cycle trip-zone 0 enable + */ +#define PWM_TZSEL_CBC1_Pos 1 /*!< Cycle-by-Cycle trip-zone 1 enable + */ +#define PWM_TZSEL_CBC2_Pos 2 /*!< Cycle-by-Cycle trip-zone 2 enable + */ +#define PWM_TZSEL_CBC3_Pos 3 /*!< Cycle-by-Cycle trip-zone 3 enable + */ +#define PWM_TZSEL_CBC4_Pos 4 /*!< Cycle-by-Cycle trip-zone 4 enable + */ +#define PWM_TZSEL_CBC5_Pos 5 /*!< Cycle-by-Cycle trip-zone 5 enable + */ +#define PWM_TZSEL_OST0_Pos 8 /*!< One-Shot trip-zone 0 enable */ +#define PWM_TZSEL_OST1_Pos 9 /*!< One-Shot trip-zone 1 enable */ +#define PWM_TZSEL_OST2_Pos 10 /*!< One-Shot trip-zone 2 enable */ +#define PWM_TZSEL_OST3_Pos 11 /*!< One-Shot trip-zone 3 enable */ +#define PWM_TZSEL_OST4_Pos 12 /*!< One-Shot trip-zone 4 enable */ +#define PWM_TZSEL_OST5_Pos 13 /*!< One-Shot trip-zone 5 enable */ + +/* Bit field masks: */ +#define PWM_TZSEL_CBC0_Msk 0x00000001UL /*!< Cycle-by-Cycle trip-zone 0 enable + */ +#define PWM_TZSEL_CBC1_Msk 0x00000002UL /*!< Cycle-by-Cycle trip-zone 1 enable + */ +#define PWM_TZSEL_CBC2_Msk 0x00000004UL /*!< Cycle-by-Cycle trip-zone 2 enable + */ +#define PWM_TZSEL_CBC3_Msk 0x00000008UL /*!< Cycle-by-Cycle trip-zone 3 enable + */ +#define PWM_TZSEL_CBC4_Msk 0x00000010UL /*!< Cycle-by-Cycle trip-zone 4 enable + */ +#define PWM_TZSEL_CBC5_Msk 0x00000020UL /*!< Cycle-by-Cycle trip-zone 5 enable + */ +#define PWM_TZSEL_OST0_Msk 0x00000100UL /*!< One-Shot trip-zone 0 enable */ +#define PWM_TZSEL_OST1_Msk 0x00000200UL /*!< One-Shot trip-zone 1 enable */ +#define PWM_TZSEL_OST2_Msk 0x00000400UL /*!< One-Shot trip-zone 2 enable */ +#define PWM_TZSEL_OST3_Msk 0x00000800UL /*!< One-Shot trip-zone 3 enable */ +#define PWM_TZSEL_OST4_Msk 0x00001000UL /*!< One-Shot trip-zone 4 enable */ +#define PWM_TZSEL_OST5_Msk 0x00002000UL /*!< One-Shot trip-zone 5 enable */ + +/*-- TZCTL: Trip-Zone Control Register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t TZA :2; /*!< When a trip event occurs the following action is taken on output A */ + uint32_t TZB :2; /*!< When a trip event occurs the following action is taken on output B */ +} _PWM_TZCTL_bits; + +/* Bit field positions: */ +#define PWM_TZCTL_TZA_Pos 0 /*!< When a trip event occurs the following action is taken on output A */ +#define PWM_TZCTL_TZB_Pos 2 /*!< When a trip event occurs the following action is taken on output B */ + +/* Bit field masks: */ +#define PWM_TZCTL_TZA_Msk 0x00000003UL /*!< When a trip event occurs the following action is taken on output A */ +#define PWM_TZCTL_TZB_Msk 0x0000000CUL /*!< When a trip event occurs the following action is taken on output B */ + +/* Bit field enums: */ +typedef enum { + PWM_TZCTL_TZA_Z = 0x0UL, /*!< PWMA/PWMB go to Z on failture */ + PWM_TZCTL_TZA_Set = 0x1UL, /*!< PWMA/PWMB go to 1 on failture */ + PWM_TZCTL_TZA_Clear = 0x2UL, /*!< PWMA/PWMB go to 0 on failture */ + PWM_TZCTL_TZA_NoAction = 0x3UL, /*!< no action on failture */ +} PWM_TZCTL_TZA_Enum; + +typedef enum { + PWM_TZCTL_TZB_Z = 0x0UL, /*!< PWMA/PWMB go to Z on failture */ + PWM_TZCTL_TZB_Set = 0x1UL, /*!< PWMA/PWMB go to 1 on failture */ + PWM_TZCTL_TZB_Clear = 0x2UL, /*!< PWMA/PWMB go to 0 on failture */ + PWM_TZCTL_TZB_NoAction = 0x3UL, /*!< no action on failture */ +} PWM_TZCTL_TZB_Enum; + +/*-- TZEINT: Trip-Zone Enable Interrupt Register -------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t CBC :1; /*!< Trip-zone Cycle-by-Cycle interrupt enable */ + uint32_t OST :1; /*!< Trip-zone One-Shot interrupt enable */ +} _PWM_TZEINT_bits; + +/* Bit field positions: */ +#define PWM_TZEINT_CBC_Pos 1 /*!< Trip-zone Cycle-by-Cycle interrupt enable */ +#define PWM_TZEINT_OST_Pos 2 /*!< Trip-zone One-Shot interrupt enable */ + +/* Bit field masks: */ +#define PWM_TZEINT_CBC_Msk 0x00000002UL /*!< Trip-zone Cycle-by-Cycle interrupt enable */ +#define PWM_TZEINT_OST_Msk 0x00000004UL /*!< Trip-zone One-Shot interrupt enable */ + +/*-- TZFLG: Trip-Zone Flag Register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Latched trip interrupt status flag */ + uint32_t CBC :1; /*!< Latched status flag for Cycle-By-Cycle trip event */ + uint32_t OST :1; /*!< Latched status flag for a One-Shot trip event */ +} _PWM_TZFLG_bits; + +/* Bit field positions: */ +#define PWM_TZFLG_INT_Pos 0 /*!< Latched trip interrupt status flag */ +#define PWM_TZFLG_CBC_Pos 1 /*!< Latched status flag for Cycle-By-Cycle trip event */ +#define PWM_TZFLG_OST_Pos 2 /*!< Latched status flag for a One-Shot trip event */ + +/* Bit field masks: */ +#define PWM_TZFLG_INT_Msk 0x00000001UL /*!< Latched trip interrupt status flag */ +#define PWM_TZFLG_CBC_Msk 0x00000002UL /*!< Latched status flag for Cycle-By-Cycle trip event */ +#define PWM_TZFLG_OST_Msk 0x00000004UL /*!< Latched status flag for a One-Shot trip event */ + +/*-- TZCLR: Trip-Zone Clear Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Clear trip-zone interrupt flag */ + uint32_t CBC :1; /*!< Clear flag for Cycle-By-Cycle trip latch + */ + uint32_t OST :1; /*!< Clear flag for One-Shot trip latch */ +} _PWM_TZCLR_bits; + +/* Bit field positions: */ +#define PWM_TZCLR_INT_Pos 0 /*!< Clear trip-zone interrupt flag */ +#define PWM_TZCLR_CBC_Pos 1 /*!< Clear flag for Cycle-By-Cycle trip latch + */ +#define PWM_TZCLR_OST_Pos 2 /*!< Clear flag for One-Shot trip latch */ + +/* Bit field masks: */ +#define PWM_TZCLR_INT_Msk 0x00000001UL /*!< Clear trip-zone interrupt flag */ +#define PWM_TZCLR_CBC_Msk 0x00000002UL /*!< Clear flag for Cycle-By-Cycle trip latch + */ +#define PWM_TZCLR_OST_Msk 0x00000004UL /*!< Clear flag for One-Shot trip latch */ + +/*-- TZFRC: Trip-Zone Force Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t CBC :1; /*!< Force a Cycle-by-Cycle trip event via software */ + uint32_t OST :1; /*!< Force a One-Shot trip event via software */ +} _PWM_TZFRC_bits; + +/* Bit field positions: */ +#define PWM_TZFRC_CBC_Pos 1 /*!< Force a Cycle-by-Cycle trip event via software */ +#define PWM_TZFRC_OST_Pos 2 /*!< Force a One-Shot trip event via software */ + +/* Bit field masks: */ +#define PWM_TZFRC_CBC_Msk 0x00000002UL /*!< Force a Cycle-by-Cycle trip event via software */ +#define PWM_TZFRC_OST_Msk 0x00000004UL /*!< Force a One-Shot trip event via software */ + +/*-- ETSEL: Event-Trigger Selection Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t INTSEL :3; /*!< PWM_INT interrupt selection options */ + uint32_t INTEN :1; /*!< Enable PWM_INT interrupt generation */ + uint32_t :4; /*!< RESERVED */ + uint32_t SOCASEL :3; /*!< PWM_SOCA selection Options */ + uint32_t SOCAEN :1; /*!< Enable the ADC start of conversion A PWM_SOCA pulse */ + uint32_t SOCBSEL :3; /*!< PWM_SOCB selection Options */ + uint32_t SOCBEN :1; /*!< Enable the ADC start of conversion B PWM_SOCB pulse */ + uint32_t DRQASEL :3; /*!< PWM A DMA request event selection */ + uint32_t DRQAEN :1; /*!< Enable the DMA request from PWM A */ + uint32_t DRQBSEL :3; /*!< PWM B DMA request event selection */ + uint32_t DRQBEN :1; /*!< Enable the DMA request from PWM B */ +} _PWM_ETSEL_bits; + +/* Bit field positions: */ +#define PWM_ETSEL_INTSEL_Pos 0 /*!< PWM_INT interrupt selection options */ +#define PWM_ETSEL_INTEN_Pos 3 /*!< Enable PWM_INT interrupt generation */ +#define PWM_ETSEL_SOCASEL_Pos 8 /*!< PWM_SOCA selection Options */ +#define PWM_ETSEL_SOCAEN_Pos 11 /*!< Enable the ADC start of conversion A PWM_SOCA pulse */ +#define PWM_ETSEL_SOCBSEL_Pos 12 /*!< PWM_SOCB selection Options */ +#define PWM_ETSEL_SOCBEN_Pos 15 /*!< Enable the ADC start of conversion B PWM_SOCB pulse */ +#define PWM_ETSEL_DRQASEL_Pos 16 /*!< PWM A DMA request event selection */ +#define PWM_ETSEL_DRQAEN_Pos 19 /*!< Enable the DMA request from PWM A */ +#define PWM_ETSEL_DRQBSEL_Pos 20 /*!< PWM B DMA request event selection */ +#define PWM_ETSEL_DRQBEN_Pos 23 /*!< Enable the DMA request from PWM B */ + +/* Bit field masks: */ +#define PWM_ETSEL_INTSEL_Msk 0x00000007UL /*!< PWM_INT interrupt selection options */ +#define PWM_ETSEL_INTEN_Msk 0x00000008UL /*!< Enable PWM_INT interrupt generation */ +#define PWM_ETSEL_SOCASEL_Msk 0x00000700UL /*!< PWM_SOCA selection Options */ +#define PWM_ETSEL_SOCAEN_Msk 0x00000800UL /*!< Enable the ADC start of conversion A PWM_SOCA pulse */ +#define PWM_ETSEL_SOCBSEL_Msk 0x00007000UL /*!< PWM_SOCB selection Options */ +#define PWM_ETSEL_SOCBEN_Msk 0x00008000UL /*!< Enable the ADC start of conversion B PWM_SOCB pulse */ +#define PWM_ETSEL_DRQASEL_Msk 0x00070000UL /*!< PWM A DMA request event selection */ +#define PWM_ETSEL_DRQAEN_Msk 0x00080000UL /*!< Enable the DMA request from PWM A */ +#define PWM_ETSEL_DRQBSEL_Msk 0x00700000UL /*!< PWM B DMA request event selection */ +#define PWM_ETSEL_DRQBEN_Msk 0x00800000UL /*!< Enable the DMA request from PWM B */ + +/* Bit field enums: */ +typedef enum { + PWM_ETSEL_INTSEL_CTREqZero = 0x1UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = 0 */ + PWM_ETSEL_INTSEL_CTREqPRD = 0x2UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = PRD */ + PWM_ETSEL_INTSEL_CTREqCMPA_OnUp = 0x4UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count up */ + PWM_ETSEL_INTSEL_CTREqCMPA_OnDown = 0x5UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count down */ + PWM_ETSEL_INTSEL_CTREqCMPB_OnUp = 0x6UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count up */ + PWM_ETSEL_INTSEL_CTREqCMPB_OnDown = 0x7UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count down */ +} PWM_ETSEL_INTSEL_Enum; + +typedef enum { + PWM_ETSEL_SOCASEL_CTREqZero = 0x1UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = 0 */ + PWM_ETSEL_SOCASEL_CTREqPRD = 0x2UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = PRD */ + PWM_ETSEL_SOCASEL_CTREqCMPA_OnUp = 0x4UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count up */ + PWM_ETSEL_SOCASEL_CTREqCMPA_OnDown = 0x5UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count down */ + PWM_ETSEL_SOCASEL_CTREqCMPB_OnUp = 0x6UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count up */ + PWM_ETSEL_SOCASEL_CTREqCMPB_OnDown = 0x7UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count down */ +} PWM_ETSEL_SOCASEL_Enum; + +typedef enum { + PWM_ETSEL_SOCBSEL_CTREqZero = 0x1UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = 0 */ + PWM_ETSEL_SOCBSEL_CTREqPRD = 0x2UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = PRD */ + PWM_ETSEL_SOCBSEL_CTREqCMPA_OnUp = 0x4UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count up */ + PWM_ETSEL_SOCBSEL_CTREqCMPA_OnDown = 0x5UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count down */ + PWM_ETSEL_SOCBSEL_CTREqCMPB_OnUp = 0x6UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count up */ + PWM_ETSEL_SOCBSEL_CTREqCMPB_OnDown = 0x7UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count down */ +} PWM_ETSEL_SOCBSEL_Enum; + +typedef enum { + PWM_ETSEL_DRQASEL_CTREqZero = 0x1UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = 0 */ + PWM_ETSEL_DRQASEL_CTREqPRD = 0x2UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = PRD */ + PWM_ETSEL_DRQASEL_CTREqCMPA_OnUp = 0x4UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count up */ + PWM_ETSEL_DRQASEL_CTREqCMPA_OnDown = 0x5UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count down */ + PWM_ETSEL_DRQASEL_CTREqCMPB_OnUp = 0x6UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count up */ + PWM_ETSEL_DRQASEL_CTREqCMPB_OnDown = 0x7UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count down */ +} PWM_ETSEL_DRQASEL_Enum; + +typedef enum { + PWM_ETSEL_DRQBSEL_CTREqZero = 0x1UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = 0 */ + PWM_ETSEL_DRQBSEL_CTREqPRD = 0x2UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = PRD */ + PWM_ETSEL_DRQBSEL_CTREqCMPA_OnUp = 0x4UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count up */ + PWM_ETSEL_DRQBSEL_CTREqCMPA_OnDown = 0x5UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPA when count down */ + PWM_ETSEL_DRQBSEL_CTREqCMPB_OnUp = 0x6UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count up */ + PWM_ETSEL_DRQBSEL_CTREqCMPB_OnDown = 0x7UL, /*!< generate PWM_SOCA/PWM_SOCB/PWN_INT impulse on CTR = CMPB when count down */ +} PWM_ETSEL_DRQBSEL_Enum; + +/*-- ETPS: Event-Trigger Prescale Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t INTPRD :2; /*!< PWM interrupt (PWM_INT) period select */ + uint32_t INTCNT :2; /*!< PWM interrupt event (PWM_INT) counter register */ + uint32_t :4; /*!< RESERVED */ + uint32_t SOCAPRD :2; /*!< PWM ADC Start-of-Conversion A event (PWM_SOCA) period select */ + uint32_t SOCACNT :2; /*!< PWM ADC Start-of-Conversion A event (PWM_SOCA) counter register */ + uint32_t SOCBPRD :2; /*!< PWM ADC Start-of-Conversion B event (PWM_SOCB) period select */ + uint32_t SOCBCNT :2; /*!< PWM ADC Start-of-Conversion B event (PWM_SOCB) counter register */ + uint32_t DRQAPRD :2; /*!< PWM DMA request A period select */ + uint32_t DRQACNT :2; /*!< PWM DMA request event A counter */ + uint32_t DRQBPRD :2; /*!< PWM DMA request B period select */ + uint32_t DRQBCNT :2; /*!< PWM DMA request event B counter */ +} _PWM_ETPS_bits; + +/* Bit field positions: */ +#define PWM_ETPS_INTPRD_Pos 0 /*!< PWM interrupt (PWM_INT) period select */ +#define PWM_ETPS_INTCNT_Pos 2 /*!< PWM interrupt event (PWM_INT) counter register */ +#define PWM_ETPS_SOCAPRD_Pos 8 /*!< PWM ADC Start-of-Conversion A event (PWM_SOCA) period select */ +#define PWM_ETPS_SOCACNT_Pos 10 /*!< PWM ADC Start-of-Conversion A event (PWM_SOCA) counter register */ +#define PWM_ETPS_SOCBPRD_Pos 12 /*!< PWM ADC Start-of-Conversion B event (PWM_SOCB) period select */ +#define PWM_ETPS_SOCBCNT_Pos 14 /*!< PWM ADC Start-of-Conversion B event (PWM_SOCB) counter register */ +#define PWM_ETPS_DRQAPRD_Pos 16 /*!< PWM DMA request A period select */ +#define PWM_ETPS_DRQACNT_Pos 18 /*!< PWM DMA request event A counter */ +#define PWM_ETPS_DRQBPRD_Pos 20 /*!< PWM DMA request B period select */ +#define PWM_ETPS_DRQBCNT_Pos 22 /*!< PWM DMA request event B counter */ + +/* Bit field masks: */ +#define PWM_ETPS_INTPRD_Msk 0x00000003UL /*!< PWM interrupt (PWM_INT) period select */ +#define PWM_ETPS_INTCNT_Msk 0x0000000CUL /*!< PWM interrupt event (PWM_INT) counter register */ +#define PWM_ETPS_SOCAPRD_Msk 0x00000300UL /*!< PWM ADC Start-of-Conversion A event (PWM_SOCA) period select */ +#define PWM_ETPS_SOCACNT_Msk 0x00000C00UL /*!< PWM ADC Start-of-Conversion A event (PWM_SOCA) counter register */ +#define PWM_ETPS_SOCBPRD_Msk 0x00003000UL /*!< PWM ADC Start-of-Conversion B event (PWM_SOCB) period select */ +#define PWM_ETPS_SOCBCNT_Msk 0x0000C000UL /*!< PWM ADC Start-of-Conversion B event (PWM_SOCB) counter register */ +#define PWM_ETPS_DRQAPRD_Msk 0x00030000UL /*!< PWM DMA request A period select */ +#define PWM_ETPS_DRQACNT_Msk 0x000C0000UL /*!< PWM DMA request event A counter */ +#define PWM_ETPS_DRQBPRD_Msk 0x00300000UL /*!< PWM DMA request B period select */ +#define PWM_ETPS_DRQBCNT_Msk 0x00C00000UL /*!< PWM DMA request event B counter */ + +/*-- ETFLG: Event-Trigger Flag Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Latched PWM Interrupt (PWM_INT) status flag */ + uint32_t :1; /*!< RESERVED */ + uint32_t SOCA :1; /*!< Latched PWM ADC Start-of-Conversion A (PWM_SOCA) status flag */ + uint32_t SOCB :1; /*!< Latched PWM ADC Start-of-Conversion B (PWM_SOCB) status flag */ + uint32_t DRQA :1; /*!< Latched PWM DMA request A status flag */ + uint32_t DRQB :1; /*!< Latched PWM DMA request B status flag */ +} _PWM_ETFLG_bits; + +/* Bit field positions: */ +#define PWM_ETFLG_INT_Pos 0 /*!< Latched PWM Interrupt (PWM_INT) status flag */ +#define PWM_ETFLG_SOCA_Pos 2 /*!< Latched PWM ADC Start-of-Conversion A (PWM_SOCA) status flag */ +#define PWM_ETFLG_SOCB_Pos 3 /*!< Latched PWM ADC Start-of-Conversion B (PWM_SOCB) status flag */ +#define PWM_ETFLG_DRQA_Pos 4 /*!< Latched PWM DMA request A status flag */ +#define PWM_ETFLG_DRQB_Pos 5 /*!< Latched PWM DMA request B status flag */ + +/* Bit field masks: */ +#define PWM_ETFLG_INT_Msk 0x00000001UL /*!< Latched PWM Interrupt (PWM_INT) status flag */ +#define PWM_ETFLG_SOCA_Msk 0x00000004UL /*!< Latched PWM ADC Start-of-Conversion A (PWM_SOCA) status flag */ +#define PWM_ETFLG_SOCB_Msk 0x00000008UL /*!< Latched PWM ADC Start-of-Conversion B (PWM_SOCB) status flag */ +#define PWM_ETFLG_DRQA_Msk 0x00000010UL /*!< Latched PWM DMA request A status flag */ +#define PWM_ETFLG_DRQB_Msk 0x00000020UL /*!< Latched PWM DMA request B status flag */ + +/*-- ETCLR: Event-Trigger Clear Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Latched PWM Interrupt (PWM_INT) flag clear bit */ + uint32_t :1; /*!< RESERVED */ + uint32_t SOCA :1; /*!< Latched PWM ADC Start-of-Conversion A (PWM_SOCA) flag clear bit */ + uint32_t SOCB :1; /*!< Latched PWM ADC Start-of-Conversion B (PWM_SOCB) flag clear bit */ + uint32_t DRQA :1; /*!< Latched PWM DMA request A flag clear bit */ + uint32_t DRQB :1; /*!< Latched PWM DMA request B flag clear bit */ +} _PWM_ETCLR_bits; + +/* Bit field positions: */ +#define PWM_ETCLR_INT_Pos 0 /*!< Latched PWM Interrupt (PWM_INT) flag clear bit */ +#define PWM_ETCLR_SOCA_Pos 2 /*!< Latched PWM ADC Start-of-Conversion A (PWM_SOCA) flag clear bit */ +#define PWM_ETCLR_SOCB_Pos 3 /*!< Latched PWM ADC Start-of-Conversion B (PWM_SOCB) flag clear bit */ +#define PWM_ETCLR_DRQA_Pos 4 /*!< Latched PWM DMA request A flag clear bit */ +#define PWM_ETCLR_DRQB_Pos 5 /*!< Latched PWM DMA request B flag clear bit */ + +/* Bit field masks: */ +#define PWM_ETCLR_INT_Msk 0x00000001UL /*!< Latched PWM Interrupt (PWM_INT) flag clear bit */ +#define PWM_ETCLR_SOCA_Msk 0x00000004UL /*!< Latched PWM ADC Start-of-Conversion A (PWM_SOCA) flag clear bit */ +#define PWM_ETCLR_SOCB_Msk 0x00000008UL /*!< Latched PWM ADC Start-of-Conversion B (PWM_SOCB) flag clear bit */ +#define PWM_ETCLR_DRQA_Msk 0x00000010UL /*!< Latched PWM DMA request A flag clear bit */ +#define PWM_ETCLR_DRQB_Msk 0x00000020UL /*!< Latched PWM DMA request B flag clear bit */ + +/*-- ETFRC: Event-Trigger Force Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< PWM_INT force bit. */ + uint32_t :1; /*!< RESERVED */ + uint32_t SOCA :1; /*!< PWM_SOCA force bit */ + uint32_t SOCB :1; /*!< PWM_SOCB force bit */ + uint32_t DRQA :1; /*!< PWM DMA request A force bit */ + uint32_t DRQB :1; /*!< PWM DMA request B force bit */ +} _PWM_ETFRC_bits; + +/* Bit field positions: */ +#define PWM_ETFRC_INT_Pos 0 /*!< PWM_INT force bit. */ +#define PWM_ETFRC_SOCA_Pos 2 /*!< PWM_SOCA force bit */ +#define PWM_ETFRC_SOCB_Pos 3 /*!< PWM_SOCB force bit */ +#define PWM_ETFRC_DRQA_Pos 4 /*!< PWM DMA request A force bit */ +#define PWM_ETFRC_DRQB_Pos 5 /*!< PWM DMA request B force bit */ + +/* Bit field masks: */ +#define PWM_ETFRC_INT_Msk 0x00000001UL /*!< PWM_INT force bit. */ +#define PWM_ETFRC_SOCA_Msk 0x00000004UL /*!< PWM_SOCA force bit */ +#define PWM_ETFRC_SOCB_Msk 0x00000008UL /*!< PWM_SOCB force bit */ +#define PWM_ETFRC_DRQA_Msk 0x00000010UL /*!< PWM DMA request A force bit */ +#define PWM_ETFRC_DRQB_Msk 0x00000020UL /*!< PWM DMA request B force bit */ + +/*-- PCCTL: PWM-Chopper Control Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t CHPEN :1; /*!< PWM-chopping enable */ + uint32_t OSTWTH :4; /*!< One-Shot pulse width */ + uint32_t CHPFREQ :3; /*!< Chopping clock frequency */ + uint32_t CHPDUTY :3; /*!< Chopping clock duty cycle */ +} _PWM_PCCTL_bits; + +/* Bit field positions: */ +#define PWM_PCCTL_CHPEN_Pos 0 /*!< PWM-chopping enable */ +#define PWM_PCCTL_OSTWTH_Pos 1 /*!< One-Shot pulse width */ +#define PWM_PCCTL_CHPFREQ_Pos 5 /*!< Chopping clock frequency */ +#define PWM_PCCTL_CHPDUTY_Pos 8 /*!< Chopping clock duty cycle */ + +/* Bit field masks: */ +#define PWM_PCCTL_CHPEN_Msk 0x00000001UL /*!< PWM-chopping enable */ +#define PWM_PCCTL_OSTWTH_Msk 0x0000001EUL /*!< One-Shot pulse width */ +#define PWM_PCCTL_CHPFREQ_Msk 0x000000E0UL /*!< Chopping clock frequency */ +#define PWM_PCCTL_CHPDUTY_Msk 0x00000700UL /*!< Chopping clock duty cycle */ + +/* Bit field enums: */ +typedef enum { + PWM_PCCTL_CHPFREQ_Div1 = 0x0UL, /*!< sync frequency divide by 1 */ + PWM_PCCTL_CHPFREQ_Div2 = 0x1UL, /*!< sync frequency divide by 2 */ + PWM_PCCTL_CHPFREQ_Div3 = 0x2UL, /*!< sync frequency divide by 3 */ + PWM_PCCTL_CHPFREQ_Div4 = 0x3UL, /*!< sync frequency divide by 4 */ + PWM_PCCTL_CHPFREQ_Div5 = 0x4UL, /*!< sync frequency divide by 5 */ + PWM_PCCTL_CHPFREQ_Div6 = 0x5UL, /*!< sync frequency divide by 6 */ + PWM_PCCTL_CHPFREQ_Div7 = 0x6UL, /*!< sync frequency divide by 7 */ + PWM_PCCTL_CHPFREQ_Div8 = 0x7UL, /*!< sync frequency divide by 8 */ +} PWM_PCCTL_CHPFREQ_Enum; + +typedef enum { + PWM_PCCTL_CHPDUTY_Duty_1_8 = 0x0UL, /*!< duty 1/8 */ + PWM_PCCTL_CHPDUTY_Duty_2_8 = 0x1UL, /*!< duty 2/8 */ + PWM_PCCTL_CHPDUTY_Duty_3_8 = 0x2UL, /*!< duty 3/8 */ + PWM_PCCTL_CHPDUTY_Duty_4_8 = 0x3UL, /*!< duty 4/8 */ + PWM_PCCTL_CHPDUTY_Duty_5_8 = 0x4UL, /*!< duty 5/8 */ + PWM_PCCTL_CHPDUTY_Duty_6_8 = 0x5UL, /*!< duty 6/8 */ + PWM_PCCTL_CHPDUTY_Duty_7_8 = 0x6UL, /*!< duty 7/8 */ +} PWM_PCCTL_CHPDUTY_Enum; + +/*-- HRCTL: High-Resolution Control Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t EDGMODEA :2; /*!< Edge selecting for delay on chanel A */ + uint32_t CTLMODEA :1; /*!< Register specifies the delay select on chanel A */ + uint32_t HRLOAD :1; /*!< CMPAHR register shadow load mode */ + uint32_t EDGMODEB :2; /*!< Edge selecting for delay on chanel B */ + uint32_t CTLMODEB :1; /*!< Register specifies the delay select on chanel B */ + uint32_t :1; /*!< RESERVED */ + uint32_t DELAYCALA :2; /*!< Delay calibration flags of chanel A */ + uint32_t DELAYCALB :2; /*!< Delay calibration flags of chanel B */ +} _PWM_HRCTL_bits; + +/* Bit field positions: */ +#define PWM_HRCTL_EDGMODEA_Pos 0 /*!< Edge selecting for delay on chanel A */ +#define PWM_HRCTL_CTLMODEA_Pos 2 /*!< Register specifies the delay select on chanel A */ +#define PWM_HRCTL_HRLOAD_Pos 3 /*!< CMPAHR register shadow load mode */ +#define PWM_HRCTL_EDGMODEB_Pos 4 /*!< Edge selecting for delay on chanel B */ +#define PWM_HRCTL_CTLMODEB_Pos 6 /*!< Register specifies the delay select on chanel B */ +#define PWM_HRCTL_DELAYCALA_Pos 8 /*!< Delay calibration flags of chanel A */ +#define PWM_HRCTL_DELAYCALB_Pos 10 /*!< Delay calibration flags of chanel B */ + +/* Bit field masks: */ +#define PWM_HRCTL_EDGMODEA_Msk 0x00000003UL /*!< Edge selecting for delay on chanel A */ +#define PWM_HRCTL_CTLMODEA_Msk 0x00000004UL /*!< Register specifies the delay select on chanel A */ +#define PWM_HRCTL_HRLOAD_Msk 0x00000008UL /*!< CMPAHR register shadow load mode */ +#define PWM_HRCTL_EDGMODEB_Msk 0x00000030UL /*!< Edge selecting for delay on chanel B */ +#define PWM_HRCTL_CTLMODEB_Msk 0x00000040UL /*!< Register specifies the delay select on chanel B */ +#define PWM_HRCTL_DELAYCALA_Msk 0x00000300UL /*!< Delay calibration flags of chanel A */ +#define PWM_HRCTL_DELAYCALB_Msk 0x00000C00UL /*!< Delay calibration flags of chanel B */ + +/* Bit field enums: */ +typedef enum { + PWM_HRCTL_EDGMODEA_PosEdge = 0x1UL, /*!< posedge will be delayed */ + PWM_HRCTL_EDGMODEA_NegEdge = 0x2UL, /*!< negedge will be delayed */ + PWM_HRCTL_EDGMODEA_BothEdge = 0x3UL, /*!< posedge and negedge will be delayed */ +} PWM_HRCTL_EDGMODEA_Enum; + +typedef enum { + PWM_HRCTL_CTLMODEA_CMPAHR = 0x0UL, /*!< delay source in CMPA reg */ + PWM_HRCTL_CTLMODEA_TBPHSHR = 0x1UL, /*!< delay source in TBPHS reg */ +} PWM_HRCTL_CTLMODEA_Enum; + +typedef enum { + PWM_HRCTL_EDGMODEB_PosEdge = 0x1UL, /*!< posedge will be delayed */ + PWM_HRCTL_EDGMODEB_NegEdge = 0x2UL, /*!< negedge will be delayed */ + PWM_HRCTL_EDGMODEB_BothEdge = 0x3UL, /*!< posedge and negedge will be delayed */ +} PWM_HRCTL_EDGMODEB_Enum; + +typedef enum { + PWM_HRCTL_CTLMODEB_CMPAHR = 0x0UL, /*!< delay source in CMPA reg */ + PWM_HRCTL_CTLMODEB_TBPHSHR = 0x1UL, /*!< delay source in TBPHS reg */ +} PWM_HRCTL_CTLMODEB_Enum; + +/*-- FWDTH: Filter Width select Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :8; /*!< Pulse filter width selection */ +} _PWM_FWDTH_bits; + +/* Bit field positions: */ +#define PWM_FWDTH_VAL_Pos 0 /*!< Pulse filter width selection */ + +/* Bit field masks: */ +#define PWM_FWDTH_VAL_Msk 0x000000FFUL /*!< Pulse filter width selection */ + +/*-- HDSEL0: Hold Detector event Select Register 0 -----------------------------------------------------------*/ +typedef struct { + uint32_t ADCDC0 :1; /*!< Hold detector event by ADC Digital Comparator 0 enable */ + uint32_t ADCDC1 :1; /*!< Hold detector event by ADC Digital Comparator 1 enable */ + uint32_t ADCDC2 :1; /*!< Hold detector event by ADC Digital Comparator 2 enable */ + uint32_t ADCDC3 :1; /*!< Hold detector event by ADC Digital Comparator 3 enable */ + uint32_t ADCDC4 :1; /*!< Hold detector event by ADC Digital Comparator 4 enable */ + uint32_t ADCDC5 :1; /*!< Hold detector event by ADC Digital Comparator 5 enable */ + uint32_t ADCDC6 :1; /*!< Hold detector event by ADC Digital Comparator 6 enable */ + uint32_t ADCDC7 :1; /*!< Hold detector event by ADC Digital Comparator 7 enable */ + uint32_t ADCDC8 :1; /*!< Hold detector event by ADC Digital Comparator 8 enable */ + uint32_t ADCDC9 :1; /*!< Hold detector event by ADC Digital Comparator 9 enable */ + uint32_t ADCDC10 :1; /*!< Hold detector event by ADC Digital Comparator 10 enable */ + uint32_t ADCDC11 :1; /*!< Hold detector event by ADC Digital Comparator 11 enable */ + uint32_t ADCDC12 :1; /*!< Hold detector event by ADC Digital Comparator 12 enable */ + uint32_t ADCDC13 :1; /*!< Hold detector event by ADC Digital Comparator 13 enable */ + uint32_t ADCDC14 :1; /*!< Hold detector event by ADC Digital Comparator 14 enable */ + uint32_t ADCDC15 :1; /*!< Hold detector event by ADC Digital Comparator 15 enable */ + uint32_t ADCDC16 :1; /*!< Hold detector event by ADC Digital Comparator 16 enable */ + uint32_t ADCDC17 :1; /*!< Hold detector event by ADC Digital Comparator 17 enable */ + uint32_t ADCDC18 :1; /*!< Hold detector event by ADC Digital Comparator 18 enable */ + uint32_t ADCDC19 :1; /*!< Hold detector event by ADC Digital Comparator 19 enable */ + uint32_t ADCDC20 :1; /*!< Hold detector event by ADC Digital Comparator 20 enable */ + uint32_t ADCDC21 :1; /*!< Hold detector event by ADC Digital Comparator 21 enable */ + uint32_t ADCDC22 :1; /*!< Hold detector event by ADC Digital Comparator 22 enable */ + uint32_t ADCDC23 :1; /*!< Hold detector event by ADC Digital Comparator 23 enable */ +} _PWM_HDSEL0_bits; + +/* Bit field positions: */ +#define PWM_HDSEL0_ADCDC0_Pos 0 /*!< Hold detector event by ADC Digital Comparator 0 enable */ +#define PWM_HDSEL0_ADCDC1_Pos 1 /*!< Hold detector event by ADC Digital Comparator 1 enable */ +#define PWM_HDSEL0_ADCDC2_Pos 2 /*!< Hold detector event by ADC Digital Comparator 2 enable */ +#define PWM_HDSEL0_ADCDC3_Pos 3 /*!< Hold detector event by ADC Digital Comparator 3 enable */ +#define PWM_HDSEL0_ADCDC4_Pos 4 /*!< Hold detector event by ADC Digital Comparator 4 enable */ +#define PWM_HDSEL0_ADCDC5_Pos 5 /*!< Hold detector event by ADC Digital Comparator 5 enable */ +#define PWM_HDSEL0_ADCDC6_Pos 6 /*!< Hold detector event by ADC Digital Comparator 6 enable */ +#define PWM_HDSEL0_ADCDC7_Pos 7 /*!< Hold detector event by ADC Digital Comparator 7 enable */ +#define PWM_HDSEL0_ADCDC8_Pos 8 /*!< Hold detector event by ADC Digital Comparator 8 enable */ +#define PWM_HDSEL0_ADCDC9_Pos 9 /*!< Hold detector event by ADC Digital Comparator 9 enable */ +#define PWM_HDSEL0_ADCDC10_Pos 10 /*!< Hold detector event by ADC Digital Comparator 10 enable */ +#define PWM_HDSEL0_ADCDC11_Pos 11 /*!< Hold detector event by ADC Digital Comparator 11 enable */ +#define PWM_HDSEL0_ADCDC12_Pos 12 /*!< Hold detector event by ADC Digital Comparator 12 enable */ +#define PWM_HDSEL0_ADCDC13_Pos 13 /*!< Hold detector event by ADC Digital Comparator 13 enable */ +#define PWM_HDSEL0_ADCDC14_Pos 14 /*!< Hold detector event by ADC Digital Comparator 14 enable */ +#define PWM_HDSEL0_ADCDC15_Pos 15 /*!< Hold detector event by ADC Digital Comparator 15 enable */ +#define PWM_HDSEL0_ADCDC16_Pos 16 /*!< Hold detector event by ADC Digital Comparator 16 enable */ +#define PWM_HDSEL0_ADCDC17_Pos 17 /*!< Hold detector event by ADC Digital Comparator 17 enable */ +#define PWM_HDSEL0_ADCDC18_Pos 18 /*!< Hold detector event by ADC Digital Comparator 18 enable */ +#define PWM_HDSEL0_ADCDC19_Pos 19 /*!< Hold detector event by ADC Digital Comparator 19 enable */ +#define PWM_HDSEL0_ADCDC20_Pos 20 /*!< Hold detector event by ADC Digital Comparator 20 enable */ +#define PWM_HDSEL0_ADCDC21_Pos 21 /*!< Hold detector event by ADC Digital Comparator 21 enable */ +#define PWM_HDSEL0_ADCDC22_Pos 22 /*!< Hold detector event by ADC Digital Comparator 22 enable */ +#define PWM_HDSEL0_ADCDC23_Pos 23 /*!< Hold detector event by ADC Digital Comparator 23 enable */ + +/* Bit field masks: */ +#define PWM_HDSEL0_ADCDC0_Msk 0x00000001UL /*!< Hold detector event by ADC Digital Comparator 0 enable */ +#define PWM_HDSEL0_ADCDC1_Msk 0x00000002UL /*!< Hold detector event by ADC Digital Comparator 1 enable */ +#define PWM_HDSEL0_ADCDC2_Msk 0x00000004UL /*!< Hold detector event by ADC Digital Comparator 2 enable */ +#define PWM_HDSEL0_ADCDC3_Msk 0x00000008UL /*!< Hold detector event by ADC Digital Comparator 3 enable */ +#define PWM_HDSEL0_ADCDC4_Msk 0x00000010UL /*!< Hold detector event by ADC Digital Comparator 4 enable */ +#define PWM_HDSEL0_ADCDC5_Msk 0x00000020UL /*!< Hold detector event by ADC Digital Comparator 5 enable */ +#define PWM_HDSEL0_ADCDC6_Msk 0x00000040UL /*!< Hold detector event by ADC Digital Comparator 6 enable */ +#define PWM_HDSEL0_ADCDC7_Msk 0x00000080UL /*!< Hold detector event by ADC Digital Comparator 7 enable */ +#define PWM_HDSEL0_ADCDC8_Msk 0x00000100UL /*!< Hold detector event by ADC Digital Comparator 8 enable */ +#define PWM_HDSEL0_ADCDC9_Msk 0x00000200UL /*!< Hold detector event by ADC Digital Comparator 9 enable */ +#define PWM_HDSEL0_ADCDC10_Msk 0x00000400UL /*!< Hold detector event by ADC Digital Comparator 10 enable */ +#define PWM_HDSEL0_ADCDC11_Msk 0x00000800UL /*!< Hold detector event by ADC Digital Comparator 11 enable */ +#define PWM_HDSEL0_ADCDC12_Msk 0x00001000UL /*!< Hold detector event by ADC Digital Comparator 12 enable */ +#define PWM_HDSEL0_ADCDC13_Msk 0x00002000UL /*!< Hold detector event by ADC Digital Comparator 13 enable */ +#define PWM_HDSEL0_ADCDC14_Msk 0x00004000UL /*!< Hold detector event by ADC Digital Comparator 14 enable */ +#define PWM_HDSEL0_ADCDC15_Msk 0x00008000UL /*!< Hold detector event by ADC Digital Comparator 15 enable */ +#define PWM_HDSEL0_ADCDC16_Msk 0x00010000UL /*!< Hold detector event by ADC Digital Comparator 16 enable */ +#define PWM_HDSEL0_ADCDC17_Msk 0x00020000UL /*!< Hold detector event by ADC Digital Comparator 17 enable */ +#define PWM_HDSEL0_ADCDC18_Msk 0x00040000UL /*!< Hold detector event by ADC Digital Comparator 18 enable */ +#define PWM_HDSEL0_ADCDC19_Msk 0x00080000UL /*!< Hold detector event by ADC Digital Comparator 19 enable */ +#define PWM_HDSEL0_ADCDC20_Msk 0x00100000UL /*!< Hold detector event by ADC Digital Comparator 20 enable */ +#define PWM_HDSEL0_ADCDC21_Msk 0x00200000UL /*!< Hold detector event by ADC Digital Comparator 21 enable */ +#define PWM_HDSEL0_ADCDC22_Msk 0x00400000UL /*!< Hold detector event by ADC Digital Comparator 22 enable */ +#define PWM_HDSEL0_ADCDC23_Msk 0x00800000UL /*!< Hold detector event by ADC Digital Comparator 23 enable */ + +/*-- HDSEL1: Hold Detector event Select Register 1 -----------------------------------------------------------*/ +typedef struct { + uint32_t SDFMH0 :1; /*!< Hold detector event by SDFM CMP0 signal Hi enable */ + uint32_t SDFMH1 :1; /*!< Hold detector event by SDFM CMP1 signal Hi enable */ + uint32_t SDFMH2 :1; /*!< Hold detector event by SDFM CMP2 signal Hi enable */ + uint32_t SDFMH3 :1; /*!< Hold detector event by SDFM CMP3 signal Hi enable */ + uint32_t SDFML0 :1; /*!< Hold detector event by SDFM CMP0 signal Low enable */ + uint32_t SDFML1 :1; /*!< Hold detector event by SDFM CMP1 signal Low enable */ + uint32_t SDFML2 :1; /*!< Hold detector event by SDFM CMP2 signal Low enable */ + uint32_t SDFML3 :1; /*!< Hold detector event by SDFM CMP3 signal Low enable */ + uint32_t SDFMZ0 :1; /*!< Hold detector event by SDFM CMP0 signal Hi-Z enable */ + uint32_t SDFMZ1 :1; /*!< Hold detector event by SDFM CMP1 signal Hi-Z enable */ + uint32_t SDFMZ2 :1; /*!< Hold detector event by SDFM CMP2 signal Hi-Z enable */ + uint32_t SDFMZ3 :1; /*!< Hold detector event by SDFM CMP3 signal Hi-Z enable */ +} _PWM_HDSEL1_bits; + +/* Bit field positions: */ +#define PWM_HDSEL1_SDFMH0_Pos 0 /*!< Hold detector event by SDFM CMP0 signal Hi enable */ +#define PWM_HDSEL1_SDFMH1_Pos 1 /*!< Hold detector event by SDFM CMP1 signal Hi enable */ +#define PWM_HDSEL1_SDFMH2_Pos 2 /*!< Hold detector event by SDFM CMP2 signal Hi enable */ +#define PWM_HDSEL1_SDFMH3_Pos 3 /*!< Hold detector event by SDFM CMP3 signal Hi enable */ +#define PWM_HDSEL1_SDFML0_Pos 4 /*!< Hold detector event by SDFM CMP0 signal Low enable */ +#define PWM_HDSEL1_SDFML1_Pos 5 /*!< Hold detector event by SDFM CMP1 signal Low enable */ +#define PWM_HDSEL1_SDFML2_Pos 6 /*!< Hold detector event by SDFM CMP2 signal Low enable */ +#define PWM_HDSEL1_SDFML3_Pos 7 /*!< Hold detector event by SDFM CMP3 signal Low enable */ +#define PWM_HDSEL1_SDFMZ0_Pos 8 /*!< Hold detector event by SDFM CMP0 signal Hi-Z enable */ +#define PWM_HDSEL1_SDFMZ1_Pos 9 /*!< Hold detector event by SDFM CMP1 signal Hi-Z enable */ +#define PWM_HDSEL1_SDFMZ2_Pos 10 /*!< Hold detector event by SDFM CMP2 signal Hi-Z enable */ +#define PWM_HDSEL1_SDFMZ3_Pos 11 /*!< Hold detector event by SDFM CMP3 signal Hi-Z enable */ + +/* Bit field masks: */ +#define PWM_HDSEL1_SDFMH0_Msk 0x00000001UL /*!< Hold detector event by SDFM CMP0 signal Hi enable */ +#define PWM_HDSEL1_SDFMH1_Msk 0x00000002UL /*!< Hold detector event by SDFM CMP1 signal Hi enable */ +#define PWM_HDSEL1_SDFMH2_Msk 0x00000004UL /*!< Hold detector event by SDFM CMP2 signal Hi enable */ +#define PWM_HDSEL1_SDFMH3_Msk 0x00000008UL /*!< Hold detector event by SDFM CMP3 signal Hi enable */ +#define PWM_HDSEL1_SDFML0_Msk 0x00000010UL /*!< Hold detector event by SDFM CMP0 signal Low enable */ +#define PWM_HDSEL1_SDFML1_Msk 0x00000020UL /*!< Hold detector event by SDFM CMP1 signal Low enable */ +#define PWM_HDSEL1_SDFML2_Msk 0x00000040UL /*!< Hold detector event by SDFM CMP2 signal Low enable */ +#define PWM_HDSEL1_SDFML3_Msk 0x00000080UL /*!< Hold detector event by SDFM CMP3 signal Low enable */ +#define PWM_HDSEL1_SDFMZ0_Msk 0x00000100UL /*!< Hold detector event by SDFM CMP0 signal Hi-Z enable */ +#define PWM_HDSEL1_SDFMZ1_Msk 0x00000200UL /*!< Hold detector event by SDFM CMP1 signal Hi-Z enable */ +#define PWM_HDSEL1_SDFMZ2_Msk 0x00000400UL /*!< Hold detector event by SDFM CMP2 signal Hi-Z enable */ +#define PWM_HDSEL1_SDFMZ3_Msk 0x00000800UL /*!< Hold detector event by SDFM CMP3 signal Hi-Z enable */ + +/*-- HDCTL: Hold Detector Control register -------------------------------------------------------------------*/ +typedef struct { + uint32_t HDA :2; /*!< Action when hold detection A is invoked */ + uint32_t HDB :2; /*!< Action when hold detection B is invoked */ + uint32_t :4; /*!< RESERVED */ + uint32_t CBC :1; /*!< Cycle-by-Cycle hold detector enable */ + uint32_t :3; /*!< RESERVED */ + uint32_t OST :1; /*!< One-Shot hold detector enable */ +} _PWM_HDCTL_bits; + +/* Bit field positions: */ +#define PWM_HDCTL_HDA_Pos 0 /*!< Action when hold detection A is invoked */ +#define PWM_HDCTL_HDB_Pos 2 /*!< Action when hold detection B is invoked */ +#define PWM_HDCTL_CBC_Pos 8 /*!< Cycle-by-Cycle hold detector enable */ +#define PWM_HDCTL_OST_Pos 12 /*!< One-Shot hold detector enable */ + +/* Bit field masks: */ +#define PWM_HDCTL_HDA_Msk 0x00000003UL /*!< Action when hold detection A is invoked */ +#define PWM_HDCTL_HDB_Msk 0x0000000CUL /*!< Action when hold detection B is invoked */ +#define PWM_HDCTL_CBC_Msk 0x00000100UL /*!< Cycle-by-Cycle hold detector enable */ +#define PWM_HDCTL_OST_Msk 0x00001000UL /*!< One-Shot hold detector enable */ + +/* Bit field enums: */ +typedef enum { + PWM_HDCTL_HDA_Set = 0x1UL, /*!< PWMA/PWMB go to 1 on failture */ + PWM_HDCTL_HDA_Clear = 0x2UL, /*!< PWMA/PWMB go to 0 on failture */ + PWM_HDCTL_HDA_NoAction = 0x3UL, /*!< no action on failture */ +} PWM_HDCTL_HDA_Enum; + +typedef enum { + PWM_HDCTL_HDB_Set = 0x1UL, /*!< PWMA/PWMB go to 1 on failture */ + PWM_HDCTL_HDB_Clear = 0x2UL, /*!< PWMA/PWMB go to 0 on failture */ + PWM_HDCTL_HDB_NoAction = 0x3UL, /*!< no action on failture */ +} PWM_HDCTL_HDB_Enum; + +/*-- HDEINT: Hold Detector Enable Interrupt Register ---------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t CBC :1; /*!< Hold detector Cycle-by-Cycle interrupt enable */ + uint32_t OST :1; /*!< Hold detector One-Shot interrupt enable */ +} _PWM_HDEINT_bits; + +/* Bit field positions: */ +#define PWM_HDEINT_CBC_Pos 1 /*!< Hold detector Cycle-by-Cycle interrupt enable */ +#define PWM_HDEINT_OST_Pos 2 /*!< Hold detector One-Shot interrupt enable */ + +/* Bit field masks: */ +#define PWM_HDEINT_CBC_Msk 0x00000002UL /*!< Hold detector Cycle-by-Cycle interrupt enable */ +#define PWM_HDEINT_OST_Msk 0x00000004UL /*!< Hold detector One-Shot interrupt enable */ + +/*-- HDFLG: Hold Detector Flag Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Latched hold detector interrupt status flag */ + uint32_t CBC :1; /*!< Latched status flag for hold detector Cycle-by-Cycle event */ + uint32_t OST :1; /*!< Latched status flag for hold detector One-Shot event */ +} _PWM_HDFLG_bits; + +/* Bit field positions: */ +#define PWM_HDFLG_INT_Pos 0 /*!< Latched hold detector interrupt status flag */ +#define PWM_HDFLG_CBC_Pos 1 /*!< Latched status flag for hold detector Cycle-by-Cycle event */ +#define PWM_HDFLG_OST_Pos 2 /*!< Latched status flag for hold detector One-Shot event */ + +/* Bit field masks: */ +#define PWM_HDFLG_INT_Msk 0x00000001UL /*!< Latched hold detector interrupt status flag */ +#define PWM_HDFLG_CBC_Msk 0x00000002UL /*!< Latched status flag for hold detector Cycle-by-Cycle event */ +#define PWM_HDFLG_OST_Msk 0x00000004UL /*!< Latched status flag for hold detector One-Shot event */ + +/*-- HDCLR: Register clear HD flag ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Clear hold detector interrupt flag */ + uint32_t CBC :1; /*!< Clear flag for Cycle-By-Cycle hold detector latch + */ + uint32_t OST :1; /*!< Clear flag for One-Shot hold detector latch */ +} _PWM_HDCLR_bits; + +/* Bit field positions: */ +#define PWM_HDCLR_INT_Pos 0 /*!< Clear hold detector interrupt flag */ +#define PWM_HDCLR_CBC_Pos 1 /*!< Clear flag for Cycle-By-Cycle hold detector latch + */ +#define PWM_HDCLR_OST_Pos 2 /*!< Clear flag for One-Shot hold detector latch */ + +/* Bit field masks: */ +#define PWM_HDCLR_INT_Msk 0x00000001UL /*!< Clear hold detector interrupt flag */ +#define PWM_HDCLR_CBC_Msk 0x00000002UL /*!< Clear flag for Cycle-By-Cycle hold detector latch + */ +#define PWM_HDCLR_OST_Msk 0x00000004UL /*!< Clear flag for One-Shot hold detector latch */ + +/*-- HDFRC: Hold Detector Force Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t CBC :1; /*!< Force a Cycle-by-Cycle hold detector event via software */ + uint32_t OST :1; /*!< Force a One-Shot hold detector event via software */ +} _PWM_HDFRC_bits; + +/* Bit field positions: */ +#define PWM_HDFRC_CBC_Pos 1 /*!< Force a Cycle-by-Cycle hold detector event via software */ +#define PWM_HDFRC_OST_Pos 2 /*!< Force a One-Shot hold detector event via software */ + +/* Bit field masks: */ +#define PWM_HDFRC_CBC_Msk 0x00000002UL /*!< Force a Cycle-by-Cycle hold detector event via software */ +#define PWM_HDFRC_OST_Msk 0x00000004UL /*!< Force a One-Shot hold detector event via software */ + +/*-- HDINTCLR: Hold Detector Interrupt pending Clear Register ------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Clear HD interrupt pending */ +} _PWM_HDINTCLR_bits; + +/* Bit field positions: */ +#define PWM_HDINTCLR_INT_Pos 0 /*!< Clear HD interrupt pending */ + +/* Bit field masks: */ +#define PWM_HDINTCLR_INT_Msk 0x00000001UL /*!< Clear HD interrupt pending */ + +/*-- TZINTCLR: Trip-Zone Interrupt pending Clear Register ----------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Clear TZ interrupt pending */ +} _PWM_TZINTCLR_bits; + +/* Bit field positions: */ +#define PWM_TZINTCLR_INT_Pos 0 /*!< Clear TZ interrupt pending */ + +/* Bit field masks: */ +#define PWM_TZINTCLR_INT_Msk 0x00000001UL /*!< Clear TZ interrupt pending */ + +/*-- INTCLR: PWM Interrupt pending Clear Register ------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Clear interrupt pending */ +} _PWM_INTCLR_bits; + +/* Bit field positions: */ +#define PWM_INTCLR_INT_Pos 0 /*!< Clear interrupt pending */ + +/* Bit field masks: */ +#define PWM_INTCLR_INT_Msk 0x00000001UL /*!< Clear interrupt pending */ + +typedef struct { + union { /*!< Time-Base Control Register */ + __IO uint32_t TBCTL; /*!< TBCTL : type used for word access */ + __IO _PWM_TBCTL_bits TBCTL_bit; /*!< TBCTL_bit: structure used for bit access */ + }; + union { /*!< Time-Base Status Register */ + __IO uint32_t TBSTS; /*!< TBSTS : type used for word access */ + __IO _PWM_TBSTS_bits TBSTS_bit; /*!< TBSTS_bit: structure used for bit access */ + }; + union { /*!< Time-Base Phase Register */ + __IO uint32_t TBPHS; /*!< TBPHS : type used for word access */ + __IO _PWM_TBPHS_bits TBPHS_bit; /*!< TBPHS_bit: structure used for bit access */ + }; + union { /*!< Time-Base Counter Register */ + __IO uint32_t TBCTR; /*!< TBCTR : type used for word access */ + __IO _PWM_TBCTR_bits TBCTR_bit; /*!< TBCTR_bit: structure used for bit access */ + }; + union { /*!< Time-Base Period Register */ + __IO uint32_t TBPRD; /*!< TBPRD : type used for word access */ + __IO _PWM_TBPRD_bits TBPRD_bit; /*!< TBPRD_bit: structure used for bit access */ + }; + union { /*!< Counter-Compare Control Register */ + __IO uint32_t CMPCTL; /*!< CMPCTL : type used for word access */ + __IO _PWM_CMPCTL_bits CMPCTL_bit; /*!< CMPCTL_bit: structure used for bit access */ + }; + union { /*!< Counter-Compare A Register */ + __IO uint32_t CMPA; /*!< CMPA : type used for word access */ + __IO _PWM_CMPA_bits CMPA_bit; /*!< CMPA_bit: structure used for bit access */ + }; + union { /*!< Counter-Compare B Register */ + __IO uint32_t CMPB; /*!< CMPB : type used for word access */ + __IO _PWM_CMPB_bits CMPB_bit; /*!< CMPB_bit: structure used for bit access */ + }; + union { /*!< Action-Qualifier Output A Control Register */ + __IO uint32_t AQCTLA; /*!< AQCTLA : type used for word access */ + __IO _PWM_AQCTLA_bits AQCTLA_bit; /*!< AQCTLA_bit: structure used for bit access */ + }; + union { /*!< Action-Qualifier Output B Control Register */ + __IO uint32_t AQCTLB; /*!< AQCTLB : type used for word access */ + __IO _PWM_AQCTLB_bits AQCTLB_bit; /*!< AQCTLB_bit: structure used for bit access */ + }; + union { /*!< Action-Qualifier Software Force Register */ + __IO uint32_t AQSFRC; /*!< AQSFRC : type used for word access */ + __IO _PWM_AQSFRC_bits AQSFRC_bit; /*!< AQSFRC_bit: structure used for bit access */ + }; + union { /*!< Action-Qualifier Continuous Software Force Register */ + __IO uint32_t AQCSFRC; /*!< AQCSFRC : type used for word access */ + __IO _PWM_AQCSFRC_bits AQCSFRC_bit; /*!< AQCSFRC_bit: structure used for bit access */ + }; + union { /*!< Dead-Band Generator Control Register */ + __IO uint32_t DBCTL; /*!< DBCTL : type used for word access */ + __IO _PWM_DBCTL_bits DBCTL_bit; /*!< DBCTL_bit: structure used for bit access */ + }; + union { /*!< Dead-Band Generator Rising Edge Delay Register */ + __IO uint32_t DBRED; /*!< DBRED : type used for word access */ + __IO _PWM_DBRED_bits DBRED_bit; /*!< DBRED_bit: structure used for bit access */ + }; + union { /*!< Dead-Band Generator Falling Edge Delay Register */ + __IO uint32_t DBFED; /*!< DBFED : type used for word access */ + __IO _PWM_DBFED_bits DBFED_bit; /*!< DBFED_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Select Register */ + __IO uint32_t TZSEL; /*!< TZSEL : type used for word access */ + __IO _PWM_TZSEL_bits TZSEL_bit; /*!< TZSEL_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Control Register */ + __IO uint32_t TZCTL; /*!< TZCTL : type used for word access */ + __IO _PWM_TZCTL_bits TZCTL_bit; /*!< TZCTL_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Enable Interrupt Register */ + __IO uint32_t TZEINT; /*!< TZEINT : type used for word access */ + __IO _PWM_TZEINT_bits TZEINT_bit; /*!< TZEINT_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Flag Register */ + __I uint32_t TZFLG; /*!< TZFLG : type used for word access */ + __I _PWM_TZFLG_bits TZFLG_bit; /*!< TZFLG_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Clear Register */ + __O uint32_t TZCLR; /*!< TZCLR : type used for word access */ + __O _PWM_TZCLR_bits TZCLR_bit; /*!< TZCLR_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Force Register */ + __O uint32_t TZFRC; /*!< TZFRC : type used for word access */ + __O _PWM_TZFRC_bits TZFRC_bit; /*!< TZFRC_bit: structure used for bit access */ + }; + union { /*!< Event-Trigger Selection Register */ + __IO uint32_t ETSEL; /*!< ETSEL : type used for word access */ + __IO _PWM_ETSEL_bits ETSEL_bit; /*!< ETSEL_bit: structure used for bit access */ + }; + union { /*!< Event-Trigger Prescale Register */ + __IO uint32_t ETPS; /*!< ETPS : type used for word access */ + __IO _PWM_ETPS_bits ETPS_bit; /*!< ETPS_bit: structure used for bit access */ + }; + union { /*!< Event-Trigger Flag Register */ + __I uint32_t ETFLG; /*!< ETFLG : type used for word access */ + __I _PWM_ETFLG_bits ETFLG_bit; /*!< ETFLG_bit: structure used for bit access */ + }; + union { /*!< Event-Trigger Clear Register */ + __O uint32_t ETCLR; /*!< ETCLR : type used for word access */ + __O _PWM_ETCLR_bits ETCLR_bit; /*!< ETCLR_bit: structure used for bit access */ + }; + union { /*!< Event-Trigger Force Register */ + __O uint32_t ETFRC; /*!< ETFRC : type used for word access */ + __O _PWM_ETFRC_bits ETFRC_bit; /*!< ETFRC_bit: structure used for bit access */ + }; + union { /*!< PWM-Chopper Control Register */ + __IO uint32_t PCCTL; /*!< PCCTL : type used for word access */ + __IO _PWM_PCCTL_bits PCCTL_bit; /*!< PCCTL_bit: structure used for bit access */ + }; + union { /*!< High-Resolution Control Register */ + __IO uint32_t HRCTL; /*!< HRCTL : type used for word access */ + __IO _PWM_HRCTL_bits HRCTL_bit; /*!< HRCTL_bit: structure used for bit access */ + }; + union { /*!< Filter Width select Register */ + __IO uint32_t FWDTH; /*!< FWDTH : type used for word access */ + __IO _PWM_FWDTH_bits FWDTH_bit; /*!< FWDTH_bit: structure used for bit access */ + }; + union { /*!< Hold Detector event Select Register 0 */ + __IO uint32_t HDSEL0; /*!< HDSEL0 : type used for word access */ + __IO _PWM_HDSEL0_bits HDSEL0_bit; /*!< HDSEL0_bit: structure used for bit access */ + }; + union { /*!< Hold Detector event Select Register 1 */ + __IO uint32_t HDSEL1; /*!< HDSEL1 : type used for word access */ + __IO _PWM_HDSEL1_bits HDSEL1_bit; /*!< HDSEL1_bit: structure used for bit access */ + }; + union { /*!< Hold Detector Control register */ + __IO uint32_t HDCTL; /*!< HDCTL : type used for word access */ + __IO _PWM_HDCTL_bits HDCTL_bit; /*!< HDCTL_bit: structure used for bit access */ + }; + union { /*!< Hold Detector Enable Interrupt Register */ + __IO uint32_t HDEINT; /*!< HDEINT : type used for word access */ + __IO _PWM_HDEINT_bits HDEINT_bit; /*!< HDEINT_bit: structure used for bit access */ + }; + union { /*!< Hold Detector Flag Register */ + __I uint32_t HDFLG; /*!< HDFLG : type used for word access */ + __I _PWM_HDFLG_bits HDFLG_bit; /*!< HDFLG_bit: structure used for bit access */ + }; + union { /*!< Register clear HD flag */ + __O uint32_t HDCLR; /*!< HDCLR : type used for word access */ + __O _PWM_HDCLR_bits HDCLR_bit; /*!< HDCLR_bit: structure used for bit access */ + }; + union { /*!< Hold Detector Force Register */ + __O uint32_t HDFRC; /*!< HDFRC : type used for word access */ + __O _PWM_HDFRC_bits HDFRC_bit; /*!< HDFRC_bit: structure used for bit access */ + }; + union { /*!< Hold Detector Interrupt pending Clear Register */ + __O uint32_t HDINTCLR; /*!< HDINTCLR : type used for word access */ + __O _PWM_HDINTCLR_bits HDINTCLR_bit; /*!< HDINTCLR_bit: structure used for bit access */ + }; + union { /*!< Trip-Zone Interrupt pending Clear Register */ + __O uint32_t TZINTCLR; /*!< TZINTCLR : type used for word access */ + __O _PWM_TZINTCLR_bits TZINTCLR_bit; /*!< TZINTCLR_bit: structure used for bit access */ + }; + union { /*!< PWM Interrupt pending Clear Register */ + __O uint32_t INTCLR; /*!< INTCLR : type used for word access */ + __O _PWM_INTCLR_bits INTCLR_bit; /*!< INTCLR_bit: structure used for bit access */ + }; +} PWM_TypeDef; + + +/******************************************************************************/ +/* ETH registers */ +/******************************************************************************/ + +/*-- MAC1: MAC configuration register 1 ----------------------------------------------------------------------*/ +typedef struct { + uint32_t RXENABLE :1; /*!< Frame reception enable bit */ + uint32_t PASSALL :1; /*!< Bit control PASS */ + uint32_t RXPAUSE :1; /*!< Enable receiving a pause as part of Frame */ + uint32_t TXPAUSE :1; /*!< Enable transmission pauses Frame */ + uint32_t LOOPBACK :1; /*!< Bit activate reception of packets transmitted back through MACReceive-interface */ + uint32_t :3; /*!< RESERVED */ + uint32_t RESETTFUN :1; /*!< Reset bit logic devices packet */ + uint32_t RESETTMCS :1; /*!< Reset bit device MAC layer, responsible for managing addresses in information transmission Reset bit device MAC layer, responsible for managing addresses in information transmission */ + uint32_t RESETRFUN :1; /*!< Reset bit logic devices receive packets */ + uint32_t RESETRMCS :1; /*!< Reset bit device MAC layer, responsible for managing the filtering addresses of packets received */ + uint32_t :2; /*!< RESERVED */ + uint32_t SIMRESET :1; /*!< Reset bit random number generator transmitting device */ + uint32_t SOFTRESET :1; /*!< Reset bit block MAC Ethernet Controller */ +} _ETH_MAC1_bits; + +/* Bit field positions: */ +#define ETH_MAC1_RXENABLE_Pos 0 /*!< Frame reception enable bit */ +#define ETH_MAC1_PASSALL_Pos 1 /*!< Bit control PASS */ +#define ETH_MAC1_RXPAUSE_Pos 2 /*!< Enable receiving a pause as part of Frame */ +#define ETH_MAC1_TXPAUSE_Pos 3 /*!< Enable transmission pauses Frame */ +#define ETH_MAC1_LOOPBACK_Pos 4 /*!< Bit activate reception of packets transmitted back through MACReceive-interface */ +#define ETH_MAC1_RESETTFUN_Pos 8 /*!< Reset bit logic devices packet */ +#define ETH_MAC1_RESETTMCS_Pos 9 /*!< Reset bit device MAC layer, responsible for managing addresses in information transmission Reset bit device MAC layer, responsible for managing addresses in information transmission */ +#define ETH_MAC1_RESETRFUN_Pos 10 /*!< Reset bit logic devices receive packets */ +#define ETH_MAC1_RESETRMCS_Pos 11 /*!< Reset bit device MAC layer, responsible for managing the filtering addresses of packets received */ +#define ETH_MAC1_SIMRESET_Pos 14 /*!< Reset bit random number generator transmitting device */ +#define ETH_MAC1_SOFTRESET_Pos 15 /*!< Reset bit block MAC Ethernet Controller */ + +/* Bit field masks: */ +#define ETH_MAC1_RXENABLE_Msk 0x00000001UL /*!< Frame reception enable bit */ +#define ETH_MAC1_PASSALL_Msk 0x00000002UL /*!< Bit control PASS */ +#define ETH_MAC1_RXPAUSE_Msk 0x00000004UL /*!< Enable receiving a pause as part of Frame */ +#define ETH_MAC1_TXPAUSE_Msk 0x00000008UL /*!< Enable transmission pauses Frame */ +#define ETH_MAC1_LOOPBACK_Msk 0x00000010UL /*!< Bit activate reception of packets transmitted back through MACReceive-interface */ +#define ETH_MAC1_RESETTFUN_Msk 0x00000100UL /*!< Reset bit logic devices packet */ +#define ETH_MAC1_RESETTMCS_Msk 0x00000200UL /*!< Reset bit device MAC layer, responsible for managing addresses in information transmission Reset bit device MAC layer, responsible for managing addresses in information transmission */ +#define ETH_MAC1_RESETRFUN_Msk 0x00000400UL /*!< Reset bit logic devices receive packets */ +#define ETH_MAC1_RESETRMCS_Msk 0x00000800UL /*!< Reset bit device MAC layer, responsible for managing the filtering addresses of packets received */ +#define ETH_MAC1_SIMRESET_Msk 0x00004000UL /*!< Reset bit random number generator transmitting device */ +#define ETH_MAC1_SOFTRESET_Msk 0x00008000UL /*!< Reset bit block MAC Ethernet Controller */ + +/*-- MAC2: MAC configuration register 2 ----------------------------------------------------------------------*/ +typedef struct { + uint32_t FULLDUPLEX :1; /*!< Mode Select bit MAC-run operations */ + uint32_t LENGTHCHECK :1; /*!< Enable bit komparatsii length Frame */ + uint32_t HUGEFRAME :1; /*!< Enable Bit Frame reception and transmission of arbitrary length */ + uint32_t DELAYCRC :1; /*!< Enable bit adding a 4-byte CRC */ + uint32_t CRCENABLE :1; /*!< Enable bit CRC inserter */ + uint32_t PADENABLE :1; /*!< Bit resolution and functioning bits AUTOPAD VLANPAD */ + uint32_t VLANPAD :1; /*!< Enable bit short additions Frame */ + uint32_t AUTOPAD :1; /*!< Bit enable automatic determination of type Frame */ + uint32_t PUREPRE :1; /*!< Bit enable validation preamble */ + uint32_t LONGPRE :1; /*!< Select bit preamble length packets received */ + uint32_t :2; /*!< RESERVED */ + uint32_t NOBACKOFF :1; /*!< Bit parameter setting retransmission in conflict */ + uint32_t BPNOBACKOFF :1; /*!< Enable bit retransmission in conflict */ + uint32_t EXCESSDEF :1; /*!< Mode Select bit packet processing */ +} _ETH_MAC2_bits; + +/* Bit field positions: */ +#define ETH_MAC2_FULLDUPLEX_Pos 0 /*!< Mode Select bit MAC-run operations */ +#define ETH_MAC2_LENGTHCHECK_Pos 1 /*!< Enable bit komparatsii length Frame */ +#define ETH_MAC2_HUGEFRAME_Pos 2 /*!< Enable Bit Frame reception and transmission of arbitrary length */ +#define ETH_MAC2_DELAYCRC_Pos 3 /*!< Enable bit adding a 4-byte CRC */ +#define ETH_MAC2_CRCENABLE_Pos 4 /*!< Enable bit CRC inserter */ +#define ETH_MAC2_PADENABLE_Pos 5 /*!< Bit resolution and functioning bits AUTOPAD VLANPAD */ +#define ETH_MAC2_VLANPAD_Pos 6 /*!< Enable bit short additions Frame */ +#define ETH_MAC2_AUTOPAD_Pos 7 /*!< Bit enable automatic determination of type Frame */ +#define ETH_MAC2_PUREPRE_Pos 8 /*!< Bit enable validation preamble */ +#define ETH_MAC2_LONGPRE_Pos 9 /*!< Select bit preamble length packets received */ +#define ETH_MAC2_NOBACKOFF_Pos 12 /*!< Bit parameter setting retransmission in conflict */ +#define ETH_MAC2_BPNOBACKOFF_Pos 13 /*!< Enable bit retransmission in conflict */ +#define ETH_MAC2_EXCESSDEF_Pos 14 /*!< Mode Select bit packet processing */ + +/* Bit field masks: */ +#define ETH_MAC2_FULLDUPLEX_Msk 0x00000001UL /*!< Mode Select bit MAC-run operations */ +#define ETH_MAC2_LENGTHCHECK_Msk 0x00000002UL /*!< Enable bit komparatsii length Frame */ +#define ETH_MAC2_HUGEFRAME_Msk 0x00000004UL /*!< Enable Bit Frame reception and transmission of arbitrary length */ +#define ETH_MAC2_DELAYCRC_Msk 0x00000008UL /*!< Enable bit adding a 4-byte CRC */ +#define ETH_MAC2_CRCENABLE_Msk 0x00000010UL /*!< Enable bit CRC inserter */ +#define ETH_MAC2_PADENABLE_Msk 0x00000020UL /*!< Bit resolution and functioning bits AUTOPAD VLANPAD */ +#define ETH_MAC2_VLANPAD_Msk 0x00000040UL /*!< Enable bit short additions Frame */ +#define ETH_MAC2_AUTOPAD_Msk 0x00000080UL /*!< Bit enable automatic determination of type Frame */ +#define ETH_MAC2_PUREPRE_Msk 0x00000100UL /*!< Bit enable validation preamble */ +#define ETH_MAC2_LONGPRE_Msk 0x00000200UL /*!< Select bit preamble length packets received */ +#define ETH_MAC2_NOBACKOFF_Msk 0x00001000UL /*!< Bit parameter setting retransmission in conflict */ +#define ETH_MAC2_BPNOBACKOFF_Msk 0x00002000UL /*!< Enable bit retransmission in conflict */ +#define ETH_MAC2_EXCESSDEF_Msk 0x00004000UL /*!< Mode Select bit packet processing */ + +/*-- IPGT: Back-to-Back Inter-Packet-Gap Register ------------------------------------------------------------*/ +typedef struct { + uint32_t BTBIPG :7; /*!< Field specifying the minimum time between the end of transmission of the last nibble packet before transmission of the next packet */ +} _ETH_IPGT_bits; + +/* Bit field positions: */ +#define ETH_IPGT_BTBIPG_Pos 0 /*!< Field specifying the minimum time between the end of transmission of the last nibble packet before transmission of the next packet */ + +/* Bit field masks: */ +#define ETH_IPGT_BTBIPG_Msk 0x0000007FUL /*!< Field specifying the minimum time between the end of transmission of the last nibble packet before transmission of the next packet */ + +/*-- IPGR: Register Non-Back-to-Back Inter-Packet-Gap --------------------------------------------------------*/ +typedef struct { + uint32_t NBTBIPGP2 :7; /*!< Non-back-to-back Inter-Packet-Gap part 2 */ + uint32_t :1; /*!< RESERVED */ + uint32_t NBTBIPGP1 :7; /*!< Non-back-to-back Inter-Packet-Gap part 1 - option carrier sense */ +} _ETH_IPGR_bits; + +/* Bit field positions: */ +#define ETH_IPGR_NBTBIPGP2_Pos 0 /*!< Non-back-to-back Inter-Packet-Gap part 2 */ +#define ETH_IPGR_NBTBIPGP1_Pos 8 /*!< Non-back-to-back Inter-Packet-Gap part 1 - option carrier sense */ + +/* Bit field masks: */ +#define ETH_IPGR_NBTBIPGP2_Msk 0x0000007FUL /*!< Non-back-to-back Inter-Packet-Gap part 2 */ +#define ETH_IPGR_NBTBIPGP1_Msk 0x00007F00UL /*!< Non-back-to-back Inter-Packet-Gap part 1 - option carrier sense */ + +/*-- CLRT: Register collision window -------------------------------------------------------------------------*/ +typedef struct { + uint32_t RETRMAX :4; /*!< */ + uint32_t :4; /*!< RESERVED */ + uint32_t COLLWIN :6; /*!< */ +} _ETH_CLRT_bits; + +/* Bit field positions: */ +#define ETH_CLRT_RETRMAX_Pos 0 /*!< */ +#define ETH_CLRT_COLLWIN_Pos 8 /*!< */ + +/* Bit field masks: */ +#define ETH_CLRT_RETRMAX_Msk 0x0000000FUL /*!< */ +#define ETH_CLRT_COLLWIN_Msk 0x00003F00UL /*!< */ + +/*-- MAXF: Register the upper limit size Frame ---------------------------------------------------------------*/ +typedef struct { + uint32_t MAXFRLEN :16; /*!< Frame maximum length */ +} _ETH_MAXF_bits; + +/* Bit field positions: */ +#define ETH_MAXF_MAXFRLEN_Pos 0 /*!< Frame maximum length */ + +/* Bit field masks: */ +#define ETH_MAXF_MAXFRLEN_Msk 0x0000FFFFUL /*!< Frame maximum length */ + +/*-- SUPP: Register PHY-support interface --------------------------------------------------------------------*/ +typedef struct { + uint32_t BITMODE :1; /*!< Activated mode 10BASE-T ENDEC */ + uint32_t ENBLJABBER :1; /*!< Enable bit of protection against incorrect data transmission mode 10T ENDEC */ + uint32_t :1; /*!< RESERVED */ + uint32_t RESET10T :1; /*!< Reset bit module, which converts the MII nibble streams into a serial bit stream mode transceiver 10T */ + uint32_t LINKFAIL :1; /*!< Bit resolution modeling */ + uint32_t NOCIPHER :1; /*!< Select encryption */ + uint32_t FORCEQUIET :1; /*!< enable encryption */ + uint32_t RESET100X :1; /*!< Reset bit of the module that contains the logic of the encoder / decoder bit characters 4/5 bits */ + uint32_t SPEED :1; /*!< Bits set the operating speed simplified MII */ + uint32_t :2; /*!< RESERVED */ + uint32_t RESETRMII :1; /*!< Reset bit simplified logic MII */ + uint32_t PHYMODE :1; /*!< Bit configuration consistent with MI SMII-connected devices */ + uint32_t :2; /*!< RESERVED */ + uint32_t RESETINT :1; /*!< Reset bit of the physical interface */ +} _ETH_SUPP_bits; + +/* Bit field positions: */ +#define ETH_SUPP_BITMODE_Pos 0 /*!< Activated mode 10BASE-T ENDEC */ +#define ETH_SUPP_ENBLJABBER_Pos 1 /*!< Enable bit of protection against incorrect data transmission mode 10T ENDEC */ +#define ETH_SUPP_RESET10T_Pos 3 /*!< Reset bit module, which converts the MII nibble streams into a serial bit stream mode transceiver 10T */ +#define ETH_SUPP_LINKFAIL_Pos 4 /*!< Bit resolution modeling */ +#define ETH_SUPP_NOCIPHER_Pos 5 /*!< Select encryption */ +#define ETH_SUPP_FORCEQUIET_Pos 6 /*!< enable encryption */ +#define ETH_SUPP_RESET100X_Pos 7 /*!< Reset bit of the module that contains the logic of the encoder / decoder bit characters 4/5 bits */ +#define ETH_SUPP_SPEED_Pos 8 /*!< Bits set the operating speed simplified MII */ +#define ETH_SUPP_RESETRMII_Pos 11 /*!< Reset bit simplified logic MII */ +#define ETH_SUPP_PHYMODE_Pos 12 /*!< Bit configuration consistent with MI SMII-connected devices */ +#define ETH_SUPP_RESETINT_Pos 15 /*!< Reset bit of the physical interface */ + +/* Bit field masks: */ +#define ETH_SUPP_BITMODE_Msk 0x00000001UL /*!< Activated mode 10BASE-T ENDEC */ +#define ETH_SUPP_ENBLJABBER_Msk 0x00000002UL /*!< Enable bit of protection against incorrect data transmission mode 10T ENDEC */ +#define ETH_SUPP_RESET10T_Msk 0x00000008UL /*!< Reset bit module, which converts the MII nibble streams into a serial bit stream mode transceiver 10T */ +#define ETH_SUPP_LINKFAIL_Msk 0x00000010UL /*!< Bit resolution modeling */ +#define ETH_SUPP_NOCIPHER_Msk 0x00000020UL /*!< Select encryption */ +#define ETH_SUPP_FORCEQUIET_Msk 0x00000040UL /*!< enable encryption */ +#define ETH_SUPP_RESET100X_Msk 0x00000080UL /*!< Reset bit of the module that contains the logic of the encoder / decoder bit characters 4/5 bits */ +#define ETH_SUPP_SPEED_Msk 0x00000100UL /*!< Bits set the operating speed simplified MII */ +#define ETH_SUPP_RESETRMII_Msk 0x00000800UL /*!< Reset bit simplified logic MII */ +#define ETH_SUPP_PHYMODE_Msk 0x00001000UL /*!< Bit configuration consistent with MI SMII-connected devices */ +#define ETH_SUPP_RESETINT_Msk 0x00008000UL /*!< Reset bit of the physical interface */ + +/*-- MCFG: Configuration control register MII ----------------------------------------------------------------*/ +typedef struct { + uint32_t SCANINC :1; /*!< Reading module addresses all MII PHY */ + uint32_t NOPRE :1; /*!< Control bit preamble */ + uint32_t CLKSEL :3; /*!< Selection field frequency divider */ + uint32_t :10; /*!< RESERVED */ + uint32_t RESETMGMT :1; /*!< Reset bit MII management module */ +} _ETH_MCFG_bits; + +/* Bit field positions: */ +#define ETH_MCFG_SCANINC_Pos 0 /*!< Reading module addresses all MII PHY */ +#define ETH_MCFG_NOPRE_Pos 1 /*!< Control bit preamble */ +#define ETH_MCFG_CLKSEL_Pos 2 /*!< Selection field frequency divider */ +#define ETH_MCFG_RESETMGMT_Pos 15 /*!< Reset bit MII management module */ + +/* Bit field masks: */ +#define ETH_MCFG_SCANINC_Msk 0x00000001UL /*!< Reading module addresses all MII PHY */ +#define ETH_MCFG_NOPRE_Msk 0x00000002UL /*!< Control bit preamble */ +#define ETH_MCFG_CLKSEL_Msk 0x0000001CUL /*!< Selection field frequency divider */ +#define ETH_MCFG_RESETMGMT_Msk 0x00008000UL /*!< Reset bit MII management module */ + +/* Bit field enums: */ +typedef enum { + ETH_MCFG_CLKSEL_Div4 = 0x0UL, /*!< 1/4 divider */ + ETH_MCFG_CLKSEL_Div6 = 0x2UL, /*!< 1/6 divider */ + ETH_MCFG_CLKSEL_Div8 = 0x3UL, /*!< 1/8 divider */ + ETH_MCFG_CLKSEL_Div10 = 0x4UL, /*!< 1/10 divider */ + ETH_MCFG_CLKSEL_Div14 = 0x5UL, /*!< 1/14 divider */ + ETH_MCFG_CLKSEL_Div20 = 0x6UL, /*!< 1/20 divider */ + ETH_MCFG_CLKSEL_Div28 = 0x7UL, /*!< 1/28 divider */ +} ETH_MCFG_CLKSEL_Enum; + +/*-- MCMD: Command register MII ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t READ :1; /*!< Single execution of read cycles */ + uint32_t SCAN :1; /*!< Continuous performance of read cycles */ +} _ETH_MCMD_bits; + +/* Bit field positions: */ +#define ETH_MCMD_READ_Pos 0 /*!< Single execution of read cycles */ +#define ETH_MCMD_SCAN_Pos 1 /*!< Continuous performance of read cycles */ + +/* Bit field masks: */ +#define ETH_MCMD_READ_Msk 0x00000001UL /*!< Single execution of read cycles */ +#define ETH_MCMD_SCAN_Msk 0x00000002UL /*!< Continuous performance of read cycles */ + +/*-- MADR: MII address register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t REGADDR :5; /*!< The 5-bit register address PHY-device */ + uint32_t :3; /*!< RESERVED */ + uint32_t PHYADDR :5; /*!< The 5-bit address PHY-device */ +} _ETH_MADR_bits; + +/* Bit field positions: */ +#define ETH_MADR_REGADDR_Pos 0 /*!< The 5-bit register address PHY-device */ +#define ETH_MADR_PHYADDR_Pos 8 /*!< The 5-bit address PHY-device */ + +/* Bit field masks: */ +#define ETH_MADR_REGADDR_Msk 0x0000001FUL /*!< The 5-bit register address PHY-device */ +#define ETH_MADR_PHYADDR_Msk 0x00001F00UL /*!< The 5-bit address PHY-device */ + +/*-- MWTD: Register data written in MII ----------------------------------------------------------------------*/ +typedef struct { + uint32_t WDATA :16; /*!< Field data */ +} _ETH_MWTD_bits; + +/* Bit field positions: */ +#define ETH_MWTD_WDATA_Pos 0 /*!< Field data */ + +/* Bit field masks: */ +#define ETH_MWTD_WDATA_Msk 0x0000FFFFUL /*!< Field data */ + +/*-- MRDD: Register read data from MII -----------------------------------------------------------------------*/ +typedef struct { + uint32_t RDATA :16; /*!< After reading the control module of the MII PHY-device */ +} _ETH_MRDD_bits; + +/* Bit field positions: */ +#define ETH_MRDD_RDATA_Pos 0 /*!< After reading the control module of the MII PHY-device */ + +/* Bit field masks: */ +#define ETH_MRDD_RDATA_Msk 0x0000FFFFUL /*!< After reading the control module of the MII PHY-device */ + +/*-- MIND: MII status register flags -------------------------------------------------------------------------*/ +typedef struct { + uint32_t BUSY :1; /*!< Flag continuing cycle of the read / write control MII */ + uint32_t SCAN :1; /*!< Flag ongoing scan operation (continue reading cycles control MII) */ + uint32_t NOTVALID :1; /*!< Flag unfinished read cycle MII (inaccessibility of data to be read) */ + uint32_t LINKFAIL :1; /*!< Failure flag control MII (PHY device management) */ +} _ETH_MIND_bits; + +/* Bit field positions: */ +#define ETH_MIND_BUSY_Pos 0 /*!< Flag continuing cycle of the read / write control MII */ +#define ETH_MIND_SCAN_Pos 1 /*!< Flag ongoing scan operation (continue reading cycles control MII) */ +#define ETH_MIND_NOTVALID_Pos 2 /*!< Flag unfinished read cycle MII (inaccessibility of data to be read) */ +#define ETH_MIND_LINKFAIL_Pos 3 /*!< Failure flag control MII (PHY device management) */ + +/* Bit field masks: */ +#define ETH_MIND_BUSY_Msk 0x00000001UL /*!< Flag continuing cycle of the read / write control MII */ +#define ETH_MIND_SCAN_Msk 0x00000002UL /*!< Flag ongoing scan operation (continue reading cycles control MII) */ +#define ETH_MIND_NOTVALID_Msk 0x00000004UL /*!< Flag unfinished read cycle MII (inaccessibility of data to be read) */ +#define ETH_MIND_LINKFAIL_Msk 0x00000008UL /*!< Failure flag control MII (PHY device management) */ + +/*-- SMII: MII controller status register --------------------------------------------------------------------*/ +typedef struct { + uint32_t SPEED :1; /*!< Speed Indicator */ + uint32_t DUPLEX :1; /*!< Mode indicator */ + uint32_t LINK :1; /*!< Status Indicator LINK */ + uint32_t JABBER :1; /*!< Flag of conditions Jabber */ + uint32_t CLASH :1; /*!< Flag of the selected mode */ +} _ETH_SMII_bits; + +/* Bit field positions: */ +#define ETH_SMII_SPEED_Pos 0 /*!< Speed Indicator */ +#define ETH_SMII_DUPLEX_Pos 1 /*!< Mode indicator */ +#define ETH_SMII_LINK_Pos 2 /*!< Status Indicator LINK */ +#define ETH_SMII_JABBER_Pos 3 /*!< Flag of conditions Jabber */ +#define ETH_SMII_CLASH_Pos 4 /*!< Flag of the selected mode */ + +/* Bit field masks: */ +#define ETH_SMII_SPEED_Msk 0x00000001UL /*!< Speed Indicator */ +#define ETH_SMII_DUPLEX_Msk 0x00000002UL /*!< Mode indicator */ +#define ETH_SMII_LINK_Msk 0x00000004UL /*!< Status Indicator LINK */ +#define ETH_SMII_JABBER_Msk 0x00000008UL /*!< Flag of conditions Jabber */ +#define ETH_SMII_CLASH_Msk 0x00000010UL /*!< Flag of the selected mode */ + +/*-- FIFOCFG: MIIFIFO configurate register -------------------------------------------------------------------*/ +typedef struct { + uint32_t RST :5; /*!< Reset MIIFIFO */ + uint32_t :3; /*!< RESERVED */ + uint32_t ENREQ :5; /*!< Enable request MIIFIFO */ + uint32_t :3; /*!< RESERVED */ + uint32_t ENRPLY :5; /*!< Indicate enable MIIFIFO */ +} _ETH_FIFOCFG_bits; + +/* Bit field positions: */ +#define ETH_FIFOCFG_RST_Pos 0 /*!< Reset MIIFIFO */ +#define ETH_FIFOCFG_ENREQ_Pos 8 /*!< Enable request MIIFIFO */ +#define ETH_FIFOCFG_ENRPLY_Pos 16 /*!< Indicate enable MIIFIFO */ + +/* Bit field masks: */ +#define ETH_FIFOCFG_RST_Msk 0x0000001FUL /*!< Reset MIIFIFO */ +#define ETH_FIFOCFG_ENREQ_Msk 0x00001F00UL /*!< Enable request MIIFIFO */ +#define ETH_FIFOCFG_ENRPLY_Msk 0x001F0000UL /*!< Indicate enable MIIFIFO */ + +/* Bit field enums: */ +typedef enum { + ETH_FIFOCFG_ENREQ_Disable = 0x0UL, /*!< disable MIIFIFO requests */ + ETH_FIFOCFG_ENREQ_Enable = 0x1FUL, /*!< enable MIIFIFO requests */ +} ETH_FIFOCFG_ENREQ_Enum; + +typedef enum { + ETH_FIFOCFG_ENRPLY_Disable = 0x0UL, /*!< disable MIIFIFO modules */ + ETH_FIFOCFG_ENRPLY_Enable = 0x1FUL, /*!< enable MIIFIFO modules */ +} ETH_FIFOCFG_ENRPLY_Enum; + +/*-- SA0: Station address register 0 -------------------------------------------------------------------------*/ +typedef struct { + uint32_t STADDRB2 :8; /*!< 2nd octet of the station address */ + uint32_t STADDRB1 :8; /*!< 1st octet of the station address */ +} _ETH_SA0_bits; + +/* Bit field positions: */ +#define ETH_SA0_STADDRB2_Pos 0 /*!< 2nd octet of the station address */ +#define ETH_SA0_STADDRB1_Pos 8 /*!< 1st octet of the station address */ + +/* Bit field masks: */ +#define ETH_SA0_STADDRB2_Msk 0x000000FFUL /*!< 2nd octet of the station address */ +#define ETH_SA0_STADDRB1_Msk 0x0000FF00UL /*!< 1st octet of the station address */ + +/*-- SA1: Station address register 1 -------------------------------------------------------------------------*/ +typedef struct { + uint32_t STADDRB4 :8; /*!< 4th octet of the station address */ + uint32_t STADDRB3 :8; /*!< The third octet of the station address */ +} _ETH_SA1_bits; + +/* Bit field positions: */ +#define ETH_SA1_STADDRB4_Pos 0 /*!< 4th octet of the station address */ +#define ETH_SA1_STADDRB3_Pos 8 /*!< The third octet of the station address */ + +/* Bit field masks: */ +#define ETH_SA1_STADDRB4_Msk 0x000000FFUL /*!< 4th octet of the station address */ +#define ETH_SA1_STADDRB3_Msk 0x0000FF00UL /*!< The third octet of the station address */ + +/*-- SA2: Station address register 2 -------------------------------------------------------------------------*/ +typedef struct { + uint32_t STADDRB6 :8; /*!< 6th octet station */ + uint32_t STADDRB5 :8; /*!< 5th octet station */ +} _ETH_SA2_bits; + +/* Bit field positions: */ +#define ETH_SA2_STADDRB6_Pos 0 /*!< 6th octet station */ +#define ETH_SA2_STADDRB5_Pos 8 /*!< 5th octet station */ + +/* Bit field masks: */ +#define ETH_SA2_STADDRB6_Msk 0x000000FFUL /*!< 6th octet station */ +#define ETH_SA2_STADDRB5_Msk 0x0000FF00UL /*!< 5th octet station */ + +/*-- DMATXCTRL: DMA transmit control register ----------------------------------------------------------------*/ +typedef struct { + uint32_t TXENABLE :1; /*!< Enable bit DMA device to transmit packets */ +} _ETH_DMATXCTRL_bits; + +/* Bit field positions: */ +#define ETH_DMATXCTRL_TXENABLE_Pos 0 /*!< Enable bit DMA device to transmit packets */ + +/* Bit field masks: */ +#define ETH_DMATXCTRL_TXENABLE_Msk 0x00000001UL /*!< Enable bit DMA device to transmit packets */ + +/*-- DMATXDESCR: Pointer to transmit descriptor register -----------------------------------------------------*/ +typedef struct { + uint32_t :2; /*!< RESERVED */ + uint32_t DADDR :30; /*!< Memory register address field, which will be recorded with the first transeived packet */ +} _ETH_DMATXDESCR_bits; + +/* Bit field positions: */ +#define ETH_DMATXDESCR_DADDR_Pos 2 /*!< Memory register address field, which will be recorded with the first transeived packet */ + +/* Bit field masks: */ +#define ETH_DMATXDESCR_DADDR_Msk 0xFFFFFFFCUL /*!< Memory register address field, which will be recorded with the first transeived packet */ + +/*-- DMATXSTAT: Status transmission register -----------------------------------------------------------------*/ +typedef struct { + uint32_t TXPKTSENT :1; /*!< Flag successfully transmit one or more packets */ + uint32_t TXUNDERRUN :1; /*!< Data Indicator */ + uint32_t :1; /*!< RESERVED */ + uint32_t BUSERROR :1; /*!< Flag a bus error */ + uint32_t :12; /*!< RESERVED */ + uint32_t TXPKTCOUNT :8; /*!< 8-bit counter of transmitted packets */ +} _ETH_DMATXSTAT_bits; + +/* Bit field positions: */ +#define ETH_DMATXSTAT_TXPKTSENT_Pos 0 /*!< Flag successfully transmit one or more packets */ +#define ETH_DMATXSTAT_TXUNDERRUN_Pos 1 /*!< Data Indicator */ +#define ETH_DMATXSTAT_BUSERROR_Pos 3 /*!< Flag a bus error */ +#define ETH_DMATXSTAT_TXPKTCOUNT_Pos 16 /*!< 8-bit counter of transmitted packets */ + +/* Bit field masks: */ +#define ETH_DMATXSTAT_TXPKTSENT_Msk 0x00000001UL /*!< Flag successfully transmit one or more packets */ +#define ETH_DMATXSTAT_TXUNDERRUN_Msk 0x00000002UL /*!< Data Indicator */ +#define ETH_DMATXSTAT_BUSERROR_Msk 0x00000008UL /*!< Flag a bus error */ +#define ETH_DMATXSTAT_TXPKTCOUNT_Msk 0x00FF0000UL /*!< 8-bit counter of transmitted packets */ + +/*-- DMARXCTRL: Control receive register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t RXENABLE :1; /*!< Enable receive */ +} _ETH_DMARXCTRL_bits; + +/* Bit field positions: */ +#define ETH_DMARXCTRL_RXENABLE_Pos 0 /*!< Enable receive */ + +/* Bit field masks: */ +#define ETH_DMARXCTRL_RXENABLE_Msk 0x00000001UL /*!< Enable receive */ + +/*-- DMARXDESCR: Pointer receive descriptor register ---------------------------------------------------------*/ +typedef struct { + uint32_t :2; /*!< RESERVED */ + uint32_t DADDR :30; /*!< Memory register address field, which will be recorded with the first received packet */ +} _ETH_DMARXDESCR_bits; + +/* Bit field positions: */ +#define ETH_DMARXDESCR_DADDR_Pos 2 /*!< Memory register address field, which will be recorded with the first received packet */ + +/* Bit field masks: */ +#define ETH_DMARXDESCR_DADDR_Msk 0xFFFFFFFCUL /*!< Memory register address field, which will be recorded with the first received packet */ + +/*-- DMARXSTAT: Status receiving register --------------------------------------------------------------------*/ +typedef struct { + uint32_t RXPKTREC :1; /*!< Flag successfully receive one or more packets */ + uint32_t :1; /*!< RESERVED */ + uint32_t RXOVERFLOW :1; /*!< Data Indicator */ + uint32_t BUSERROR :1; /*!< Flag a bus error */ + uint32_t :12; /*!< RESERVED */ + uint32_t RXPKTCOUNT :8; /*!< 8-bit counter of received packets */ +} _ETH_DMARXSTAT_bits; + +/* Bit field positions: */ +#define ETH_DMARXSTAT_RXPKTREC_Pos 0 /*!< Flag successfully receive one or more packets */ +#define ETH_DMARXSTAT_RXOVERFLOW_Pos 2 /*!< Data Indicator */ +#define ETH_DMARXSTAT_BUSERROR_Pos 3 /*!< Flag a bus error */ +#define ETH_DMARXSTAT_RXPKTCOUNT_Pos 16 /*!< 8-bit counter of received packets */ + +/* Bit field masks: */ +#define ETH_DMARXSTAT_RXPKTREC_Msk 0x00000001UL /*!< Flag successfully receive one or more packets */ +#define ETH_DMARXSTAT_RXOVERFLOW_Msk 0x00000004UL /*!< Data Indicator */ +#define ETH_DMARXSTAT_BUSERROR_Msk 0x00000008UL /*!< Flag a bus error */ +#define ETH_DMARXSTAT_RXPKTCOUNT_Msk 0x00FF0000UL /*!< 8-bit counter of received packets */ + +/*-- DMAINTMASK: Mask interrupt register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t TXPKTSENT :1; /*!< */ + uint32_t TXUNDERRUN :1; /*!< */ + uint32_t :1; /*!< RESERVED */ + uint32_t BUSERRTX :1; /*!< */ + uint32_t RXPKTREC :1; /*!< */ + uint32_t :1; /*!< RESERVED */ + uint32_t RXOVER :1; /*!< */ + uint32_t BUSERRRX :1; /*!< */ +} _ETH_DMAINTMASK_bits; + +/* Bit field positions: */ +#define ETH_DMAINTMASK_TXPKTSENT_Pos 0 /*!< */ +#define ETH_DMAINTMASK_TXUNDERRUN_Pos 1 /*!< */ +#define ETH_DMAINTMASK_BUSERRTX_Pos 3 /*!< */ +#define ETH_DMAINTMASK_RXPKTREC_Pos 4 /*!< */ +#define ETH_DMAINTMASK_RXOVER_Pos 6 /*!< */ +#define ETH_DMAINTMASK_BUSERRRX_Pos 7 /*!< */ + +/* Bit field masks: */ +#define ETH_DMAINTMASK_TXPKTSENT_Msk 0x00000001UL /*!< */ +#define ETH_DMAINTMASK_TXUNDERRUN_Msk 0x00000002UL /*!< */ +#define ETH_DMAINTMASK_BUSERRTX_Msk 0x00000008UL /*!< */ +#define ETH_DMAINTMASK_RXPKTREC_Msk 0x00000010UL /*!< */ +#define ETH_DMAINTMASK_RXOVER_Msk 0x00000040UL /*!< */ +#define ETH_DMAINTMASK_BUSERRRX_Msk 0x00000080UL /*!< */ + +/*-- DMAINT: Interrupt register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t TXPKTSENT :1; /*!< */ + uint32_t TXUNDERRUN :1; /*!< */ + uint32_t :1; /*!< RESERVED */ + uint32_t BUSERRTX :1; /*!< */ + uint32_t RXPKTREC :1; /*!< */ + uint32_t :1; /*!< RESERVED */ + uint32_t RXOVER :1; /*!< */ + uint32_t BUSERRRX :1; /*!< */ +} _ETH_DMAINT_bits; + +/* Bit field positions: */ +#define ETH_DMAINT_TXPKTSENT_Pos 0 /*!< */ +#define ETH_DMAINT_TXUNDERRUN_Pos 1 /*!< */ +#define ETH_DMAINT_BUSERRTX_Pos 3 /*!< */ +#define ETH_DMAINT_RXPKTREC_Pos 4 /*!< */ +#define ETH_DMAINT_RXOVER_Pos 6 /*!< */ +#define ETH_DMAINT_BUSERRRX_Pos 7 /*!< */ + +/* Bit field masks: */ +#define ETH_DMAINT_TXPKTSENT_Msk 0x00000001UL /*!< */ +#define ETH_DMAINT_TXUNDERRUN_Msk 0x00000002UL /*!< */ +#define ETH_DMAINT_BUSERRTX_Msk 0x00000008UL /*!< */ +#define ETH_DMAINT_RXPKTREC_Msk 0x00000010UL /*!< */ +#define ETH_DMAINT_RXOVER_Msk 0x00000040UL /*!< */ +#define ETH_DMAINT_BUSERRRX_Msk 0x00000080UL /*!< */ + +typedef struct { + union { /*!< MAC configuration register 1 */ + __IO uint32_t MAC1; /*!< MAC1 : type used for word access */ + __IO _ETH_MAC1_bits MAC1_bit; /*!< MAC1_bit: structure used for bit access */ + }; + union { /*!< MAC configuration register 2 */ + __IO uint32_t MAC2; /*!< MAC2 : type used for word access */ + __IO _ETH_MAC2_bits MAC2_bit; /*!< MAC2_bit: structure used for bit access */ + }; + union { /*!< Back-to-Back Inter-Packet-Gap Register */ + __IO uint32_t IPGT; /*!< IPGT : type used for word access */ + __IO _ETH_IPGT_bits IPGT_bit; /*!< IPGT_bit: structure used for bit access */ + }; + union { /*!< Register Non-Back-to-Back Inter-Packet-Gap */ + __IO uint32_t IPGR; /*!< IPGR : type used for word access */ + __IO _ETH_IPGR_bits IPGR_bit; /*!< IPGR_bit: structure used for bit access */ + }; + union { /*!< Register collision window */ + __IO uint32_t CLRT; /*!< CLRT : type used for word access */ + __IO _ETH_CLRT_bits CLRT_bit; /*!< CLRT_bit: structure used for bit access */ + }; + union { /*!< Register the upper limit size Frame */ + __IO uint32_t MAXF; /*!< MAXF : type used for word access */ + __IO _ETH_MAXF_bits MAXF_bit; /*!< MAXF_bit: structure used for bit access */ + }; + union { /*!< Register PHY-support interface */ + __IO uint32_t SUPP; /*!< SUPP : type used for word access */ + __IO _ETH_SUPP_bits SUPP_bit; /*!< SUPP_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0; + union { /*!< Configuration control register MII */ + __IO uint32_t MCFG; /*!< MCFG : type used for word access */ + __IO _ETH_MCFG_bits MCFG_bit; /*!< MCFG_bit: structure used for bit access */ + }; + union { /*!< Command register MII */ + __IO uint32_t MCMD; /*!< MCMD : type used for word access */ + __IO _ETH_MCMD_bits MCMD_bit; /*!< MCMD_bit: structure used for bit access */ + }; + union { /*!< MII address register */ + __IO uint32_t MADR; /*!< MADR : type used for word access */ + __IO _ETH_MADR_bits MADR_bit; /*!< MADR_bit: structure used for bit access */ + }; + union { /*!< Register data written in MII */ + __O uint32_t MWTD; /*!< MWTD : type used for word access */ + __O _ETH_MWTD_bits MWTD_bit; /*!< MWTD_bit: structure used for bit access */ + }; + union { /*!< Register read data from MII */ + __I uint32_t MRDD; /*!< MRDD : type used for word access */ + __I _ETH_MRDD_bits MRDD_bit; /*!< MRDD_bit: structure used for bit access */ + }; + union { /*!< MII status register flags */ + __I uint32_t MIND; /*!< MIND : type used for word access */ + __I _ETH_MIND_bits MIND_bit; /*!< MIND_bit: structure used for bit access */ + }; + union { /*!< MII controller status register */ + __I uint32_t SMII; /*!< SMII : type used for word access */ + __I _ETH_SMII_bits SMII_bit; /*!< SMII_bit: structure used for bit access */ + }; + union { /*!< MIIFIFO configurate register */ + __IO uint32_t FIFOCFG; /*!< FIFOCFG : type used for word access */ + __IO _ETH_FIFOCFG_bits FIFOCFG_bit; /*!< FIFOCFG_bit: structure used for bit access */ + }; + union { /*!< Station address register 0 */ + __IO uint32_t SA0; /*!< SA0 : type used for word access */ + __IO _ETH_SA0_bits SA0_bit; /*!< SA0_bit: structure used for bit access */ + }; + union { /*!< Station address register 1 */ + __IO uint32_t SA1; /*!< SA1 : type used for word access */ + __IO _ETH_SA1_bits SA1_bit; /*!< SA1_bit: structure used for bit access */ + }; + union { /*!< Station address register 2 */ + __IO uint32_t SA2; /*!< SA2 : type used for word access */ + __IO _ETH_SA2_bits SA2_bit; /*!< SA2_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1[77]; + union { /*!< DMA transmit control register */ + __IO uint32_t DMATXCTRL; /*!< DMATXCTRL : type used for word access */ + __IO _ETH_DMATXCTRL_bits DMATXCTRL_bit; /*!< DMATXCTRL_bit: structure used for bit access */ + }; + union { /*!< Pointer to transmit descriptor register */ + __IO uint32_t DMATXDESCR; /*!< DMATXDESCR : type used for word access */ + __IO _ETH_DMATXDESCR_bits DMATXDESCR_bit; /*!< DMATXDESCR_bit: structure used for bit access */ + }; + union { /*!< Status transmission register */ + __IO uint32_t DMATXSTAT; /*!< DMATXSTAT : type used for word access */ + __IO _ETH_DMATXSTAT_bits DMATXSTAT_bit; /*!< DMATXSTAT_bit: structure used for bit access */ + }; + union { /*!< Control receive register */ + __IO uint32_t DMARXCTRL; /*!< DMARXCTRL : type used for word access */ + __IO _ETH_DMARXCTRL_bits DMARXCTRL_bit; /*!< DMARXCTRL_bit: structure used for bit access */ + }; + union { /*!< Pointer receive descriptor register */ + __IO uint32_t DMARXDESCR; /*!< DMARXDESCR : type used for word access */ + __IO _ETH_DMARXDESCR_bits DMARXDESCR_bit; /*!< DMARXDESCR_bit: structure used for bit access */ + }; + union { /*!< Status receiving register */ + __IO uint32_t DMARXSTAT; /*!< DMARXSTAT : type used for word access */ + __IO _ETH_DMARXSTAT_bits DMARXSTAT_bit; /*!< DMARXSTAT_bit: structure used for bit access */ + }; + union { /*!< Mask interrupt register */ + __IO uint32_t DMAINTMASK; /*!< DMAINTMASK : type used for word access */ + __IO _ETH_DMAINTMASK_bits DMAINTMASK_bit; /*!< DMAINTMASK_bit: structure used for bit access */ + }; + union { /*!< Interrupt register */ + __I uint32_t DMAINT; /*!< DMAINT : type used for word access */ + __I _ETH_DMAINT_bits DMAINT_bit; /*!< DMAINT_bit: structure used for bit access */ + }; +} ETH_TypeDef; + + +/******************************************************************************/ +/* SPI registers */ +/******************************************************************************/ + +/*-- CR0: Control register 0 ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DSS :4; /*!< Size of data */ + uint32_t FRF :2; /*!< Select protocol */ + uint32_t SPO :1; /*!< Polarity SSPCLKOUT */ + uint32_t SPH :1; /*!< Phase SSPCLKOUT */ + uint32_t SCR :8; /*!< Value divider */ +} _SPI_CR0_bits; + +/* Bit field positions: */ +#define SPI_CR0_DSS_Pos 0 /*!< Size of data */ +#define SPI_CR0_FRF_Pos 4 /*!< Select protocol */ +#define SPI_CR0_SPO_Pos 6 /*!< Polarity SSPCLKOUT */ +#define SPI_CR0_SPH_Pos 7 /*!< Phase SSPCLKOUT */ +#define SPI_CR0_SCR_Pos 8 /*!< Value divider */ + +/* Bit field masks: */ +#define SPI_CR0_DSS_Msk 0x0000000FUL /*!< Size of data */ +#define SPI_CR0_FRF_Msk 0x00000030UL /*!< Select protocol */ +#define SPI_CR0_SPO_Msk 0x00000040UL /*!< Polarity SSPCLKOUT */ +#define SPI_CR0_SPH_Msk 0x00000080UL /*!< Phase SSPCLKOUT */ +#define SPI_CR0_SCR_Msk 0x0000FF00UL /*!< Value divider */ + +/* Bit field enums: */ +typedef enum { + SPI_CR0_DSS_4bit = 0x3UL, /*!< data size 4 bit */ + SPI_CR0_DSS_5bit = 0x4UL, /*!< data size 5 bit */ + SPI_CR0_DSS_6bit = 0x5UL, /*!< data size 6 bit */ + SPI_CR0_DSS_7bit = 0x6UL, /*!< data size 7 bit */ + SPI_CR0_DSS_8bit = 0x7UL, /*!< data size 8 bit */ + SPI_CR0_DSS_9bit = 0x8UL, /*!< data size 9 bit */ + SPI_CR0_DSS_10bit = 0x9UL, /*!< data size 10 bit */ + SPI_CR0_DSS_11bit = 0xAUL, /*!< data size 11 bit */ + SPI_CR0_DSS_12bit = 0xBUL, /*!< data size 12 bit */ + SPI_CR0_DSS_13bit = 0xCUL, /*!< data size 13 bit */ + SPI_CR0_DSS_14bit = 0xDUL, /*!< data size 14 bit */ + SPI_CR0_DSS_15bit = 0xEUL, /*!< data size 15 bit */ + SPI_CR0_DSS_16bit = 0xFUL, /*!< data size 16 bit */ +} SPI_CR0_DSS_Enum; + +typedef enum { + SPI_CR0_FRF_SPI = 0x0UL, /*!< SPI of Motorola */ + SPI_CR0_FRF_SSI = 0x1UL, /*!< SSI of Texas Instruments */ + SPI_CR0_FRF_Microwire = 0x2UL, /*!< Microwire of National Semiconductor */ +} SPI_CR0_FRF_Enum; + +/*-- CR1: Control register 1 ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t SSE :1; /*!< Enable transceiver */ + uint32_t MS :1; /*!< Select mode */ + uint32_t SOD :1; /*!< Disable bit data */ + uint32_t :4; /*!< RESERVED */ + uint32_t RXIFLSEL :4; /*!< Receive interrupt FIFO level select */ + uint32_t TXIFLSEL :4; /*!< Transmit interrupt FIFO level select */ +} _SPI_CR1_bits; + +/* Bit field positions: */ +#define SPI_CR1_SSE_Pos 1 /*!< Enable transceiver */ +#define SPI_CR1_MS_Pos 2 /*!< Select mode */ +#define SPI_CR1_SOD_Pos 3 /*!< Disable bit data */ +#define SPI_CR1_RXIFLSEL_Pos 8 /*!< Receive interrupt FIFO level select */ +#define SPI_CR1_TXIFLSEL_Pos 12 /*!< Transmit interrupt FIFO level select */ + +/* Bit field masks: */ +#define SPI_CR1_SSE_Msk 0x00000002UL /*!< Enable transceiver */ +#define SPI_CR1_MS_Msk 0x00000004UL /*!< Select mode */ +#define SPI_CR1_SOD_Msk 0x00000008UL /*!< Disable bit data */ +#define SPI_CR1_RXIFLSEL_Msk 0x00000F00UL /*!< Receive interrupt FIFO level select */ +#define SPI_CR1_TXIFLSEL_Msk 0x0000F000UL /*!< Transmit interrupt FIFO level select */ + +/*-- DR: Data register ---------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DATA :16; /*!< */ +} _SPI_DR_bits; + +/* Bit field positions: */ +#define SPI_DR_DATA_Pos 0 /*!< */ + +/* Bit field masks: */ +#define SPI_DR_DATA_Msk 0x0000FFFFUL /*!< */ + +/*-- SR: State register --------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t TFE :1; /*!< FIFO buffer empty flag transmitter */ + uint32_t TNF :1; /*!< Indicator the transmitter FIFO buffer is not full */ + uint32_t RNE :1; /*!< Indicate not empty receive buffer */ + uint32_t RFF :1; /*!< Indicate full receive buffer */ + uint32_t BSY :1; /*!< Activity flag */ +} _SPI_SR_bits; + +/* Bit field positions: */ +#define SPI_SR_TFE_Pos 0 /*!< FIFO buffer empty flag transmitter */ +#define SPI_SR_TNF_Pos 1 /*!< Indicator the transmitter FIFO buffer is not full */ +#define SPI_SR_RNE_Pos 2 /*!< Indicate not empty receive buffer */ +#define SPI_SR_RFF_Pos 3 /*!< Indicate full receive buffer */ +#define SPI_SR_BSY_Pos 4 /*!< Activity flag */ + +/* Bit field masks: */ +#define SPI_SR_TFE_Msk 0x00000001UL /*!< FIFO buffer empty flag transmitter */ +#define SPI_SR_TNF_Msk 0x00000002UL /*!< Indicator the transmitter FIFO buffer is not full */ +#define SPI_SR_RNE_Msk 0x00000004UL /*!< Indicate not empty receive buffer */ +#define SPI_SR_RFF_Msk 0x00000008UL /*!< Indicate full receive buffer */ +#define SPI_SR_BSY_Msk 0x00000010UL /*!< Activity flag */ + +/*-- CPSR: Clock division factor register --------------------------------------------------------------------*/ +typedef struct { + uint32_t CPSDVSR :8; /*!< Clock division factor. Bit0 always 0 */ +} _SPI_CPSR_bits; + +/* Bit field positions: */ +#define SPI_CPSR_CPSDVSR_Pos 0 /*!< Clock division factor. Bit0 always 0 */ + +/* Bit field masks: */ +#define SPI_CPSR_CPSDVSR_Msk 0x000000FFUL /*!< Clock division factor. Bit0 always 0 */ + +/*-- IMSC: Mask interrupt register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t RORIM :1; /*!< Interrupt mask bit SSPRORINTR buffer overflow receiver */ + uint32_t RTIM :1; /*!< Interrupt mask bit SSPRTINTR timeout receiver */ + uint32_t RXIM :1; /*!< SSPRXINTR interrupt mask bit to fill 50% or less of the receiver FIFO buffer */ + uint32_t TXIM :1; /*!< SSPTXINTR interrupt mask bit to fill 50% or less of the FIFO buffer of the transmitter */ +} _SPI_IMSC_bits; + +/* Bit field positions: */ +#define SPI_IMSC_RORIM_Pos 0 /*!< Interrupt mask bit SSPRORINTR buffer overflow receiver */ +#define SPI_IMSC_RTIM_Pos 1 /*!< Interrupt mask bit SSPRTINTR timeout receiver */ +#define SPI_IMSC_RXIM_Pos 2 /*!< SSPRXINTR interrupt mask bit to fill 50% or less of the receiver FIFO buffer */ +#define SPI_IMSC_TXIM_Pos 3 /*!< SSPTXINTR interrupt mask bit to fill 50% or less of the FIFO buffer of the transmitter */ + +/* Bit field masks: */ +#define SPI_IMSC_RORIM_Msk 0x00000001UL /*!< Interrupt mask bit SSPRORINTR buffer overflow receiver */ +#define SPI_IMSC_RTIM_Msk 0x00000002UL /*!< Interrupt mask bit SSPRTINTR timeout receiver */ +#define SPI_IMSC_RXIM_Msk 0x00000004UL /*!< SSPRXINTR interrupt mask bit to fill 50% or less of the receiver FIFO buffer */ +#define SPI_IMSC_TXIM_Msk 0x00000008UL /*!< SSPTXINTR interrupt mask bit to fill 50% or less of the FIFO buffer of the transmitter */ + +/*-- RIS: Status register interrupt without mask -------------------------------------------------------------*/ +typedef struct { + uint32_t RORRIS :1; /*!< Interrupt status before masking SSPRORINTR */ + uint32_t RTRIS :1; /*!< Interrupt status before masking SSPRTINTR */ + uint32_t RXRIS :1; /*!< Interrupt status before masking SSPRXINTR */ + uint32_t TXRIS :1; /*!< Interrupt status before masking SSPTXINTR */ +} _SPI_RIS_bits; + +/* Bit field positions: */ +#define SPI_RIS_RORRIS_Pos 0 /*!< Interrupt status before masking SSPRORINTR */ +#define SPI_RIS_RTRIS_Pos 1 /*!< Interrupt status before masking SSPRTINTR */ +#define SPI_RIS_RXRIS_Pos 2 /*!< Interrupt status before masking SSPRXINTR */ +#define SPI_RIS_TXRIS_Pos 3 /*!< Interrupt status before masking SSPTXINTR */ + +/* Bit field masks: */ +#define SPI_RIS_RORRIS_Msk 0x00000001UL /*!< Interrupt status before masking SSPRORINTR */ +#define SPI_RIS_RTRIS_Msk 0x00000002UL /*!< Interrupt status before masking SSPRTINTR */ +#define SPI_RIS_RXRIS_Msk 0x00000004UL /*!< Interrupt status before masking SSPRXINTR */ +#define SPI_RIS_TXRIS_Msk 0x00000008UL /*!< Interrupt status before masking SSPTXINTR */ + +/*-- MIS: Status register interrupt masking account ----------------------------------------------------------*/ +typedef struct { + uint32_t RORMIS :1; /*!< Masked interrupt status SSPRORINTR */ + uint32_t RTMIS :1; /*!< Masked interrupt status SSPRTINTR */ + uint32_t RXMIS :1; /*!< Masked interrupt status SSPRXINTR */ + uint32_t TXMIS :1; /*!< Masked interrupt status SSPTXINTR */ +} _SPI_MIS_bits; + +/* Bit field positions: */ +#define SPI_MIS_RORMIS_Pos 0 /*!< Masked interrupt status SSPRORINTR */ +#define SPI_MIS_RTMIS_Pos 1 /*!< Masked interrupt status SSPRTINTR */ +#define SPI_MIS_RXMIS_Pos 2 /*!< Masked interrupt status SSPRXINTR */ +#define SPI_MIS_TXMIS_Pos 3 /*!< Masked interrupt status SSPTXINTR */ + +/* Bit field masks: */ +#define SPI_MIS_RORMIS_Msk 0x00000001UL /*!< Masked interrupt status SSPRORINTR */ +#define SPI_MIS_RTMIS_Msk 0x00000002UL /*!< Masked interrupt status SSPRTINTR */ +#define SPI_MIS_RXMIS_Msk 0x00000004UL /*!< Masked interrupt status SSPRXINTR */ +#define SPI_MIS_TXMIS_Msk 0x00000008UL /*!< Masked interrupt status SSPTXINTR */ + +/*-- ICR: Register reset interrupt ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t RORIC :1; /*!< Reset interrupt SSPRORINTR */ + uint32_t RTIC :1; /*!< Reset interrupt SSPRTINTR */ +} _SPI_ICR_bits; + +/* Bit field positions: */ +#define SPI_ICR_RORIC_Pos 0 /*!< Reset interrupt SSPRORINTR */ +#define SPI_ICR_RTIC_Pos 1 /*!< Reset interrupt SSPRTINTR */ + +/* Bit field masks: */ +#define SPI_ICR_RORIC_Msk 0x00000001UL /*!< Reset interrupt SSPRORINTR */ +#define SPI_ICR_RTIC_Msk 0x00000002UL /*!< Reset interrupt SSPRTINTR */ + +/*-- DMACR: Control register DMA -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t RXDMAE :1; /*!< DMA enable bit at reception */ + uint32_t TXDMAE :1; /*!< DMA enable bit transmission */ +} _SPI_DMACR_bits; + +/* Bit field positions: */ +#define SPI_DMACR_RXDMAE_Pos 0 /*!< DMA enable bit at reception */ +#define SPI_DMACR_TXDMAE_Pos 1 /*!< DMA enable bit transmission */ + +/* Bit field masks: */ +#define SPI_DMACR_RXDMAE_Msk 0x00000001UL /*!< DMA enable bit at reception */ +#define SPI_DMACR_TXDMAE_Msk 0x00000002UL /*!< DMA enable bit transmission */ + +typedef struct { + union { /*!< Control register 0 */ + __IO uint32_t CR0; /*!< CR0 : type used for word access */ + __IO _SPI_CR0_bits CR0_bit; /*!< CR0_bit: structure used for bit access */ + }; + union { /*!< Control register 1 */ + __IO uint32_t CR1; /*!< CR1 : type used for word access */ + __IO _SPI_CR1_bits CR1_bit; /*!< CR1_bit: structure used for bit access */ + }; + union { /*!< Data register */ + __IO uint32_t DR; /*!< DR : type used for word access */ + __IO _SPI_DR_bits DR_bit; /*!< DR_bit: structure used for bit access */ + }; + union { /*!< State register */ + __I uint32_t SR; /*!< SR : type used for word access */ + __I _SPI_SR_bits SR_bit; /*!< SR_bit: structure used for bit access */ + }; + union { /*!< Clock division factor register */ + __IO uint32_t CPSR; /*!< CPSR : type used for word access */ + __IO _SPI_CPSR_bits CPSR_bit; /*!< CPSR_bit: structure used for bit access */ + }; + union { /*!< Mask interrupt register */ + __IO uint32_t IMSC; /*!< IMSC : type used for word access */ + __IO _SPI_IMSC_bits IMSC_bit; /*!< IMSC_bit: structure used for bit access */ + }; + union { /*!< Status register interrupt without mask */ + __I uint32_t RIS; /*!< RIS : type used for word access */ + __I _SPI_RIS_bits RIS_bit; /*!< RIS_bit: structure used for bit access */ + }; + union { /*!< Status register interrupt masking account */ + __I uint32_t MIS; /*!< MIS : type used for word access */ + __I _SPI_MIS_bits MIS_bit; /*!< MIS_bit: structure used for bit access */ + }; + union { /*!< Register reset interrupt */ + __O uint32_t ICR; /*!< ICR : type used for word access */ + __O _SPI_ICR_bits ICR_bit; /*!< ICR_bit: structure used for bit access */ + }; + union { /*!< Control register DMA */ + __IO uint32_t DMACR; /*!< DMACR : type used for word access */ + __IO _SPI_DMACR_bits DMACR_bit; /*!< DMACR_bit: structure used for bit access */ + }; +} SPI_TypeDef; + + +/******************************************************************************/ +/* CAN registers */ +/******************************************************************************/ + +/*-- CLC: Frequency control register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t DISR :1; /*!< OFF module CAN */ + uint32_t DISS :1; /*!< State CAN */ +} _CAN_CLC_bits; + +/* Bit field positions: */ +#define CAN_CLC_DISR_Pos 0 /*!< OFF module CAN */ +#define CAN_CLC_DISS_Pos 1 /*!< State CAN */ + +/* Bit field masks: */ +#define CAN_CLC_DISR_Msk 0x00000001UL /*!< OFF module CAN */ +#define CAN_CLC_DISS_Msk 0x00000002UL /*!< State CAN */ + +/*-- ID: Identity register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t MODREV :8; /*!< Number of modifications of the CAN */ + uint32_t MODTYPE :8; /*!< Digit capacity CAN */ + uint32_t MODNUM :16; /*!< Identification number CAN */ +} _CAN_ID_bits; + +/* Bit field positions: */ +#define CAN_ID_MODREV_Pos 0 /*!< Number of modifications of the CAN */ +#define CAN_ID_MODTYPE_Pos 8 /*!< Digit capacity CAN */ +#define CAN_ID_MODNUM_Pos 16 /*!< Identification number CAN */ + +/* Bit field masks: */ +#define CAN_ID_MODREV_Msk 0x000000FFUL /*!< Number of modifications of the CAN */ +#define CAN_ID_MODTYPE_Msk 0x0000FF00UL /*!< Digit capacity CAN */ +#define CAN_ID_MODNUM_Msk 0xFFFF0000UL /*!< Identification number CAN */ + +/*-- FDR: Register divider -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t STEP :10; /*!< Step divider */ + uint32_t :1; /*!< RESERVED */ + uint32_t SM :1; /*!< Select the transition mode Suspend */ + uint32_t SC :2; /*!< Configuration of the frequency divider in mode Suspend */ + uint32_t DM :2; /*!< Mode setting of the frequency divider */ + uint32_t RESULT :10; /*!< Count frequency divider */ + uint32_t :4; /*!< RESERVED */ + uint32_t ENHW :1; /*!< Control bit synchronization */ + uint32_t DISCLK :1; /*!< Disable bit internal clock */ +} _CAN_FDR_bits; + +/* Bit field positions: */ +#define CAN_FDR_STEP_Pos 0 /*!< Step divider */ +#define CAN_FDR_SM_Pos 11 /*!< Select the transition mode Suspend */ +#define CAN_FDR_SC_Pos 12 /*!< Configuration of the frequency divider in mode Suspend */ +#define CAN_FDR_DM_Pos 14 /*!< Mode setting of the frequency divider */ +#define CAN_FDR_RESULT_Pos 16 /*!< Count frequency divider */ +#define CAN_FDR_ENHW_Pos 30 /*!< Control bit synchronization */ +#define CAN_FDR_DISCLK_Pos 31 /*!< Disable bit internal clock */ + +/* Bit field masks: */ +#define CAN_FDR_STEP_Msk 0x000003FFUL /*!< Step divider */ +#define CAN_FDR_SM_Msk 0x00000800UL /*!< Select the transition mode Suspend */ +#define CAN_FDR_SC_Msk 0x00003000UL /*!< Configuration of the frequency divider in mode Suspend */ +#define CAN_FDR_DM_Msk 0x0000C000UL /*!< Mode setting of the frequency divider */ +#define CAN_FDR_RESULT_Msk 0x03FF0000UL /*!< Count frequency divider */ +#define CAN_FDR_ENHW_Msk 0x40000000UL /*!< Control bit synchronization */ +#define CAN_FDR_DISCLK_Msk 0x80000000UL /*!< Disable bit internal clock */ + +/* Bit field enums: */ +typedef enum { + CAN_FDR_DM_Disable = 0x0UL, /*!< counter disabled */ + CAN_FDR_DM_NormalMode = 0x1UL, /*!< normal operation mode */ + CAN_FDR_DM_DividerMode = 0x2UL, /*!< divider operation mode */ +} CAN_FDR_DM_Enum; + +/*-- LIST: LIST: Register list0 -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BEGIN :8; /*!< Number of the first message object */ + uint32_t END :8; /*!< Number of the last message object */ + uint32_t SIZE :8; /*!< List size */ + uint32_t EMPTY :1; /*!< Indicate empty list */ +} _CAN_LIST_LIST_bits; + +/* Bit field positions: */ +#define CAN_LIST_LIST_BEGIN_Pos 0 /*!< Number of the first message object */ +#define CAN_LIST_LIST_END_Pos 8 /*!< Number of the last message object */ +#define CAN_LIST_LIST_SIZE_Pos 16 /*!< List size */ +#define CAN_LIST_LIST_EMPTY_Pos 24 /*!< Indicate empty list */ + +/* Bit field masks: */ +#define CAN_LIST_LIST_BEGIN_Msk 0x000000FFUL /*!< Number of the first message object */ +#define CAN_LIST_LIST_END_Msk 0x0000FF00UL /*!< Number of the last message object */ +#define CAN_LIST_LIST_SIZE_Msk 0x00FF0000UL /*!< List size */ +#define CAN_LIST_LIST_EMPTY_Msk 0x01000000UL /*!< Indicate empty list */ + +/*-- MSPND: MSPND: Register waiting interrupts0 ---------------------------------------------------------------*/ +typedef struct { + uint32_t PND :32; /*!< Field waiting interrupts */ +} _CAN_MSPND_MSPND_bits; + +/* Bit field positions: */ +#define CAN_MSPND_MSPND_PND_Pos 0 /*!< Field waiting interrupts */ + +/* Bit field masks: */ +#define CAN_MSPND_MSPND_PND_Msk 0xFFFFFFFFUL /*!< Field waiting interrupts */ + +/*-- MSID: MSID: Register messages index0 ---------------------------------------------------------------------*/ +typedef struct { + uint32_t INDEX :6; /*!< */ +} _CAN_MSID_MSID_bits; + +/* Bit field positions: */ +#define CAN_MSID_MSID_INDEX_Pos 0 /*!< */ + +/* Bit field masks: */ +#define CAN_MSID_MSID_INDEX_Msk 0x0000003FUL /*!< */ + +/*-- MSIMASK: Mask register message index --------------------------------------------------------------------*/ +typedef struct { + uint32_t IM :32; /*!< Mask for waiting bit messages */ +} _CAN_MSIMASK_bits; + +/* Bit field positions: */ +#define CAN_MSIMASK_IM_Pos 0 /*!< Mask for waiting bit messages */ + +/* Bit field masks: */ +#define CAN_MSIMASK_IM_Msk 0xFFFFFFFFUL /*!< Mask for waiting bit messages */ + +/*-- PANCTR: Register command panel --------------------------------------------------------------------------*/ +typedef struct { + uint32_t PANCMD :8; /*!< Command panel */ + uint32_t BUSY :1; /*!< Busy flag panels arguments (waiting to be written at the end of the command) */ + uint32_t RBUSY :1; /*!< Busy flag panels arguments (running the command list, the result of which will be recorded in PANAR1 and PANAR2) */ + uint32_t :6; /*!< RESERVED */ + uint32_t PANAR1 :8; /*!< Panel argument 8 */ + uint32_t PANAR2 :8; /*!< Panel argument 9 */ +} _CAN_PANCTR_bits; + +/* Bit field positions: */ +#define CAN_PANCTR_PANCMD_Pos 0 /*!< Command panel */ +#define CAN_PANCTR_BUSY_Pos 8 /*!< Busy flag panels arguments (waiting to be written at the end of the command) */ +#define CAN_PANCTR_RBUSY_Pos 9 /*!< Busy flag panels arguments (running the command list, the result of which will be recorded in PANAR1 and PANAR2) */ +#define CAN_PANCTR_PANAR1_Pos 16 /*!< Panel argument 8 */ +#define CAN_PANCTR_PANAR2_Pos 24 /*!< Panel argument 9 */ + +/* Bit field masks: */ +#define CAN_PANCTR_PANCMD_Msk 0x000000FFUL /*!< Command panel */ +#define CAN_PANCTR_BUSY_Msk 0x00000100UL /*!< Busy flag panels arguments (waiting to be written at the end of the command) */ +#define CAN_PANCTR_RBUSY_Msk 0x00000200UL /*!< Busy flag panels arguments (running the command list, the result of which will be recorded in PANAR1 and PANAR2) */ +#define CAN_PANCTR_PANAR1_Msk 0x00FF0000UL /*!< Panel argument 8 */ +#define CAN_PANCTR_PANAR2_Msk 0xFF000000UL /*!< Panel argument 9 */ + +/*-- MCR: ---------------------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t :12; /*!< RESERVED */ + uint32_t MPSEL :4; /*!< Field task position after waiting message bit transmit / receive messages */ +} _CAN_MCR_bits; + +/* Bit field positions: */ +#define CAN_MCR_MPSEL_Pos 12 /*!< Field task position after waiting message bit transmit / receive messages */ + +/* Bit field masks: */ +#define CAN_MCR_MPSEL_Msk 0x0000F000UL /*!< Field task position after waiting message bit transmit / receive messages */ + +/*-- MITR: Interrupt register --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t IT :16; /*!< Field generate interrupt */ +} _CAN_MITR_bits; + +/* Bit field positions: */ +#define CAN_MITR_IT_Pos 0 /*!< Field generate interrupt */ + +/* Bit field masks: */ +#define CAN_MITR_IT_Msk 0x0000FFFFUL /*!< Field generate interrupt */ + +/*-- Node: NCR: Register control node0 ------------------------------------------------------------------------*/ +typedef struct { + uint32_t INIT :1; /*!< Node initialization */ + uint32_t TRIE :1; /*!< Interrupt enable bit of the assembly at the end of the transmission / reception */ + uint32_t LECIE :1; /*!< Interrupt enable bit of the assembly when it detects the last error code */ + uint32_t ALIE :1; /*!< Enable interrupt ALERT from node */ + uint32_t CANDIS :1; /*!< Off node */ + uint32_t :1; /*!< RESERVED */ + uint32_t CCE :1; /*!< Permission node configuration changes */ + uint32_t CALM :1; /*!< Activate the node analysis */ +} _CAN_Node_NCR_bits; + +/* Bit field positions: */ +#define CAN_Node_NCR_INIT_Pos 0 /*!< Node initialization */ +#define CAN_Node_NCR_TRIE_Pos 1 /*!< Interrupt enable bit of the assembly at the end of the transmission / reception */ +#define CAN_Node_NCR_LECIE_Pos 2 /*!< Interrupt enable bit of the assembly when it detects the last error code */ +#define CAN_Node_NCR_ALIE_Pos 3 /*!< Enable interrupt ALERT from node */ +#define CAN_Node_NCR_CANDIS_Pos 4 /*!< Off node */ +#define CAN_Node_NCR_CCE_Pos 6 /*!< Permission node configuration changes */ +#define CAN_Node_NCR_CALM_Pos 7 /*!< Activate the node analysis */ + +/* Bit field masks: */ +#define CAN_Node_NCR_INIT_Msk 0x00000001UL /*!< Node initialization */ +#define CAN_Node_NCR_TRIE_Msk 0x00000002UL /*!< Interrupt enable bit of the assembly at the end of the transmission / reception */ +#define CAN_Node_NCR_LECIE_Msk 0x00000004UL /*!< Interrupt enable bit of the assembly when it detects the last error code */ +#define CAN_Node_NCR_ALIE_Msk 0x00000008UL /*!< Enable interrupt ALERT from node */ +#define CAN_Node_NCR_CANDIS_Msk 0x00000010UL /*!< Off node */ +#define CAN_Node_NCR_CCE_Msk 0x00000040UL /*!< Permission node configuration changes */ +#define CAN_Node_NCR_CALM_Msk 0x00000080UL /*!< Activate the node analysis */ + +/*-- Node: NSR: Register state node0 --------------------------------------------------------------------------*/ +typedef struct { + uint32_t LEC :3; /*!< Last error code */ + uint32_t TXOK :1; /*!< Flag successful message transmission */ + uint32_t RXOK :1; /*!< Flag successful reception of messages */ + uint32_t ALERT :1; /*!< Warning flag ALERT */ + uint32_t EWRN :1; /*!< Flag critical errors */ + uint32_t BOFF :1; /*!< Status flag 'is disconnected from the bus' */ + uint32_t LLE :1; /*!< Error flag list */ + uint32_t LOE :1; /*!< Error Flag Room list */ +} _CAN_Node_NSR_bits; + +/* Bit field positions: */ +#define CAN_Node_NSR_LEC_Pos 0 /*!< Last error code */ +#define CAN_Node_NSR_TXOK_Pos 3 /*!< Flag successful message transmission */ +#define CAN_Node_NSR_RXOK_Pos 4 /*!< Flag successful reception of messages */ +#define CAN_Node_NSR_ALERT_Pos 5 /*!< Warning flag ALERT */ +#define CAN_Node_NSR_EWRN_Pos 6 /*!< Flag critical errors */ +#define CAN_Node_NSR_BOFF_Pos 7 /*!< Status flag 'is disconnected from the bus' */ +#define CAN_Node_NSR_LLE_Pos 8 /*!< Error flag list */ +#define CAN_Node_NSR_LOE_Pos 9 /*!< Error Flag Room list */ + +/* Bit field masks: */ +#define CAN_Node_NSR_LEC_Msk 0x00000007UL /*!< Last error code */ +#define CAN_Node_NSR_TXOK_Msk 0x00000008UL /*!< Flag successful message transmission */ +#define CAN_Node_NSR_RXOK_Msk 0x00000010UL /*!< Flag successful reception of messages */ +#define CAN_Node_NSR_ALERT_Msk 0x00000020UL /*!< Warning flag ALERT */ +#define CAN_Node_NSR_EWRN_Msk 0x00000040UL /*!< Flag critical errors */ +#define CAN_Node_NSR_BOFF_Msk 0x00000080UL /*!< Status flag 'is disconnected from the bus' */ +#define CAN_Node_NSR_LLE_Msk 0x00000100UL /*!< Error flag list */ +#define CAN_Node_NSR_LOE_Msk 0x00000200UL /*!< Error Flag Room list */ + +/* Bit field enums: */ +typedef enum { + CAN_Node_NSR_LEC_NoErr = 0x0UL, /*!< no error */ + CAN_Node_NSR_LEC_StuffErr = 0x1UL, /*!< stuff error */ + CAN_Node_NSR_LEC_FormErr = 0x2UL, /*!< form error */ + CAN_Node_NSR_LEC_AckErr = 0x3UL, /*!< acknowlegment error */ + CAN_Node_NSR_LEC_Bit1Err = 0x4UL, /*!< bit 1 error */ + CAN_Node_NSR_LEC_Bit0Err = 0x5UL, /*!< bit 0 error */ + CAN_Node_NSR_LEC_CRCErr = 0x6UL, /*!< CRC error */ + CAN_Node_NSR_LEC_WriteEn = 0x7UL, /*!< enable hardware write */ +} CAN_Node_NSR_LEC_Enum; + +/*-- Node: NIPR: Interrupt pointer register node0 -------------------------------------------------------------*/ +typedef struct { + uint32_t ALINP :4; /*!< */ + uint32_t LECINP :4; /*!< */ + uint32_t TRINP :4; /*!< */ + uint32_t CFCINP :4; /*!< */ +} _CAN_Node_NIPR_bits; + +/* Bit field positions: */ +#define CAN_Node_NIPR_ALINP_Pos 0 /*!< */ +#define CAN_Node_NIPR_LECINP_Pos 4 /*!< */ +#define CAN_Node_NIPR_TRINP_Pos 8 /*!< */ +#define CAN_Node_NIPR_CFCINP_Pos 12 /*!< */ + +/* Bit field masks: */ +#define CAN_Node_NIPR_ALINP_Msk 0x0000000FUL /*!< */ +#define CAN_Node_NIPR_LECINP_Msk 0x000000F0UL /*!< */ +#define CAN_Node_NIPR_TRINP_Msk 0x00000F00UL /*!< */ +#define CAN_Node_NIPR_CFCINP_Msk 0x0000F000UL /*!< */ + +/*-- Node: NPCR: Port control register node0 ------------------------------------------------------------------*/ +typedef struct { + uint32_t :8; /*!< RESERVED */ + uint32_t LBM :1; /*!< Enable mode Loop-Back */ +} _CAN_Node_NPCR_bits; + +/* Bit field positions: */ +#define CAN_Node_NPCR_LBM_Pos 8 /*!< Enable mode Loop-Back */ + +/* Bit field masks: */ +#define CAN_Node_NPCR_LBM_Msk 0x00000100UL /*!< Enable mode Loop-Back */ + +/*-- Node: NBTR: Timing register bits 0 -----------------------------------------------------------------------*/ +typedef struct { + uint32_t BRP :6; /*!< Prescaler rate */ + uint32_t SJW :2; /*!< Transition width resynchronization */ + uint32_t TSEG1 :4; /*!< Parameter 1 */ + uint32_t TSEG2 :3; /*!< Parameter 2 */ + uint32_t DIV8 :1; /*!< Frequency divider by 8 */ +} _CAN_Node_NBTR_bits; + +/* Bit field positions: */ +#define CAN_Node_NBTR_BRP_Pos 0 /*!< Prescaler rate */ +#define CAN_Node_NBTR_SJW_Pos 6 /*!< Transition width resynchronization */ +#define CAN_Node_NBTR_TSEG1_Pos 8 /*!< Parameter 1 */ +#define CAN_Node_NBTR_TSEG2_Pos 12 /*!< Parameter 2 */ +#define CAN_Node_NBTR_DIV8_Pos 15 /*!< Frequency divider by 8 */ + +/* Bit field masks: */ +#define CAN_Node_NBTR_BRP_Msk 0x0000003FUL /*!< Prescaler rate */ +#define CAN_Node_NBTR_SJW_Msk 0x000000C0UL /*!< Transition width resynchronization */ +#define CAN_Node_NBTR_TSEG1_Msk 0x00000F00UL /*!< Parameter 1 */ +#define CAN_Node_NBTR_TSEG2_Msk 0x00007000UL /*!< Parameter 2 */ +#define CAN_Node_NBTR_DIV8_Msk 0x00008000UL /*!< Frequency divider by 8 */ + +/*-- Node: NECNT: Counter error register node0 ----------------------------------------------------------------*/ +typedef struct { + uint32_t REC :8; /*!< Receive Error Counter field messages */ + uint32_t TEC :8; /*!< Counter field messaging error */ + uint32_t EWRNLVL :8; /*!< Error limit at which a flag is set in the register EWRN NSR */ + uint32_t LETD :1; /*!< Flag last transmission errors */ + uint32_t LEINC :1; /*!< Indicator increment at the last error */ +} _CAN_Node_NECNT_bits; + +/* Bit field positions: */ +#define CAN_Node_NECNT_REC_Pos 0 /*!< Receive Error Counter field messages */ +#define CAN_Node_NECNT_TEC_Pos 8 /*!< Counter field messaging error */ +#define CAN_Node_NECNT_EWRNLVL_Pos 16 /*!< Error limit at which a flag is set in the register EWRN NSR */ +#define CAN_Node_NECNT_LETD_Pos 24 /*!< Flag last transmission errors */ +#define CAN_Node_NECNT_LEINC_Pos 25 /*!< Indicator increment at the last error */ + +/* Bit field masks: */ +#define CAN_Node_NECNT_REC_Msk 0x000000FFUL /*!< Receive Error Counter field messages */ +#define CAN_Node_NECNT_TEC_Msk 0x0000FF00UL /*!< Counter field messaging error */ +#define CAN_Node_NECNT_EWRNLVL_Msk 0x00FF0000UL /*!< Error limit at which a flag is set in the register EWRN NSR */ +#define CAN_Node_NECNT_LETD_Msk 0x01000000UL /*!< Flag last transmission errors */ +#define CAN_Node_NECNT_LEINC_Msk 0x02000000UL /*!< Indicator increment at the last error */ + +/*-- Node: NFCR: Register message counter node0 ---------------------------------------------------------------*/ +typedef struct { + uint32_t CFC :16; /*!< Field of the message counter */ + uint32_t CFSEL :3; /*!< Field parameter setting mode selected message counter */ + uint32_t CFMOD :2; /*!< Field task mode message counter */ + uint32_t :1; /*!< RESERVED */ + uint32_t CFCIE :1; /*!< Interrupt enable bit of the message counter */ + uint32_t CFCOV :1; /*!< Counter overflow flag messages */ +} _CAN_Node_NFCR_bits; + +/* Bit field positions: */ +#define CAN_Node_NFCR_CFC_Pos 0 /*!< Field of the message counter */ +#define CAN_Node_NFCR_CFSEL_Pos 16 /*!< Field parameter setting mode selected message counter */ +#define CAN_Node_NFCR_CFMOD_Pos 19 /*!< Field task mode message counter */ +#define CAN_Node_NFCR_CFCIE_Pos 22 /*!< Interrupt enable bit of the message counter */ +#define CAN_Node_NFCR_CFCOV_Pos 23 /*!< Counter overflow flag messages */ + +/* Bit field masks: */ +#define CAN_Node_NFCR_CFC_Msk 0x0000FFFFUL /*!< Field of the message counter */ +#define CAN_Node_NFCR_CFSEL_Msk 0x00070000UL /*!< Field parameter setting mode selected message counter */ +#define CAN_Node_NFCR_CFMOD_Msk 0x00180000UL /*!< Field task mode message counter */ +#define CAN_Node_NFCR_CFCIE_Msk 0x00400000UL /*!< Interrupt enable bit of the message counter */ +#define CAN_Node_NFCR_CFCOV_Msk 0x00800000UL /*!< Counter overflow flag messages */ + +//Cluster LIST: +typedef struct { + union { + /*!< Register list0 */ + __I uint32_t LIST; /*!< LIST : type used for word access */ + __I _CAN_LIST_LIST_bits LIST_bit; /*!< LIST_bit: structure used for bit access */ + }; +} _CAN_LIST_TypeDef; +//Cluster MSPND: +typedef struct { + union { + /*!< Register waiting interrupts0 */ + __IO uint32_t MSPND; /*!< MSPND : type used for word access */ + __IO _CAN_MSPND_MSPND_bits MSPND_bit; /*!< MSPND_bit: structure used for bit access */ + }; +} _CAN_MSPND_TypeDef; +//Cluster MSID: +typedef struct { + union { + /*!< Register messages index0 */ + __I uint32_t MSID; /*!< MSID : type used for word access */ + __I _CAN_MSID_MSID_bits MSID_bit; /*!< MSID_bit: structure used for bit access */ + }; +} _CAN_MSID_TypeDef; +//Cluster Node: +typedef struct { + union { + /*!< Register control node0 */ + __IO uint32_t NCR; /*!< NCR : type used for word access */ + __IO _CAN_Node_NCR_bits NCR_bit; /*!< NCR_bit: structure used for bit access */ + }; + union { + /*!< Register state node0 */ + __IO uint32_t NSR; /*!< NSR : type used for word access */ + __IO _CAN_Node_NSR_bits NSR_bit; /*!< NSR_bit: structure used for bit access */ + }; + union { + /*!< Interrupt pointer register node0 */ + __IO uint32_t NIPR; /*!< NIPR : type used for word access */ + __IO _CAN_Node_NIPR_bits NIPR_bit; /*!< NIPR_bit: structure used for bit access */ + }; + union { + /*!< Port control register node0 */ + __IO uint32_t NPCR; /*!< NPCR : type used for word access */ + __IO _CAN_Node_NPCR_bits NPCR_bit; /*!< NPCR_bit: structure used for bit access */ + }; + union { + /*!< Timing register bits 0 */ + __IO uint32_t NBTR; /*!< NBTR : type used for word access */ + __IO _CAN_Node_NBTR_bits NBTR_bit; /*!< NBTR_bit: structure used for bit access */ + }; + union { + /*!< Counter error register node0 */ + __IO uint32_t NECNT; /*!< NECNT : type used for word access */ + __IO _CAN_Node_NECNT_bits NECNT_bit; /*!< NECNT_bit: structure used for bit access */ + }; + union { + /*!< Register message counter node0 */ + __IO uint32_t NFCR; /*!< NFCR : type used for word access */ + __IO _CAN_Node_NFCR_bits NFCR_bit; /*!< NFCR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[57]; +} _CAN_Node_TypeDef; +typedef struct { + union { /*!< Frequency control register */ + __IO uint32_t CLC; /*!< CLC : type used for word access */ + __IO _CAN_CLC_bits CLC_bit; /*!< CLC_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0; + union { /*!< Identity register */ + __IO uint32_t ID; /*!< ID : type used for word access */ + __IO _CAN_ID_bits ID_bit; /*!< ID_bit: structure used for bit access */ + }; + union { /*!< Register divider */ + __IO uint32_t FDR; /*!< FDR : type used for word access */ + __IO _CAN_FDR_bits FDR_bit; /*!< FDR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1[60]; + _CAN_LIST_TypeDef LIST[8]; + __IO uint32_t Reserved2[8]; + _CAN_MSPND_TypeDef MSPND[8]; + __IO uint32_t Reserved3[8]; + _CAN_MSID_TypeDef MSID[8]; + __IO uint32_t Reserved4[8]; + union { /*!< Mask register message index */ + __IO uint32_t MSIMASK; /*!< MSIMASK : type used for word access */ + __IO _CAN_MSIMASK_bits MSIMASK_bit; /*!< MSIMASK_bit: structure used for bit access */ + }; + union { /*!< Register command panel */ + __IO uint32_t PANCTR; /*!< PANCTR : type used for word access */ + __IO _CAN_PANCTR_bits PANCTR_bit; /*!< PANCTR_bit: structure used for bit access */ + }; + union { /*!< */ + __IO uint32_t MCR; /*!< MCR : type used for word access */ + __IO _CAN_MCR_bits MCR_bit; /*!< MCR_bit: structure used for bit access */ + }; + union { /*!< Interrupt register */ + __O uint32_t MITR; /*!< MITR : type used for word access */ + __O _CAN_MITR_bits MITR_bit; /*!< MITR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved5[12]; + _CAN_Node_TypeDef Node[2]; +} CAN_TypeDef; + + +/******************************************************************************/ +/* CANMSG registers */ +/******************************************************************************/ + +/*-- Msg: MOFCR: Register control the operation of the message object 0 ---------------------------------------*/ +typedef struct { + uint32_t MMC :4; /*!< */ + uint32_t :4; /*!< RESERVED */ + uint32_t GDFS :1; /*!< */ + uint32_t IDC :1; /*!< */ + uint32_t DLCC :1; /*!< */ + uint32_t DATC :1; /*!< */ + uint32_t :4; /*!< RESERVED */ + uint32_t RXIE :1; /*!< Interrupt enable after taking the messages */ + uint32_t TXIE :1; /*!< Interrupt enable at the end of the message */ + uint32_t OVIE :1; /*!< Interrupt enable FIFO to fill the message object 0 */ + uint32_t :1; /*!< RESERVED */ + uint32_t FRREN :1; /*!< Enable remote request */ + uint32_t RMM :1; /*!< Enable remote monitoring of the communication object */ + uint32_t SDT :1; /*!< Bit single of the message object 0 participation in shipment */ + uint32_t STT :1; /*!< Bit single data transfer */ + uint32_t DLC :4; /*!< Data length code */ +} _CANMSG_Msg_MOFCR_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOFCR_MMC_Pos 0 /*!< */ +#define CANMSG_Msg_MOFCR_GDFS_Pos 8 /*!< */ +#define CANMSG_Msg_MOFCR_IDC_Pos 9 /*!< */ +#define CANMSG_Msg_MOFCR_DLCC_Pos 10 /*!< */ +#define CANMSG_Msg_MOFCR_DATC_Pos 11 /*!< */ +#define CANMSG_Msg_MOFCR_RXIE_Pos 16 /*!< Interrupt enable after taking the messages */ +#define CANMSG_Msg_MOFCR_TXIE_Pos 17 /*!< Interrupt enable at the end of the message */ +#define CANMSG_Msg_MOFCR_OVIE_Pos 18 /*!< Interrupt enable FIFO to fill the message object 0 */ +#define CANMSG_Msg_MOFCR_FRREN_Pos 20 /*!< Enable remote request */ +#define CANMSG_Msg_MOFCR_RMM_Pos 21 /*!< Enable remote monitoring of the communication object */ +#define CANMSG_Msg_MOFCR_SDT_Pos 22 /*!< Bit single of the message object 0 participation in shipment */ +#define CANMSG_Msg_MOFCR_STT_Pos 23 /*!< Bit single data transfer */ +#define CANMSG_Msg_MOFCR_DLC_Pos 24 /*!< Data length code */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOFCR_MMC_Msk 0x0000000FUL /*!< */ +#define CANMSG_Msg_MOFCR_GDFS_Msk 0x00000100UL /*!< */ +#define CANMSG_Msg_MOFCR_IDC_Msk 0x00000200UL /*!< */ +#define CANMSG_Msg_MOFCR_DLCC_Msk 0x00000400UL /*!< */ +#define CANMSG_Msg_MOFCR_DATC_Msk 0x00000800UL /*!< */ +#define CANMSG_Msg_MOFCR_RXIE_Msk 0x00010000UL /*!< Interrupt enable after taking the messages */ +#define CANMSG_Msg_MOFCR_TXIE_Msk 0x00020000UL /*!< Interrupt enable at the end of the message */ +#define CANMSG_Msg_MOFCR_OVIE_Msk 0x00040000UL /*!< Interrupt enable FIFO to fill the message object 0 */ +#define CANMSG_Msg_MOFCR_FRREN_Msk 0x00100000UL /*!< Enable remote request */ +#define CANMSG_Msg_MOFCR_RMM_Msk 0x00200000UL /*!< Enable remote monitoring of the communication object */ +#define CANMSG_Msg_MOFCR_SDT_Msk 0x00400000UL /*!< Bit single of the message object 0 participation in shipment */ +#define CANMSG_Msg_MOFCR_STT_Msk 0x00800000UL /*!< Bit single data transfer */ +#define CANMSG_Msg_MOFCR_DLC_Msk 0x0F000000UL /*!< Data length code */ + +/* Bit field enums: */ +typedef enum { + CANMSG_Msg_MOFCR_MMC_MsgObj = 0x0UL, /*!< message object */ + CANMSG_Msg_MOFCR_MMC_RXObj = 0x1UL, /*!< receiver FIFO structure object */ + CANMSG_Msg_MOFCR_MMC_TXObj = 0x2UL, /*!< transmitter FIFO structure object */ + CANMSG_Msg_MOFCR_MMC_SlaveTXObj = 0x3UL, /*!< transmitter FIFO structure slave object */ + CANMSG_Msg_MOFCR_MMC_SrcObj = 0x4UL, /*!< gateway source object */ +} CANMSG_Msg_MOFCR_MMC_Enum; + +/*-- Msg: MOFGPR: Pointer register FIFO / gateway message object 0 --------------------------------------------*/ +typedef struct { + uint32_t BOT :8; /*!< FIFO pointer to the lower element */ + uint32_t TOP :8; /*!< FIFO pointer to the top element */ + uint32_t CUR :8; /*!< A pointer to the current object within the FIFO or gateway */ + uint32_t SEL :8; /*!< Object pointer message */ +} _CANMSG_Msg_MOFGPR_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOFGPR_BOT_Pos 0 /*!< FIFO pointer to the lower element */ +#define CANMSG_Msg_MOFGPR_TOP_Pos 8 /*!< FIFO pointer to the top element */ +#define CANMSG_Msg_MOFGPR_CUR_Pos 16 /*!< A pointer to the current object within the FIFO or gateway */ +#define CANMSG_Msg_MOFGPR_SEL_Pos 24 /*!< Object pointer message */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOFGPR_BOT_Msk 0x000000FFUL /*!< FIFO pointer to the lower element */ +#define CANMSG_Msg_MOFGPR_TOP_Msk 0x0000FF00UL /*!< FIFO pointer to the top element */ +#define CANMSG_Msg_MOFGPR_CUR_Msk 0x00FF0000UL /*!< A pointer to the current object within the FIFO or gateway */ +#define CANMSG_Msg_MOFGPR_SEL_Msk 0xFF000000UL /*!< Object pointer message */ + +/*-- Msg: MOIPR: Pointer register interrupt message object 0 --------------------------------------------------*/ +typedef struct { + uint32_t RXINP :4; /*!< Pointer interrupt line to interrupt after receiving */ + uint32_t TXINP :4; /*!< Pointer interrupt line to interrupt after transfer */ + uint32_t MPN :8; /*!< Number message waiting bit */ + uint32_t CFCVAL :16; /*!< Number of frames */ +} _CANMSG_Msg_MOIPR_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOIPR_RXINP_Pos 0 /*!< Pointer interrupt line to interrupt after receiving */ +#define CANMSG_Msg_MOIPR_TXINP_Pos 4 /*!< Pointer interrupt line to interrupt after transfer */ +#define CANMSG_Msg_MOIPR_MPN_Pos 8 /*!< Number message waiting bit */ +#define CANMSG_Msg_MOIPR_CFCVAL_Pos 16 /*!< Number of frames */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOIPR_RXINP_Msk 0x0000000FUL /*!< Pointer interrupt line to interrupt after receiving */ +#define CANMSG_Msg_MOIPR_TXINP_Msk 0x000000F0UL /*!< Pointer interrupt line to interrupt after transfer */ +#define CANMSG_Msg_MOIPR_MPN_Msk 0x0000FF00UL /*!< Number message waiting bit */ +#define CANMSG_Msg_MOIPR_CFCVAL_Msk 0xFFFF0000UL /*!< Number of frames */ + +/*-- Msg: MOAMR: Mask register message object 0 ---------------------------------------------------------------*/ +typedef struct { + uint32_t AM :29; /*!< Mask ID */ + uint32_t MIDE :1; /*!< Mask bit IDE message */ +} _CANMSG_Msg_MOAMR_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOAMR_AM_Pos 0 /*!< Mask ID */ +#define CANMSG_Msg_MOAMR_MIDE_Pos 29 /*!< Mask bit IDE message */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOAMR_AM_Msk 0x1FFFFFFFUL /*!< Mask ID */ +#define CANMSG_Msg_MOAMR_MIDE_Msk 0x20000000UL /*!< Mask bit IDE message */ + +/*-- Msg: MODATAL: Low data registers of the message object 0 -------------------------------------------------*/ +typedef struct { + uint32_t DB0 :8; /*!< Zero byte data */ + uint32_t DB1 :8; /*!< The first data byte */ + uint32_t DB2 :8; /*!< Second data byte */ + uint32_t DB3 :8; /*!< The third data byte */ +} _CANMSG_Msg_MODATAL_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MODATAL_DB0_Pos 0 /*!< Zero byte data */ +#define CANMSG_Msg_MODATAL_DB1_Pos 8 /*!< The first data byte */ +#define CANMSG_Msg_MODATAL_DB2_Pos 16 /*!< Second data byte */ +#define CANMSG_Msg_MODATAL_DB3_Pos 24 /*!< The third data byte */ + +/* Bit field masks: */ +#define CANMSG_Msg_MODATAL_DB0_Msk 0x000000FFUL /*!< Zero byte data */ +#define CANMSG_Msg_MODATAL_DB1_Msk 0x0000FF00UL /*!< The first data byte */ +#define CANMSG_Msg_MODATAL_DB2_Msk 0x00FF0000UL /*!< Second data byte */ +#define CANMSG_Msg_MODATAL_DB3_Msk 0xFF000000UL /*!< The third data byte */ + +/*-- Msg: MODATAH: High data registers of the message object 0 ------------------------------------------------*/ +typedef struct { + uint32_t DB4 :8; /*!< The fourth data byte */ + uint32_t DB5 :8; /*!< Fifth byte data */ + uint32_t DB6 :8; /*!< Sixth byte data */ + uint32_t DB7 :8; /*!< Seventh byte of data */ +} _CANMSG_Msg_MODATAH_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MODATAH_DB4_Pos 0 /*!< The fourth data byte */ +#define CANMSG_Msg_MODATAH_DB5_Pos 8 /*!< Fifth byte data */ +#define CANMSG_Msg_MODATAH_DB6_Pos 16 /*!< Sixth byte data */ +#define CANMSG_Msg_MODATAH_DB7_Pos 24 /*!< Seventh byte of data */ + +/* Bit field masks: */ +#define CANMSG_Msg_MODATAH_DB4_Msk 0x000000FFUL /*!< The fourth data byte */ +#define CANMSG_Msg_MODATAH_DB5_Msk 0x0000FF00UL /*!< Fifth byte data */ +#define CANMSG_Msg_MODATAH_DB6_Msk 0x00FF0000UL /*!< Sixth byte data */ +#define CANMSG_Msg_MODATAH_DB7_Msk 0xFF000000UL /*!< Seventh byte of data */ + +/*-- Msg: MOAR: Register arbitration message object 0 ---------------------------------------------------------*/ +typedef struct { + uint32_t ID :29; /*!< Object ID message 0 */ + uint32_t IDE :1; /*!< Bit extension identifier of the message object 0 */ + uint32_t PRI :2; /*!< Priority class */ +} _CANMSG_Msg_MOAR_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOAR_ID_Pos 0 /*!< Object ID message 0 */ +#define CANMSG_Msg_MOAR_IDE_Pos 29 /*!< Bit extension identifier of the message object 0 */ +#define CANMSG_Msg_MOAR_PRI_Pos 30 /*!< Priority class */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOAR_ID_Msk 0x1FFFFFFFUL /*!< Object ID message 0 */ +#define CANMSG_Msg_MOAR_IDE_Msk 0x20000000UL /*!< Bit extension identifier of the message object 0 */ +#define CANMSG_Msg_MOAR_PRI_Msk 0xC0000000UL /*!< Priority class */ + +/*-- Msg: MOCTR: Control register Message object 0 ------------------------------------------------------------*/ +typedef struct { + uint32_t RESRXPND :1; /*!< Reset bit RXPND */ + uint32_t RESTXPND :1; /*!< Reset bit TXPND */ + uint32_t RESRXUPD :1; /*!< Reset bit RXUPD */ + uint32_t RESNEWDAT :1; /*!< Reset bit NEWDAT */ + uint32_t RESMSGLST :1; /*!< Reset bit MSGLST */ + uint32_t RESMSGVAL :1; /*!< Reset bit MSGVAL */ + uint32_t RESRTSEL :1; /*!< Reset bit RTSEL */ + uint32_t RESRXEN :1; /*!< Reset bit RXEN */ + uint32_t RESTXRQ :1; /*!< Reset bit TXRQ */ + uint32_t RESTXEN0 :1; /*!< Reset bit TXEN0 */ + uint32_t RESTXEN1 :1; /*!< Reset bit TXEN1 */ + uint32_t RESDIR :1; /*!< Reset bit DIR */ + uint32_t :4; /*!< RESERVED */ + uint32_t SETRXPND :1; /*!< Set bit RXPND */ + uint32_t SETTXPND :1; /*!< Set bit TXPND */ + uint32_t SETRXUPD :1; /*!< Set bit RXUPD */ + uint32_t SETNEWDAT :1; /*!< Set bit NEWDAT */ + uint32_t SETMSGLST :1; /*!< Set bit MSGLST */ + uint32_t SETMSGVAL :1; /*!< Set bit MSGVAL */ + uint32_t SETRTSEL :1; /*!< Set bit RTSEL */ + uint32_t SETRXEN :1; /*!< Set bit RXEN */ + uint32_t SETTXRQ :1; /*!< Set bit TXRQ */ + uint32_t SETTXEN0 :1; /*!< Set bit TXEN0 */ + uint32_t SETTXEN1 :1; /*!< Set bit TXEN1 */ + uint32_t SETDIR :1; /*!< Set bit DIR */ +} _CANMSG_Msg_MOCTR_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOCTR_RESRXPND_Pos 0 /*!< Reset bit RXPND */ +#define CANMSG_Msg_MOCTR_RESTXPND_Pos 1 /*!< Reset bit TXPND */ +#define CANMSG_Msg_MOCTR_RESRXUPD_Pos 2 /*!< Reset bit RXUPD */ +#define CANMSG_Msg_MOCTR_RESNEWDAT_Pos 3 /*!< Reset bit NEWDAT */ +#define CANMSG_Msg_MOCTR_RESMSGLST_Pos 4 /*!< Reset bit MSGLST */ +#define CANMSG_Msg_MOCTR_RESMSGVAL_Pos 5 /*!< Reset bit MSGVAL */ +#define CANMSG_Msg_MOCTR_RESRTSEL_Pos 6 /*!< Reset bit RTSEL */ +#define CANMSG_Msg_MOCTR_RESRXEN_Pos 7 /*!< Reset bit RXEN */ +#define CANMSG_Msg_MOCTR_RESTXRQ_Pos 8 /*!< Reset bit TXRQ */ +#define CANMSG_Msg_MOCTR_RESTXEN0_Pos 9 /*!< Reset bit TXEN0 */ +#define CANMSG_Msg_MOCTR_RESTXEN1_Pos 10 /*!< Reset bit TXEN1 */ +#define CANMSG_Msg_MOCTR_RESDIR_Pos 11 /*!< Reset bit DIR */ +#define CANMSG_Msg_MOCTR_SETRXPND_Pos 16 /*!< Set bit RXPND */ +#define CANMSG_Msg_MOCTR_SETTXPND_Pos 17 /*!< Set bit TXPND */ +#define CANMSG_Msg_MOCTR_SETRXUPD_Pos 18 /*!< Set bit RXUPD */ +#define CANMSG_Msg_MOCTR_SETNEWDAT_Pos 19 /*!< Set bit NEWDAT */ +#define CANMSG_Msg_MOCTR_SETMSGLST_Pos 20 /*!< Set bit MSGLST */ +#define CANMSG_Msg_MOCTR_SETMSGVAL_Pos 21 /*!< Set bit MSGVAL */ +#define CANMSG_Msg_MOCTR_SETRTSEL_Pos 22 /*!< Set bit RTSEL */ +#define CANMSG_Msg_MOCTR_SETRXEN_Pos 23 /*!< Set bit RXEN */ +#define CANMSG_Msg_MOCTR_SETTXRQ_Pos 24 /*!< Set bit TXRQ */ +#define CANMSG_Msg_MOCTR_SETTXEN0_Pos 25 /*!< Set bit TXEN0 */ +#define CANMSG_Msg_MOCTR_SETTXEN1_Pos 26 /*!< Set bit TXEN1 */ +#define CANMSG_Msg_MOCTR_SETDIR_Pos 27 /*!< Set bit DIR */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOCTR_RESRXPND_Msk 0x00000001UL /*!< Reset bit RXPND */ +#define CANMSG_Msg_MOCTR_RESTXPND_Msk 0x00000002UL /*!< Reset bit TXPND */ +#define CANMSG_Msg_MOCTR_RESRXUPD_Msk 0x00000004UL /*!< Reset bit RXUPD */ +#define CANMSG_Msg_MOCTR_RESNEWDAT_Msk 0x00000008UL /*!< Reset bit NEWDAT */ +#define CANMSG_Msg_MOCTR_RESMSGLST_Msk 0x00000010UL /*!< Reset bit MSGLST */ +#define CANMSG_Msg_MOCTR_RESMSGVAL_Msk 0x00000020UL /*!< Reset bit MSGVAL */ +#define CANMSG_Msg_MOCTR_RESRTSEL_Msk 0x00000040UL /*!< Reset bit RTSEL */ +#define CANMSG_Msg_MOCTR_RESRXEN_Msk 0x00000080UL /*!< Reset bit RXEN */ +#define CANMSG_Msg_MOCTR_RESTXRQ_Msk 0x00000100UL /*!< Reset bit TXRQ */ +#define CANMSG_Msg_MOCTR_RESTXEN0_Msk 0x00000200UL /*!< Reset bit TXEN0 */ +#define CANMSG_Msg_MOCTR_RESTXEN1_Msk 0x00000400UL /*!< Reset bit TXEN1 */ +#define CANMSG_Msg_MOCTR_RESDIR_Msk 0x00000800UL /*!< Reset bit DIR */ +#define CANMSG_Msg_MOCTR_SETRXPND_Msk 0x00010000UL /*!< Set bit RXPND */ +#define CANMSG_Msg_MOCTR_SETTXPND_Msk 0x00020000UL /*!< Set bit TXPND */ +#define CANMSG_Msg_MOCTR_SETRXUPD_Msk 0x00040000UL /*!< Set bit RXUPD */ +#define CANMSG_Msg_MOCTR_SETNEWDAT_Msk 0x00080000UL /*!< Set bit NEWDAT */ +#define CANMSG_Msg_MOCTR_SETMSGLST_Msk 0x00100000UL /*!< Set bit MSGLST */ +#define CANMSG_Msg_MOCTR_SETMSGVAL_Msk 0x00200000UL /*!< Set bit MSGVAL */ +#define CANMSG_Msg_MOCTR_SETRTSEL_Msk 0x00400000UL /*!< Set bit RTSEL */ +#define CANMSG_Msg_MOCTR_SETRXEN_Msk 0x00800000UL /*!< Set bit RXEN */ +#define CANMSG_Msg_MOCTR_SETTXRQ_Msk 0x01000000UL /*!< Set bit TXRQ */ +#define CANMSG_Msg_MOCTR_SETTXEN0_Msk 0x02000000UL /*!< Set bit TXEN0 */ +#define CANMSG_Msg_MOCTR_SETTXEN1_Msk 0x04000000UL /*!< Set bit TXEN1 */ +#define CANMSG_Msg_MOCTR_SETDIR_Msk 0x08000000UL /*!< Set bit DIR */ + +/*-- Msg: MOSTAT: Status register of the message object 0 -----------------------------------------------------*/ +typedef struct { + uint32_t RXPND :1; /*!< Indicator deadline */ + uint32_t TXPND :1; /*!< Indicator end of transmission */ + uint32_t RXUPD :1; /*!< Indicator changes */ + uint32_t NEWDAT :1; /*!< New data indicator */ + uint32_t MSGLST :1; /*!< Bit message loss */ + uint32_t MSGVAL :1; /*!< Activity bit of the message object 0 */ + uint32_t RTSEL :1; /*!< The indication of transmission / reception */ + uint32_t RXEN :1; /*!< Bits allow reception */ + uint32_t TXRQ :1; /*!< Initiate transmission */ + uint32_t TXEN0 :1; /*!< Enable bit transmission frame */ + uint32_t TXEN1 :1; /*!< Enable bit transmission frame */ + uint32_t DIR :1; /*!< Bit allocation */ + uint32_t LIST :4; /*!< Number list the message object 0 */ + uint32_t PPREV :8; /*!< Pointer to the previous entry */ + uint32_t PNEXT :8; /*!< Pointer to the next item in the list */ +} _CANMSG_Msg_MOSTAT_bits; + +/* Bit field positions: */ +#define CANMSG_Msg_MOSTAT_RXPND_Pos 0 /*!< Indicator deadline */ +#define CANMSG_Msg_MOSTAT_TXPND_Pos 1 /*!< Indicator end of transmission */ +#define CANMSG_Msg_MOSTAT_RXUPD_Pos 2 /*!< Indicator changes */ +#define CANMSG_Msg_MOSTAT_NEWDAT_Pos 3 /*!< New data indicator */ +#define CANMSG_Msg_MOSTAT_MSGLST_Pos 4 /*!< Bit message loss */ +#define CANMSG_Msg_MOSTAT_MSGVAL_Pos 5 /*!< Activity bit of the message object 0 */ +#define CANMSG_Msg_MOSTAT_RTSEL_Pos 6 /*!< The indication of transmission / reception */ +#define CANMSG_Msg_MOSTAT_RXEN_Pos 7 /*!< Bits allow reception */ +#define CANMSG_Msg_MOSTAT_TXRQ_Pos 8 /*!< Initiate transmission */ +#define CANMSG_Msg_MOSTAT_TXEN0_Pos 9 /*!< Enable bit transmission frame */ +#define CANMSG_Msg_MOSTAT_TXEN1_Pos 10 /*!< Enable bit transmission frame */ +#define CANMSG_Msg_MOSTAT_DIR_Pos 11 /*!< Bit allocation */ +#define CANMSG_Msg_MOSTAT_LIST_Pos 12 /*!< Number list the message object 0 */ +#define CANMSG_Msg_MOSTAT_PPREV_Pos 16 /*!< Pointer to the previous entry */ +#define CANMSG_Msg_MOSTAT_PNEXT_Pos 24 /*!< Pointer to the next item in the list */ + +/* Bit field masks: */ +#define CANMSG_Msg_MOSTAT_RXPND_Msk 0x00000001UL /*!< Indicator deadline */ +#define CANMSG_Msg_MOSTAT_TXPND_Msk 0x00000002UL /*!< Indicator end of transmission */ +#define CANMSG_Msg_MOSTAT_RXUPD_Msk 0x00000004UL /*!< Indicator changes */ +#define CANMSG_Msg_MOSTAT_NEWDAT_Msk 0x00000008UL /*!< New data indicator */ +#define CANMSG_Msg_MOSTAT_MSGLST_Msk 0x00000010UL /*!< Bit message loss */ +#define CANMSG_Msg_MOSTAT_MSGVAL_Msk 0x00000020UL /*!< Activity bit of the message object 0 */ +#define CANMSG_Msg_MOSTAT_RTSEL_Msk 0x00000040UL /*!< The indication of transmission / reception */ +#define CANMSG_Msg_MOSTAT_RXEN_Msk 0x00000080UL /*!< Bits allow reception */ +#define CANMSG_Msg_MOSTAT_TXRQ_Msk 0x00000100UL /*!< Initiate transmission */ +#define CANMSG_Msg_MOSTAT_TXEN0_Msk 0x00000200UL /*!< Enable bit transmission frame */ +#define CANMSG_Msg_MOSTAT_TXEN1_Msk 0x00000400UL /*!< Enable bit transmission frame */ +#define CANMSG_Msg_MOSTAT_DIR_Msk 0x00000800UL /*!< Bit allocation */ +#define CANMSG_Msg_MOSTAT_LIST_Msk 0x0000F000UL /*!< Number list the message object 0 */ +#define CANMSG_Msg_MOSTAT_PPREV_Msk 0x00FF0000UL /*!< Pointer to the previous entry */ +#define CANMSG_Msg_MOSTAT_PNEXT_Msk 0xFF000000UL /*!< Pointer to the next item in the list */ + +//Cluster Msg: +typedef struct { + union { + /*!< Register control the operation of the message object 0 */ + __IO uint32_t MOFCR; /*!< MOFCR : type used for word access */ + __IO _CANMSG_Msg_MOFCR_bits MOFCR_bit; /*!< MOFCR_bit: structure used for bit access */ + }; + union { + /*!< Pointer register FIFO / gateway message object 0 */ + __IO uint32_t MOFGPR; /*!< MOFGPR : type used for word access */ + __IO _CANMSG_Msg_MOFGPR_bits MOFGPR_bit; /*!< MOFGPR_bit: structure used for bit access */ + }; + union { + /*!< Pointer register interrupt message object 0 */ + __IO uint32_t MOIPR; /*!< MOIPR : type used for word access */ + __IO _CANMSG_Msg_MOIPR_bits MOIPR_bit; /*!< MOIPR_bit: structure used for bit access */ + }; + union { + /*!< Mask register message object 0 */ + __IO uint32_t MOAMR; /*!< MOAMR : type used for word access */ + __IO _CANMSG_Msg_MOAMR_bits MOAMR_bit; /*!< MOAMR_bit: structure used for bit access */ + }; + union { + /*!< Low data registers of the message object 0 */ + __IO uint32_t MODATAL; /*!< MODATAL : type used for word access */ + __IO _CANMSG_Msg_MODATAL_bits MODATAL_bit; /*!< MODATAL_bit: structure used for bit access */ + }; + union { + /*!< High data registers of the message object 0 */ + __IO uint32_t MODATAH; /*!< MODATAH : type used for word access */ + __IO _CANMSG_Msg_MODATAH_bits MODATAH_bit; /*!< MODATAH_bit: structure used for bit access */ + }; + union { + /*!< Register arbitration message object 0 */ + __IO uint32_t MOAR; /*!< MOAR : type used for word access */ + __IO _CANMSG_Msg_MOAR_bits MOAR_bit; /*!< MOAR_bit: structure used for bit access */ + }; + union { + union { + /*!< Control register Message object 0 */ + __O uint32_t MOCTR; /*!< MOCTR : type used for word access */ + __O _CANMSG_Msg_MOCTR_bits MOCTR_bit; /*!< MOCTR_bit: structure used for bit access */ + }; + union { + /*!< Status register of the message object 0 */ + __I uint32_t MOSTAT; /*!< MOSTAT : type used for word access */ + __I _CANMSG_Msg_MOSTAT_bits MOSTAT_bit; /*!< MOSTAT_bit: structure used for bit access */ + }; + }; +} _CANMSG_Msg_TypeDef; +typedef struct { + _CANMSG_Msg_TypeDef Msg[256]; +} CANMSG_TypeDef; + + +/******************************************************************************/ +/* I2C registers */ +/******************************************************************************/ + +/*-- SDA: Data register --------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t DATA :8; /*!< Data field */ +} _I2C_SDA_bits; + +/* Bit field positions: */ +#define I2C_SDA_DATA_Pos 0 /*!< Data field */ + +/* Bit field masks: */ +#define I2C_SDA_DATA_Msk 0x000000FFUL /*!< Data field */ + +/*-- ST: Status register -------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t MODE :6; /*!< Status code */ + uint32_t :1; /*!< RESERVED */ + uint32_t INT :1; /*!< Interrupt flag */ +} _I2C_ST_bits; + +/* Bit field positions: */ +#define I2C_ST_MODE_Pos 0 /*!< Status code */ +#define I2C_ST_INT_Pos 7 /*!< Interrupt flag */ + +/* Bit field masks: */ +#define I2C_ST_MODE_Msk 0x0000003FUL /*!< Status code */ +#define I2C_ST_INT_Msk 0x00000080UL /*!< Interrupt flag */ + +/* Bit field enums: */ +typedef enum { + I2C_ST_MODE_IDLE = 0x0UL, /*!< General - Idle, no valid status information available */ + I2C_ST_MODE_STDONE = 0x1UL, /*!< FS master - Start condition generated */ + I2C_ST_MODE_RSDONE = 0x2UL, /*!< FS master - Repeated start condition generated */ + I2C_ST_MODE_IDLARL = 0x3UL, /*!< FS master - Arbitration lost, unaddressed slave mode entered */ + I2C_ST_MODE_MTADPA = 0x4UL, /*!< FS master transmit - Slave address sent, positive ACK */ + I2C_ST_MODE_MTADNA = 0x5UL, /*!< FS master transmit - Slave address sent, negative ACK */ + I2C_ST_MODE_MTDAPA = 0x6UL, /*!< FS master transmit - Data byte sent, positive ACK */ + I2C_ST_MODE_MTDANA = 0x7UL, /*!< FS master transmit - Data byte sent, negative ACK */ + I2C_ST_MODE_MRADPA = 0x8UL, /*!< FS master receive - Slave addres sent, positive ACK */ + I2C_ST_MODE_MRADNA = 0x9UL, /*!< FS master receive - Slave addres sent, negative ACK */ + I2C_ST_MODE_MRDAPA = 0xAUL, /*!< FS master receive - Data byte received, positive ACK */ + I2C_ST_MODE_MRDANA = 0xBUL, /*!< FS master receive - Data byte received, negative ACK */ + I2C_ST_MODE_MTMCER = 0xCUL, /*!< FS master - Mastercode transmitted, error detected (positive ACK) */ + I2C_ST_MODE_SRADPA = 0x10UL, /*!< FS slave receive - Slave address received, positive ACK */ + I2C_ST_MODE_SRAAPA = 0x11UL, /*!< FS slave receive - Slave address received after arbitration loss, positive ACK */ + I2C_ST_MODE_SRDAPA = 0x12UL, /*!< FS slave receive - Data byte received, positive ACK */ + I2C_ST_MODE_SRDANA = 0x13UL, /*!< FS slave receive - Data byte received, negative ACK */ + I2C_ST_MODE_STADPA = 0x14UL, /*!< FS slave transmit - Slave address received, positive ACK */ + I2C_ST_MODE_STAAPA = 0x15UL, /*!< FS slave transmit - Slave address received, negative ACK */ + I2C_ST_MODE_STDAPA = 0x16UL, /*!< FS slave transmit - Data byte sent, positive ACK */ + I2C_ST_MODE_STDANA = 0x17UL, /*!< FS slave transmit - Data byte sent, negative ACK */ + I2C_ST_MODE_SATADP = 0x18UL, /*!< FS slave transmit alert response - Alert response address received, positive ACK */ + I2C_ST_MODE_SATAAP = 0x19UL, /*!< FS slave transmit alert response - Alert response address received after arbitration loss, positive ACK */ + I2C_ST_MODE_SATDAP = 0x1AUL, /*!< FS slave transmit alert response - Alert response data byte sent, positive ACK */ + I2C_ST_MODE_SATDAN = 0x1BUL, /*!< FS slave transmit alert response - Alert response data byte sent, negative ACK */ + I2C_ST_MODE_SSTOP = 0x1CUL, /*!< FS slave - Slave mode stop condition detected */ + I2C_ST_MODE_SGADPA = 0x1DUL, /*!< FS slave - Global call address received, positive ACK */ + I2C_ST_MODE_SDAAPA = 0x1EUL, /*!< FS slave - Global call address received after arbitration loss, positive ACK */ + I2C_ST_MODE_BERROR = 0x1FUL, /*!< General - Bus error detected (invalid start or stop condition */ + I2C_ST_MODE_HMTMCOK = 0x21UL, /*!< HS master - Master code transmitted OK - switched to HS mode */ + I2C_ST_MODE_HRSDONE = 0x22UL, /*!< HS master - Repeated start condition generated */ + I2C_ST_MODE_HIDLARL = 0x23UL, /*!< HS master - Arbitration lost, HS unaddressed slave mode entered */ + I2C_ST_MODE_HMTADPA = 0x24UL, /*!< HS master transmit - Slave address sent, positive ACK */ + I2C_ST_MODE_HMTADNA = 0x25UL, /*!< HS master transmit - Slave address sent, negative ACK */ + I2C_ST_MODE_HMTDAPA = 0x26UL, /*!< HS master transmit - Data byte sent, positive ACK */ + I2C_ST_MODE_HMTDANA = 0x27UL, /*!< HS master transmit - Data byte sent, negative ACK */ + I2C_ST_MODE_HMRADPA = 0x28UL, /*!< HS master receive - Slave address sent, positive ACK */ + I2C_ST_MODE_HMRADNA = 0x29UL, /*!< HS master receive - Slave address sent, negative ACK */ + I2C_ST_MODE_HMRDAPA = 0x2AUL, /*!< HS master receive - Data byte received, positive ACK */ + I2C_ST_MODE_HMRDANA = 0x2BUL, /*!< HS master receive - Data byte received, negative ACK */ + I2C_ST_MODE_HSRADPA = 0x30UL, /*!< HS slave receive - Slave address received, positive ACK */ + I2C_ST_MODE_HSRDAPA = 0x32UL, /*!< HS slave receive - Data byte received, positive ACK */ + I2C_ST_MODE_HSRDANA = 0x33UL, /*!< HS slave receive - Data byte received, negative ACK */ + I2C_ST_MODE_HSTADPA = 0x34UL, /*!< HS slave transmit - Slave address received, positive ACK */ + I2C_ST_MODE_HSTDAPA = 0x36UL, /*!< HS slave transmit - Data byte sent, positive ACK */ + I2C_ST_MODE_HSTDANA = 0x37UL, /*!< HS slave transmit - Data byte sent, negative ACK */ +} I2C_ST_MODE_Enum; + +/*-- CST: Status and control register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t BB :1; /*!< Flag employment bus */ + uint32_t TOCDIV :2; /*!< Coeff. div */ + uint32_t TOERR :1; /*!< Flag error simple bus */ + uint32_t TSDA :1; /*!< Bit test SDA */ + uint32_t TGSCL :1; /*!< Bit switch SCL */ + uint32_t PECNEXT :1; /*!< Bit control transmit CRC */ + uint32_t PECFAULT :1; /*!< Error flag */ +} _I2C_CST_bits; + +/* Bit field positions: */ +#define I2C_CST_BB_Pos 0 /*!< Flag employment bus */ +#define I2C_CST_TOCDIV_Pos 1 /*!< Coeff. div */ +#define I2C_CST_TOERR_Pos 3 /*!< Flag error simple bus */ +#define I2C_CST_TSDA_Pos 4 /*!< Bit test SDA */ +#define I2C_CST_TGSCL_Pos 5 /*!< Bit switch SCL */ +#define I2C_CST_PECNEXT_Pos 6 /*!< Bit control transmit CRC */ +#define I2C_CST_PECFAULT_Pos 7 /*!< Error flag */ + +/* Bit field masks: */ +#define I2C_CST_BB_Msk 0x00000001UL /*!< Flag employment bus */ +#define I2C_CST_TOCDIV_Msk 0x00000006UL /*!< Coeff. div */ +#define I2C_CST_TOERR_Msk 0x00000008UL /*!< Flag error simple bus */ +#define I2C_CST_TSDA_Msk 0x00000010UL /*!< Bit test SDA */ +#define I2C_CST_TGSCL_Msk 0x00000020UL /*!< Bit switch SCL */ +#define I2C_CST_PECNEXT_Msk 0x00000040UL /*!< Bit control transmit CRC */ +#define I2C_CST_PECFAULT_Msk 0x00000080UL /*!< Error flag */ + +/* Bit field enums: */ +typedef enum { + I2C_CST_TOCDIV_Disable = 0x0UL, /*!< disable clock */ + I2C_CST_TOCDIV_Div4 = 0x1UL, /*!< clock divided by 4 */ + I2C_CST_TOCDIV_Div8 = 0x2UL, /*!< clock divided by 8 */ + I2C_CST_TOCDIV_Div16 = 0x3UL, /*!< clock divided by 16 */ +} I2C_CST_TOCDIV_Enum; + +/*-- CTL0: Control register 0 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t START :1; /*!< Start bit */ + uint32_t STOP :1; /*!< Stop bit */ + uint32_t INTEN :1; /*!< Interrupt enable bit */ + uint32_t :1; /*!< RESERVED */ + uint32_t ACK :1; /*!< Acknowledgment bit reception */ + uint32_t GCMEN :1; /*!< Control bit part a response to the general call address */ + uint32_t SMBARE :1; /*!< Control bit part a response to the response address */ + uint32_t CLRST :1; /*!< Bit reset flag interrupt */ +} _I2C_CTL0_bits; + +/* Bit field positions: */ +#define I2C_CTL0_START_Pos 0 /*!< Start bit */ +#define I2C_CTL0_STOP_Pos 1 /*!< Stop bit */ +#define I2C_CTL0_INTEN_Pos 2 /*!< Interrupt enable bit */ +#define I2C_CTL0_ACK_Pos 4 /*!< Acknowledgment bit reception */ +#define I2C_CTL0_GCMEN_Pos 5 /*!< Control bit part a response to the general call address */ +#define I2C_CTL0_SMBARE_Pos 6 /*!< Control bit part a response to the response address */ +#define I2C_CTL0_CLRST_Pos 7 /*!< Bit reset flag interrupt */ + +/* Bit field masks: */ +#define I2C_CTL0_START_Msk 0x00000001UL /*!< Start bit */ +#define I2C_CTL0_STOP_Msk 0x00000002UL /*!< Stop bit */ +#define I2C_CTL0_INTEN_Msk 0x00000004UL /*!< Interrupt enable bit */ +#define I2C_CTL0_ACK_Msk 0x00000010UL /*!< Acknowledgment bit reception */ +#define I2C_CTL0_GCMEN_Msk 0x00000020UL /*!< Control bit part a response to the general call address */ +#define I2C_CTL0_SMBARE_Msk 0x00000040UL /*!< Control bit part a response to the response address */ +#define I2C_CTL0_CLRST_Msk 0x00000080UL /*!< Bit reset flag interrupt */ + +/*-- ADDR: Register own address ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t ADDR :7; /*!< Own 7-bit address */ + uint32_t SAEN :1; /*!< Enable bit address recognition */ +} _I2C_ADDR_bits; + +/* Bit field positions: */ +#define I2C_ADDR_ADDR_Pos 0 /*!< Own 7-bit address */ +#define I2C_ADDR_SAEN_Pos 7 /*!< Enable bit address recognition */ + +/* Bit field masks: */ +#define I2C_ADDR_ADDR_Msk 0x0000007FUL /*!< Own 7-bit address */ +#define I2C_ADDR_SAEN_Msk 0x00000080UL /*!< Enable bit address recognition */ + +/*-- CTL1: Control register 1 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t ENABLE :1; /*!< Enable I2C */ + uint32_t SCLFRQ :7; /*!< Field frequency selection signal at pin SCL in master mode (bits [6:0]) */ +} _I2C_CTL1_bits; + +/* Bit field positions: */ +#define I2C_CTL1_ENABLE_Pos 0 /*!< Enable I2C */ +#define I2C_CTL1_SCLFRQ_Pos 1 /*!< Field frequency selection signal at pin SCL in master mode (bits [6:0]) */ + +/* Bit field masks: */ +#define I2C_CTL1_ENABLE_Msk 0x00000001UL /*!< Enable I2C */ +#define I2C_CTL1_SCLFRQ_Msk 0x000000FEUL /*!< Field frequency selection signal at pin SCL in master mode (bits [6:0]) */ + +/*-- TOPR: Prescaler load register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t SMBTOPR :8; /*!< Prescaler reload value field */ +} _I2C_TOPR_bits; + +/* Bit field positions: */ +#define I2C_TOPR_SMBTOPR_Pos 0 /*!< Prescaler reload value field */ + +/* Bit field masks: */ +#define I2C_TOPR_SMBTOPR_Msk 0x000000FFUL /*!< Prescaler reload value field */ + +/*-- CTL2: Control register 2 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t S10ADR :3; /*!< Upper bits of 10-bit slave address */ + uint32_t S10EN :1; /*!< Bit enabled 10-bit addressing slave */ + uint32_t HSDIV :4; /*!< Field frequency selection signal at pin SCL in HS master mode (bits [3:0]) */ +} _I2C_CTL2_bits; + +/* Bit field positions: */ +#define I2C_CTL2_S10ADR_Pos 0 /*!< Upper bits of 10-bit slave address */ +#define I2C_CTL2_S10EN_Pos 3 /*!< Bit enabled 10-bit addressing slave */ +#define I2C_CTL2_HSDIV_Pos 4 /*!< Field frequency selection signal at pin SCL in HS master mode (bits [3:0]) */ + +/* Bit field masks: */ +#define I2C_CTL2_S10ADR_Msk 0x00000007UL /*!< Upper bits of 10-bit slave address */ +#define I2C_CTL2_S10EN_Msk 0x00000008UL /*!< Bit enabled 10-bit addressing slave */ +#define I2C_CTL2_HSDIV_Msk 0x000000F0UL /*!< Field frequency selection signal at pin SCL in HS master mode (bits [3:0]) */ + +/*-- CTL3: Control register 3 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t SCLFRQ :8; /*!< Field frequency selection signal at pin SCL in master mode (bits [14:7]) */ +} _I2C_CTL3_bits; + +/* Bit field positions: */ +#define I2C_CTL3_SCLFRQ_Pos 0 /*!< Field frequency selection signal at pin SCL in master mode (bits [14:7]) */ + +/* Bit field masks: */ +#define I2C_CTL3_SCLFRQ_Msk 0x000000FFUL /*!< Field frequency selection signal at pin SCL in master mode (bits [14:7]) */ + +/*-- CTL4: Control Register 4 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t HSDIV :8; /*!< Field frequency selection signal at pin SCL in HS master mode (bits [11:4]) */ +} _I2C_CTL4_bits; + +/* Bit field positions: */ +#define I2C_CTL4_HSDIV_Pos 0 /*!< Field frequency selection signal at pin SCL in HS master mode (bits [11:4]) */ + +/* Bit field masks: */ +#define I2C_CTL4_HSDIV_Msk 0x000000FFUL /*!< Field frequency selection signal at pin SCL in HS master mode (bits [11:4]) */ + +typedef struct { + union { /*!< Data register */ + __IO uint32_t SDA; /*!< SDA : type used for word access */ + __IO _I2C_SDA_bits SDA_bit; /*!< SDA_bit: structure used for bit access */ + }; + union { /*!< Status register */ + __O uint32_t ST; /*!< ST : type used for word access */ + __O _I2C_ST_bits ST_bit; /*!< ST_bit: structure used for bit access */ + }; + union { /*!< Status and control register */ + __IO uint32_t CST; /*!< CST : type used for word access */ + __IO _I2C_CST_bits CST_bit; /*!< CST_bit: structure used for bit access */ + }; + union { /*!< Control register 0 */ + __IO uint32_t CTL0; /*!< CTL0 : type used for word access */ + __IO _I2C_CTL0_bits CTL0_bit; /*!< CTL0_bit: structure used for bit access */ + }; + union { /*!< Register own address */ + __IO uint32_t ADDR; /*!< ADDR : type used for word access */ + __IO _I2C_ADDR_bits ADDR_bit; /*!< ADDR_bit: structure used for bit access */ + }; + union { /*!< Control register 1 */ + __IO uint32_t CTL1; /*!< CTL1 : type used for word access */ + __IO _I2C_CTL1_bits CTL1_bit; /*!< CTL1_bit: structure used for bit access */ + }; + union { /*!< Prescaler load register */ + __IO uint32_t TOPR; /*!< TOPR : type used for word access */ + __IO _I2C_TOPR_bits TOPR_bit; /*!< TOPR_bit: structure used for bit access */ + }; + union { /*!< Control register 2 */ + __IO uint32_t CTL2; /*!< CTL2 : type used for word access */ + __IO _I2C_CTL2_bits CTL2_bit; /*!< CTL2_bit: structure used for bit access */ + }; + union { /*!< Control register 3 */ + __IO uint32_t CTL3; /*!< CTL3 : type used for word access */ + __IO _I2C_CTL3_bits CTL3_bit; /*!< CTL3_bit: structure used for bit access */ + }; + union { /*!< Control Register 4 */ + __IO uint32_t CTL4; /*!< CTL4 : type used for word access */ + __IO _I2C_CTL4_bits CTL4_bit; /*!< CTL4_bit: structure used for bit access */ + }; +} I2C_TypeDef; + + +/******************************************************************************/ +/* ECAP registers */ +/******************************************************************************/ + +/*-- TSCTR: Counter register ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Counter value */ +} _ECAP_TSCTR_bits; + +/* Bit field positions: */ +#define ECAP_TSCTR_VAL_Pos 0 /*!< Counter value */ + +/* Bit field masks: */ +#define ECAP_TSCTR_VAL_Msk 0xFFFFFFFFUL /*!< Counter value */ + +/*-- CTRPHS: Counter Phase Sync register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _ECAP_CTRPHS_bits; + +/* Bit field positions: */ +#define ECAP_CTRPHS_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define ECAP_CTRPHS_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- CAP0: Capture register 0 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Capture 0 value */ +} _ECAP_CAP0_bits; + +/* Bit field positions: */ +#define ECAP_CAP0_VAL_Pos 0 /*!< Capture 0 value */ + +/* Bit field masks: */ +#define ECAP_CAP0_VAL_Msk 0xFFFFFFFFUL /*!< Capture 0 value */ + +/*-- PRD: Period register ------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Period value in APWM mode */ +} _ECAP_PRD_bits; + +/* Bit field positions: */ +#define ECAP_PRD_VAL_Pos 0 /*!< Period value in APWM mode */ + +/* Bit field masks: */ +#define ECAP_PRD_VAL_Msk 0xFFFFFFFFUL /*!< Period value in APWM mode */ + +/*-- CAP1: Capture register 1 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Capture 1 value */ +} _ECAP_CAP1_bits; + +/* Bit field positions: */ +#define ECAP_CAP1_VAL_Pos 0 /*!< Capture 1 value */ + +/* Bit field masks: */ +#define ECAP_CAP1_VAL_Msk 0xFFFFFFFFUL /*!< Capture 1 value */ + +/*-- CMP: Compare register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Compare value in APWM mode */ +} _ECAP_CMP_bits; + +/* Bit field positions: */ +#define ECAP_CMP_VAL_Pos 0 /*!< Compare value in APWM mode */ + +/* Bit field masks: */ +#define ECAP_CMP_VAL_Msk 0xFFFFFFFFUL /*!< Compare value in APWM mode */ + +/*-- CAP2: Capture register 2 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Capture 2 value */ +} _ECAP_CAP2_bits; + +/* Bit field positions: */ +#define ECAP_CAP2_VAL_Pos 0 /*!< Capture 2 value */ + +/* Bit field masks: */ +#define ECAP_CAP2_VAL_Msk 0xFFFFFFFFUL /*!< Capture 2 value */ + +/*-- PRDSHDW: Period shadow register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Period shadow value in APWM mode */ +} _ECAP_PRDSHDW_bits; + +/* Bit field positions: */ +#define ECAP_PRDSHDW_VAL_Pos 0 /*!< Period shadow value in APWM mode */ + +/* Bit field masks: */ +#define ECAP_PRDSHDW_VAL_Msk 0xFFFFFFFFUL /*!< Period shadow value in APWM mode */ + +/*-- CAP3: Capture register 3 --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Capture 3 value */ +} _ECAP_CAP3_bits; + +/* Bit field positions: */ +#define ECAP_CAP3_VAL_Pos 0 /*!< Capture 3 value */ + +/* Bit field masks: */ +#define ECAP_CAP3_VAL_Msk 0xFFFFFFFFUL /*!< Capture 3 value */ + +/*-- CMPSHDW: Compare shadow register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Compare shadow value in APWM mode */ +} _ECAP_CMPSHDW_bits; + +/* Bit field positions: */ +#define ECAP_CMPSHDW_VAL_Pos 0 /*!< Compare shadow value in APWM mode */ + +/* Bit field masks: */ +#define ECAP_CMPSHDW_VAL_Msk 0xFFFFFFFFUL /*!< Compare shadow value in APWM mode */ + +/*-- ECCTL0: Capture control register 0 ---------------------------------------------------------------------*/ +typedef struct { + uint32_t CAP0POL :1; /*!< Polarity select for capture 0 */ + uint32_t CTRRST0 :1; /*!< Reset counter after event 0 */ + uint32_t CAP1POL :1; /*!< Polarity select for capture 1 */ + uint32_t CTRRST1 :1; /*!< Reset counter after event 1 */ + uint32_t CAP2POL :1; /*!< Polarity select for capture 2 */ + uint32_t CTRRST2 :1; /*!< Reset counter after event 2 */ + uint32_t CAP3POL :1; /*!< Polarity select for capture 3 */ + uint32_t CTRRST3 :1; /*!< Reset counter after event 3 */ + uint32_t CAPLDEN :1; /*!< enable capture */ + uint32_t PRESCALE :5; /*!< Prescaler value */ + uint32_t FREESOFT :2; /*!< Emulation mode control */ +} _ECAP_ECCTL0_bits; + +/* Bit field positions: */ +#define ECAP_ECCTL0_CAP0POL_Pos 0 /*!< Polarity select for capture 0 */ +#define ECAP_ECCTL0_CTRRST0_Pos 1 /*!< Reset counter after event 0 */ +#define ECAP_ECCTL0_CAP1POL_Pos 2 /*!< Polarity select for capture 1 */ +#define ECAP_ECCTL0_CTRRST1_Pos 3 /*!< Reset counter after event 1 */ +#define ECAP_ECCTL0_CAP2POL_Pos 4 /*!< Polarity select for capture 2 */ +#define ECAP_ECCTL0_CTRRST2_Pos 5 /*!< Reset counter after event 2 */ +#define ECAP_ECCTL0_CAP3POL_Pos 6 /*!< Polarity select for capture 3 */ +#define ECAP_ECCTL0_CTRRST3_Pos 7 /*!< Reset counter after event 3 */ +#define ECAP_ECCTL0_CAPLDEN_Pos 8 /*!< enable capture */ +#define ECAP_ECCTL0_PRESCALE_Pos 9 /*!< Prescaler value */ +#define ECAP_ECCTL0_FREESOFT_Pos 14 /*!< Emulation mode control */ + +/* Bit field masks: */ +#define ECAP_ECCTL0_CAP0POL_Msk 0x00000001UL /*!< Polarity select for capture 0 */ +#define ECAP_ECCTL0_CTRRST0_Msk 0x00000002UL /*!< Reset counter after event 0 */ +#define ECAP_ECCTL0_CAP1POL_Msk 0x00000004UL /*!< Polarity select for capture 1 */ +#define ECAP_ECCTL0_CTRRST1_Msk 0x00000008UL /*!< Reset counter after event 1 */ +#define ECAP_ECCTL0_CAP2POL_Msk 0x00000010UL /*!< Polarity select for capture 2 */ +#define ECAP_ECCTL0_CTRRST2_Msk 0x00000020UL /*!< Reset counter after event 2 */ +#define ECAP_ECCTL0_CAP3POL_Msk 0x00000040UL /*!< Polarity select for capture 3 */ +#define ECAP_ECCTL0_CTRRST3_Msk 0x00000080UL /*!< Reset counter after event 3 */ +#define ECAP_ECCTL0_CAPLDEN_Msk 0x00000100UL /*!< enable capture */ +#define ECAP_ECCTL0_PRESCALE_Msk 0x00003E00UL /*!< Prescaler value */ +#define ECAP_ECCTL0_FREESOFT_Msk 0x0000C000UL /*!< Emulation mode control */ + +/* Bit field enums: */ +typedef enum { + ECAP_ECCTL0_FREESOFT_Stop = 0x0UL, /*!< stop timer immedeatelly */ + ECAP_ECCTL0_FREESOFT_StopAtZero = 0x1UL, /*!< stop timer when reach zero */ +} ECAP_ECCTL0_FREESOFT_Enum; + +/*-- ECCTL1: Capture control register 1 ----------------------------------------------------------------------*/ +typedef struct { + uint32_t CONTOST :1; /*!< Capture mode */ + uint32_t STOPWRAP :2; /*!< Stop compare value */ + uint32_t REARM :1; /*!< Reset and enable controller, capture reg load */ + uint32_t TSCTRSTOP :1; /*!< Enable Timer */ + uint32_t SYNCIEN :1; /*!< Sync in enable */ + uint32_t SYNCOSEL :2; /*!< SYNCO source selection */ + uint32_t SWSYNC :1; /*!< Software timers sync */ + uint32_t CAPAPWM :1; /*!< Capture mode or APWM mode */ + uint32_t APWMPOL :1; /*!< High/low level APWM */ +} _ECAP_ECCTL1_bits; + +/* Bit field positions: */ +#define ECAP_ECCTL1_CONTOST_Pos 0 /*!< Capture mode */ +#define ECAP_ECCTL1_STOPWRAP_Pos 1 /*!< Stop compare value */ +#define ECAP_ECCTL1_REARM_Pos 3 /*!< Reset and enable controller, capture reg load */ +#define ECAP_ECCTL1_TSCTRSTOP_Pos 4 /*!< Enable Timer */ +#define ECAP_ECCTL1_SYNCIEN_Pos 5 /*!< Sync in enable */ +#define ECAP_ECCTL1_SYNCOSEL_Pos 6 /*!< SYNCO source selection */ +#define ECAP_ECCTL1_SWSYNC_Pos 8 /*!< Software timers sync */ +#define ECAP_ECCTL1_CAPAPWM_Pos 9 /*!< Capture mode or APWM mode */ +#define ECAP_ECCTL1_APWMPOL_Pos 10 /*!< High/low level APWM */ + +/* Bit field masks: */ +#define ECAP_ECCTL1_CONTOST_Msk 0x00000001UL /*!< Capture mode */ +#define ECAP_ECCTL1_STOPWRAP_Msk 0x00000006UL /*!< Stop compare value */ +#define ECAP_ECCTL1_REARM_Msk 0x00000008UL /*!< Reset and enable controller, capture reg load */ +#define ECAP_ECCTL1_TSCTRSTOP_Msk 0x00000010UL /*!< Enable Timer */ +#define ECAP_ECCTL1_SYNCIEN_Msk 0x00000020UL /*!< Sync in enable */ +#define ECAP_ECCTL1_SYNCOSEL_Msk 0x000000C0UL /*!< SYNCO source selection */ +#define ECAP_ECCTL1_SWSYNC_Msk 0x00000100UL /*!< Software timers sync */ +#define ECAP_ECCTL1_CAPAPWM_Msk 0x00000200UL /*!< Capture mode or APWM mode */ +#define ECAP_ECCTL1_APWMPOL_Msk 0x00000400UL /*!< High/low level APWM */ + +/* Bit field enums: */ +typedef enum { + ECAP_ECCTL1_SYNCOSEL_Bypass = 0x0UL, /*!< sync in connected with sync out */ + ECAP_ECCTL1_SYNCOSEL_CTREqPrd = 0x1UL, /*!< sync out generated when CTR = PRD */ + ECAP_ECCTL1_SYNCOSEL_Disable = 0x2UL, /*!< sync out generate disabled */ +} ECAP_ECCTL1_SYNCOSEL_Enum; + +/*-- ECEINT: Interrupt mask register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t CEVT0 :1; /*!< enable int CEVT0 */ + uint32_t CEVT1 :1; /*!< enable int CEVT1 */ + uint32_t CEVT2 :1; /*!< enable int CEVT2 */ + uint32_t CEVT3 :1; /*!< enable int CEVT3 */ + uint32_t CTROVF :1; /*!< enable int CTR_OVF */ + uint32_t CTRPRD :1; /*!< enable int CTR=PRD */ + uint32_t CTRCMP :1; /*!< enable int CTR=CMP */ +} _ECAP_ECEINT_bits; + +/* Bit field positions: */ +#define ECAP_ECEINT_CEVT0_Pos 1 /*!< enable int CEVT0 */ +#define ECAP_ECEINT_CEVT1_Pos 2 /*!< enable int CEVT1 */ +#define ECAP_ECEINT_CEVT2_Pos 3 /*!< enable int CEVT2 */ +#define ECAP_ECEINT_CEVT3_Pos 4 /*!< enable int CEVT3 */ +#define ECAP_ECEINT_CTROVF_Pos 5 /*!< enable int CTR_OVF */ +#define ECAP_ECEINT_CTRPRD_Pos 6 /*!< enable int CTR=PRD */ +#define ECAP_ECEINT_CTRCMP_Pos 7 /*!< enable int CTR=CMP */ + +/* Bit field masks: */ +#define ECAP_ECEINT_CEVT0_Msk 0x00000002UL /*!< enable int CEVT0 */ +#define ECAP_ECEINT_CEVT1_Msk 0x00000004UL /*!< enable int CEVT1 */ +#define ECAP_ECEINT_CEVT2_Msk 0x00000008UL /*!< enable int CEVT2 */ +#define ECAP_ECEINT_CEVT3_Msk 0x00000010UL /*!< enable int CEVT3 */ +#define ECAP_ECEINT_CTROVF_Msk 0x00000020UL /*!< enable int CTR_OVF */ +#define ECAP_ECEINT_CTRPRD_Msk 0x00000040UL /*!< enable int CTR=PRD */ +#define ECAP_ECEINT_CTRCMP_Msk 0x00000080UL /*!< enable int CTR=CMP */ + +/*-- ECFLG: Interrupt status register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< indicate global interrupt */ + uint32_t CEVT0 :1; /*!< Hap interrupt CEVT0 */ + uint32_t CEVT1 :1; /*!< Hap interrupt CEVT1 */ + uint32_t CEVT2 :1; /*!< Hap interrupt CEVT2 */ + uint32_t CEVT3 :1; /*!< Hap interrupt CEVT3 */ + uint32_t CTROVF :1; /*!< Hap interrupt CTROVF */ + uint32_t CTRPRD :1; /*!< Hap interrupt CTR=PRD */ + uint32_t CTRCMP :1; /*!< Hap interrupt CTR=CMP */ +} _ECAP_ECFLG_bits; + +/* Bit field positions: */ +#define ECAP_ECFLG_INT_Pos 0 /*!< indicate global interrupt */ +#define ECAP_ECFLG_CEVT0_Pos 1 /*!< Hap interrupt CEVT0 */ +#define ECAP_ECFLG_CEVT1_Pos 2 /*!< Hap interrupt CEVT1 */ +#define ECAP_ECFLG_CEVT2_Pos 3 /*!< Hap interrupt CEVT2 */ +#define ECAP_ECFLG_CEVT3_Pos 4 /*!< Hap interrupt CEVT3 */ +#define ECAP_ECFLG_CTROVF_Pos 5 /*!< Hap interrupt CTROVF */ +#define ECAP_ECFLG_CTRPRD_Pos 6 /*!< Hap interrupt CTR=PRD */ +#define ECAP_ECFLG_CTRCMP_Pos 7 /*!< Hap interrupt CTR=CMP */ + +/* Bit field masks: */ +#define ECAP_ECFLG_INT_Msk 0x00000001UL /*!< indicate global interrupt */ +#define ECAP_ECFLG_CEVT0_Msk 0x00000002UL /*!< Hap interrupt CEVT0 */ +#define ECAP_ECFLG_CEVT1_Msk 0x00000004UL /*!< Hap interrupt CEVT1 */ +#define ECAP_ECFLG_CEVT2_Msk 0x00000008UL /*!< Hap interrupt CEVT2 */ +#define ECAP_ECFLG_CEVT3_Msk 0x00000010UL /*!< Hap interrupt CEVT3 */ +#define ECAP_ECFLG_CTROVF_Msk 0x00000020UL /*!< Hap interrupt CTROVF */ +#define ECAP_ECFLG_CTRPRD_Msk 0x00000040UL /*!< Hap interrupt CTR=PRD */ +#define ECAP_ECFLG_CTRCMP_Msk 0x00000080UL /*!< Hap interrupt CTR=CMP */ + +/*-- ECCLR: Clear interrupt register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< reset global interrupt */ + uint32_t CEVT0 :1; /*!< reset intstatus */ + uint32_t CEVT1 :1; /*!< reset intstatus */ + uint32_t CEVT2 :1; /*!< reset intstatus */ + uint32_t CEVT3 :1; /*!< reset intstatus */ + uint32_t CTROVF :1; /*!< reset intstatus */ + uint32_t CTRPRD :1; /*!< reset intstatus */ + uint32_t CTRCMP :1; /*!< reset intstatus */ +} _ECAP_ECCLR_bits; + +/* Bit field positions: */ +#define ECAP_ECCLR_INT_Pos 0 /*!< reset global interrupt */ +#define ECAP_ECCLR_CEVT0_Pos 1 /*!< reset intstatus */ +#define ECAP_ECCLR_CEVT1_Pos 2 /*!< reset intstatus */ +#define ECAP_ECCLR_CEVT2_Pos 3 /*!< reset intstatus */ +#define ECAP_ECCLR_CEVT3_Pos 4 /*!< reset intstatus */ +#define ECAP_ECCLR_CTROVF_Pos 5 /*!< reset intstatus */ +#define ECAP_ECCLR_CTRPRD_Pos 6 /*!< reset intstatus */ +#define ECAP_ECCLR_CTRCMP_Pos 7 /*!< reset intstatus */ + +/* Bit field masks: */ +#define ECAP_ECCLR_INT_Msk 0x00000001UL /*!< reset global interrupt */ +#define ECAP_ECCLR_CEVT0_Msk 0x00000002UL /*!< reset intstatus */ +#define ECAP_ECCLR_CEVT1_Msk 0x00000004UL /*!< reset intstatus */ +#define ECAP_ECCLR_CEVT2_Msk 0x00000008UL /*!< reset intstatus */ +#define ECAP_ECCLR_CEVT3_Msk 0x00000010UL /*!< reset intstatus */ +#define ECAP_ECCLR_CTROVF_Msk 0x00000020UL /*!< reset intstatus */ +#define ECAP_ECCLR_CTRPRD_Msk 0x00000040UL /*!< reset intstatus */ +#define ECAP_ECCLR_CTRCMP_Msk 0x00000080UL /*!< reset intstatus */ + +/*-- ECFRC: Force interrupt register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t CEVT0 :1; /*!< gen test interrupt */ + uint32_t CEVT1 :1; /*!< gen test interrupt */ + uint32_t CEVT2 :1; /*!< gen test interrupt */ + uint32_t CEVT3 :1; /*!< gen test interrupt */ + uint32_t CTROVF :1; /*!< gen test interrupt */ + uint32_t CTRPRD :1; /*!< gen test interrupt */ + uint32_t CTRCMP :1; /*!< gen test interrupt */ +} _ECAP_ECFRC_bits; + +/* Bit field positions: */ +#define ECAP_ECFRC_CEVT0_Pos 1 /*!< gen test interrupt */ +#define ECAP_ECFRC_CEVT1_Pos 2 /*!< gen test interrupt */ +#define ECAP_ECFRC_CEVT2_Pos 3 /*!< gen test interrupt */ +#define ECAP_ECFRC_CEVT3_Pos 4 /*!< gen test interrupt */ +#define ECAP_ECFRC_CTROVF_Pos 5 /*!< gen test interrupt */ +#define ECAP_ECFRC_CTRPRD_Pos 6 /*!< gen test interrupt */ +#define ECAP_ECFRC_CTRCMP_Pos 7 /*!< gen test interrupt */ + +/* Bit field masks: */ +#define ECAP_ECFRC_CEVT0_Msk 0x00000002UL /*!< gen test interrupt */ +#define ECAP_ECFRC_CEVT1_Msk 0x00000004UL /*!< gen test interrupt */ +#define ECAP_ECFRC_CEVT2_Msk 0x00000008UL /*!< gen test interrupt */ +#define ECAP_ECFRC_CEVT3_Msk 0x00000010UL /*!< gen test interrupt */ +#define ECAP_ECFRC_CTROVF_Msk 0x00000020UL /*!< gen test interrupt */ +#define ECAP_ECFRC_CTRPRD_Msk 0x00000040UL /*!< gen test interrupt */ +#define ECAP_ECFRC_CTRCMP_Msk 0x00000080UL /*!< gen test interrupt */ + +/*-- PEINT: Active interrupt status register -----------------------------------------------------------------*/ +typedef struct { + uint32_t PEINT :1; /*!< active interrupt flag */ +} _ECAP_PEINT_bits; + +/* Bit field positions: */ +#define ECAP_PEINT_PEINT_Pos 0 /*!< active interrupt flag */ + +/* Bit field masks: */ +#define ECAP_PEINT_PEINT_Msk 0x00000001UL /*!< active interrupt flag */ + +typedef struct { + union { /*!< Counter register */ + __IO uint32_t TSCTR; /*!< TSCTR : type used for word access */ + __IO _ECAP_TSCTR_bits TSCTR_bit; /*!< TSCTR_bit: structure used for bit access */ + }; + union { /*!< Counter Phase Sync register */ + __IO uint32_t CTRPHS; /*!< CTRPHS : type used for word access */ + __IO _ECAP_CTRPHS_bits CTRPHS_bit; /*!< CTRPHS_bit: structure used for bit access */ + }; + union { + union { /*!< Capture register 0 */ + __IO uint32_t CAP0; /*!< CAP0 : type used for word access */ + __IO _ECAP_CAP0_bits CAP0_bit; /*!< CAP0_bit: structure used for bit access */ + }; + struct { + union { /*!< Period register */ + __IO uint32_t PRD; /*!< PRD : type used for word access */ + __IO _ECAP_PRD_bits PRD_bit; /*!< PRD_bit: structure used for bit access */ + }; + }; + }; + union { + union { /*!< Capture register 1 */ + __IO uint32_t CAP1; /*!< CAP1 : type used for word access */ + __IO _ECAP_CAP1_bits CAP1_bit; /*!< CAP1_bit: structure used for bit access */ + }; + struct { + union { /*!< Compare register */ + __IO uint32_t CMP; /*!< CMP : type used for word access */ + __IO _ECAP_CMP_bits CMP_bit; /*!< CMP_bit: structure used for bit access */ + }; + }; + }; + union { + union { /*!< Capture register 2 */ + __IO uint32_t CAP2; /*!< CAP2 : type used for word access */ + __IO _ECAP_CAP2_bits CAP2_bit; /*!< CAP2_bit: structure used for bit access */ + }; + struct { + union { /*!< Period shadow register */ + __IO uint32_t PRDSHDW; /*!< PRDSHDW : type used for word access */ + __IO _ECAP_PRDSHDW_bits PRDSHDW_bit; /*!< PRDSHDW_bit: structure used for bit access */ + }; + }; + }; + union { + union { /*!< Capture register 3 */ + __IO uint32_t CAP3; /*!< CAP3 : type used for word access */ + __IO _ECAP_CAP3_bits CAP3_bit; /*!< CAP3_bit: structure used for bit access */ + }; + struct { + union { /*!< Compare shadow register */ + __IO uint32_t CMPSHDW; /*!< CMPSHDW : type used for word access */ + __IO _ECAP_CMPSHDW_bits CMPSHDW_bit; /*!< CMPSHDW_bit: structure used for bit access */ + }; + }; + }; + __IO uint32_t Reserved0[4]; + union { /*!< Capture control register 0 */ + __IO uint32_t ECCTL0; /*!< ECCTL0 : type used for word access */ + __IO _ECAP_ECCTL0_bits ECCTL0_bit; /*!< ECCTL0_bit: structure used for bit access */ + }; + union { /*!< Capture control register 1 */ + __IO uint32_t ECCTL1; /*!< ECCTL1 : type used for word access */ + __IO _ECAP_ECCTL1_bits ECCTL1_bit; /*!< ECCTL1_bit: structure used for bit access */ + }; + union { /*!< Interrupt mask register */ + __IO uint32_t ECEINT; /*!< ECEINT : type used for word access */ + __IO _ECAP_ECEINT_bits ECEINT_bit; /*!< ECEINT_bit: structure used for bit access */ + }; + union { /*!< Interrupt status register */ + __I uint32_t ECFLG; /*!< ECFLG : type used for word access */ + __I _ECAP_ECFLG_bits ECFLG_bit; /*!< ECFLG_bit: structure used for bit access */ + }; + union { /*!< Clear interrupt register */ + __O uint32_t ECCLR; /*!< ECCLR : type used for word access */ + __O _ECAP_ECCLR_bits ECCLR_bit; /*!< ECCLR_bit: structure used for bit access */ + }; + union { /*!< Force interrupt register */ + __O uint32_t ECFRC; /*!< ECFRC : type used for word access */ + __O _ECAP_ECFRC_bits ECFRC_bit; /*!< ECFRC_bit: structure used for bit access */ + }; + union { /*!< Active interrupt status register */ + __IO uint32_t PEINT; /*!< PEINT : type used for word access */ + __IO _ECAP_PEINT_bits PEINT_bit; /*!< PEINT_bit: structure used for bit access */ + }; +} ECAP_TypeDef; + + +/******************************************************************************/ +/* QEP registers */ +/******************************************************************************/ + +/*-- QPOSCNT: Position Counter register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSCNT_bits; + +/* Bit field positions: */ +#define QEP_QPOSCNT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSCNT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QPOSINIT: Position Counter Initialization register ------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSINIT_bits; + +/* Bit field positions: */ +#define QEP_QPOSINIT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSINIT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QPOSMAX: Maximum Position Count register ----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSMAX_bits; + +/* Bit field positions: */ +#define QEP_QPOSMAX_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSMAX_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QPOSCMP: Position-compare register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSCMP_bits; + +/* Bit field positions: */ +#define QEP_QPOSCMP_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSCMP_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QPOSILAT: Index Position Latch register -----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSILAT_bits; + +/* Bit field positions: */ +#define QEP_QPOSILAT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSILAT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QPOSSLAT: Strobe Position Latch register ----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSSLAT_bits; + +/* Bit field positions: */ +#define QEP_QPOSSLAT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSSLAT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QPOSLAT: Position Counter Latch register ----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QPOSLAT_bits; + +/* Bit field positions: */ +#define QEP_QPOSLAT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QPOSLAT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QUTMR: Unit Timer register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QUTMR_bits; + +/* Bit field positions: */ +#define QEP_QUTMR_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QUTMR_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QUPRD: Unit Period register -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QUPRD_bits; + +/* Bit field positions: */ +#define QEP_QUPRD_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QUPRD_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QWDTMR: Watchdog Timer register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QWDTMR_bits; + +/* Bit field positions: */ +#define QEP_QWDTMR_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QWDTMR_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QWDPRD: Watchdog Period register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QWDPRD_bits; + +/* Bit field positions: */ +#define QEP_QWDPRD_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QWDPRD_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QDECCTL: Decoder Control register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t :5; /*!< RESERVED */ + uint32_t QSP :1; /*!< QEPS input polarity */ + uint32_t QIP :1; /*!< QEPI input polarity */ + uint32_t QBP :1; /*!< QEPB input polarity */ + uint32_t QAP :1; /*!< QEPA input polarity */ + uint32_t IGATE :1; /*!< Index pulse gating option */ + uint32_t SWAP :1; /*!< Swap quadrature clock inputs */ + uint32_t XCR :1; /*!< External clock rate */ + uint32_t SPSEL :1; /*!< Sync output pin selection */ + uint32_t SOEN :1; /*!< Sync output-enable */ + uint32_t QSRC :2; /*!< Position-counter source selection */ +} _QEP_QDECCTL_bits; + +/* Bit field positions: */ +#define QEP_QDECCTL_QSP_Pos 5 /*!< QEPS input polarity */ +#define QEP_QDECCTL_QIP_Pos 6 /*!< QEPI input polarity */ +#define QEP_QDECCTL_QBP_Pos 7 /*!< QEPB input polarity */ +#define QEP_QDECCTL_QAP_Pos 8 /*!< QEPA input polarity */ +#define QEP_QDECCTL_IGATE_Pos 9 /*!< Index pulse gating option */ +#define QEP_QDECCTL_SWAP_Pos 10 /*!< Swap quadrature clock inputs */ +#define QEP_QDECCTL_XCR_Pos 11 /*!< External clock rate */ +#define QEP_QDECCTL_SPSEL_Pos 12 /*!< Sync output pin selection */ +#define QEP_QDECCTL_SOEN_Pos 13 /*!< Sync output-enable */ +#define QEP_QDECCTL_QSRC_Pos 14 /*!< Position-counter source selection */ + +/* Bit field masks: */ +#define QEP_QDECCTL_QSP_Msk 0x00000020UL /*!< QEPS input polarity */ +#define QEP_QDECCTL_QIP_Msk 0x00000040UL /*!< QEPI input polarity */ +#define QEP_QDECCTL_QBP_Msk 0x00000080UL /*!< QEPB input polarity */ +#define QEP_QDECCTL_QAP_Msk 0x00000100UL /*!< QEPA input polarity */ +#define QEP_QDECCTL_IGATE_Msk 0x00000200UL /*!< Index pulse gating option */ +#define QEP_QDECCTL_SWAP_Msk 0x00000400UL /*!< Swap quadrature clock inputs */ +#define QEP_QDECCTL_XCR_Msk 0x00000800UL /*!< External clock rate */ +#define QEP_QDECCTL_SPSEL_Msk 0x00001000UL /*!< Sync output pin selection */ +#define QEP_QDECCTL_SOEN_Msk 0x00002000UL /*!< Sync output-enable */ +#define QEP_QDECCTL_QSRC_Msk 0x0000C000UL /*!< Position-counter source selection */ + +/* Bit field enums: */ +typedef enum { + QEP_QDECCTL_QSRC_Quad = 0x0UL, /*!< quadrature mode */ + QEP_QDECCTL_QSRC_CountDir = 0x1UL, /*!< count/direction mode */ + QEP_QDECCTL_QSRC_Up = 0x2UL, /*!< count up */ + QEP_QDECCTL_QSRC_Down = 0x3UL, /*!< count down */ +} QEP_QDECCTL_QSRC_Enum; + +/*-- QEPCTL: Control register --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t WDE :1; /*!< QEP watchdog enable */ + uint32_t UTE :1; /*!< QEP unit timer enable */ + uint32_t QCLM :1; /*!< QEP capture latch mode */ + uint32_t QPEN :1; /*!< Quadrature position counter enable/software reset */ + uint32_t IEL :2; /*!< Index event latch of position counter (software index marker) */ + uint32_t SEL :1; /*!< Strobe event latch of position counter */ + uint32_t SWI :1; /*!< Software initialization of position counter */ + uint32_t IEI :2; /*!< Index event initialization of position counter */ + uint32_t SEI :2; /*!< Strobe event initialization of position counter */ + uint32_t PCRM :2; /*!< Position counter reset mode */ + uint32_t FREESOFT :2; /*!< Emulation Control Bits */ +} _QEP_QEPCTL_bits; + +/* Bit field positions: */ +#define QEP_QEPCTL_WDE_Pos 0 /*!< QEP watchdog enable */ +#define QEP_QEPCTL_UTE_Pos 1 /*!< QEP unit timer enable */ +#define QEP_QEPCTL_QCLM_Pos 2 /*!< QEP capture latch mode */ +#define QEP_QEPCTL_QPEN_Pos 3 /*!< Quadrature position counter enable/software reset */ +#define QEP_QEPCTL_IEL_Pos 4 /*!< Index event latch of position counter (software index marker) */ +#define QEP_QEPCTL_SEL_Pos 6 /*!< Strobe event latch of position counter */ +#define QEP_QEPCTL_SWI_Pos 7 /*!< Software initialization of position counter */ +#define QEP_QEPCTL_IEI_Pos 8 /*!< Index event initialization of position counter */ +#define QEP_QEPCTL_SEI_Pos 10 /*!< Strobe event initialization of position counter */ +#define QEP_QEPCTL_PCRM_Pos 12 /*!< Position counter reset mode */ +#define QEP_QEPCTL_FREESOFT_Pos 14 /*!< Emulation Control Bits */ + +/* Bit field masks: */ +#define QEP_QEPCTL_WDE_Msk 0x00000001UL /*!< QEP watchdog enable */ +#define QEP_QEPCTL_UTE_Msk 0x00000002UL /*!< QEP unit timer enable */ +#define QEP_QEPCTL_QCLM_Msk 0x00000004UL /*!< QEP capture latch mode */ +#define QEP_QEPCTL_QPEN_Msk 0x00000008UL /*!< Quadrature position counter enable/software reset */ +#define QEP_QEPCTL_IEL_Msk 0x00000030UL /*!< Index event latch of position counter (software index marker) */ +#define QEP_QEPCTL_SEL_Msk 0x00000040UL /*!< Strobe event latch of position counter */ +#define QEP_QEPCTL_SWI_Msk 0x00000080UL /*!< Software initialization of position counter */ +#define QEP_QEPCTL_IEI_Msk 0x00000300UL /*!< Index event initialization of position counter */ +#define QEP_QEPCTL_SEI_Msk 0x00000C00UL /*!< Strobe event initialization of position counter */ +#define QEP_QEPCTL_PCRM_Msk 0x00003000UL /*!< Position counter reset mode */ +#define QEP_QEPCTL_FREESOFT_Msk 0x0000C000UL /*!< Emulation Control Bits */ + +/* Bit field enums: */ +typedef enum { + QEP_QEPCTL_IEL_NoLatch = 0x0UL, /*!< no position counter latch */ + QEP_QEPCTL_IEL_IndPos = 0x1UL, /*!< latch on index signal posedge */ + QEP_QEPCTL_IEL_IndNeg = 0x2UL, /*!< latch on index signal negedge */ + QEP_QEPCTL_IEL_IndMark = 0x3UL, /*!< latch on index marker */ +} QEP_QEPCTL_IEL_Enum; + +typedef enum { + QEP_QEPCTL_IEI_NoInit = 0x0UL, /*!< no initialization */ + QEP_QEPCTL_IEI_QEPIPos = 0x2UL, /*!< init on posedge QEPI */ + QEP_QEPCTL_IEI_QEPINeg = 0x3UL, /*!< init on negedge QEPI */ +} QEP_QEPCTL_IEI_Enum; + +typedef enum { + QEP_QEPCTL_SEI_NoInit = 0x0UL, /*!< no initialization */ + QEP_QEPCTL_SEI_QEPSPos = 0x2UL, /*!< init on posedge QEPI */ + QEP_QEPCTL_SEI_QEPSDir = 0x3UL, /*!< init depends on direction - on posedge if direction is up, on negedge if direction is down */ +} QEP_QEPCTL_SEI_Enum; + +typedef enum { + QEP_QEPCTL_PCRM_Ind = 0x0UL, /*!< reset on index */ + QEP_QEPCTL_PCRM_PosMax = 0x1UL, /*!< reset on max position count */ + QEP_QEPCTL_PCRM_FirstInd = 0x2UL, /*!< reset on the first index */ + QEP_QEPCTL_PCRM_Time = 0x3UL, /*!< reset on time counter */ +} QEP_QEPCTL_PCRM_Enum; + +typedef enum { + QEP_QEPCTL_FREESOFT_Stop = 0x0UL, /*!< counters are blocked */ + QEP_QEPCTL_FREESOFT_StopAtOvf = 0x1UL, /*!< stop after overflow */ + QEP_QEPCTL_FREESOFT_Free = 0x2UL, /*!< no count stop in debug mode */ +} QEP_QEPCTL_FREESOFT_Enum; + +/*-- QCAPCTL: Capture Control register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t UPPS :4; /*!< Unit position event prescaler */ + uint32_t CCPS :3; /*!< QEP capture timer clock prescaler */ + uint32_t SELEVENT :1; /*!< Reset timer control */ + uint32_t :7; /*!< RESERVED */ + uint32_t CEN :1; /*!< Enable eQEP capture */ + uint32_t EPSLD :1; /*!< Enhanced prescalers load */ +} _QEP_QCAPCTL_bits; + +/* Bit field positions: */ +#define QEP_QCAPCTL_UPPS_Pos 0 /*!< Unit position event prescaler */ +#define QEP_QCAPCTL_CCPS_Pos 4 /*!< QEP capture timer clock prescaler */ +#define QEP_QCAPCTL_SELEVENT_Pos 7 /*!< Reset timer control */ +#define QEP_QCAPCTL_CEN_Pos 15 /*!< Enable eQEP capture */ +#define QEP_QCAPCTL_EPSLD_Pos 16 /*!< Enhanced prescalers load */ + +/* Bit field masks: */ +#define QEP_QCAPCTL_UPPS_Msk 0x0000000FUL /*!< Unit position event prescaler */ +#define QEP_QCAPCTL_CCPS_Msk 0x00000070UL /*!< QEP capture timer clock prescaler */ +#define QEP_QCAPCTL_SELEVENT_Msk 0x00000080UL /*!< Reset timer control */ +#define QEP_QCAPCTL_CEN_Msk 0x00008000UL /*!< Enable eQEP capture */ +#define QEP_QCAPCTL_EPSLD_Msk 0x00010000UL /*!< Enhanced prescalers load */ + +/* Bit field enums: */ +typedef enum { + QEP_QCAPCTL_UPPS_Disable = 0x0UL, /*!< quad signal not divided */ + QEP_QCAPCTL_UPPS_Div2 = 0x1UL, /*!< quad signal divided by 2 */ + QEP_QCAPCTL_UPPS_Div4 = 0x2UL, /*!< quad signal divided by 4 */ + QEP_QCAPCTL_UPPS_Div8 = 0x3UL, /*!< quad signal divided by 8 */ + QEP_QCAPCTL_UPPS_Div16 = 0x4UL, /*!< quad signal divided by 16 */ + QEP_QCAPCTL_UPPS_Div32 = 0x5UL, /*!< quad signal divided by 32 */ + QEP_QCAPCTL_UPPS_Div64 = 0x6UL, /*!< quad signal divided by 64 */ + QEP_QCAPCTL_UPPS_Div128 = 0x7UL, /*!< quad signal divided by 128 */ + QEP_QCAPCTL_UPPS_Div256 = 0x8UL, /*!< quad signal divided by 256 */ + QEP_QCAPCTL_UPPS_Div512 = 0x9UL, /*!< quad signal divided by 512 */ + QEP_QCAPCTL_UPPS_Div1024 = 0xAUL, /*!< quad signal divided by 1024 */ + QEP_QCAPCTL_UPPS_Div2048 = 0xBUL, /*!< quad signal divided by 2048 */ +} QEP_QCAPCTL_UPPS_Enum; + +typedef enum { + QEP_QCAPCTL_CCPS_Disable = 0x0UL, /*!< no divider */ + QEP_QCAPCTL_CCPS_Div2 = 0x1UL, /*!< sysclk divided by 2 */ + QEP_QCAPCTL_CCPS_Div4 = 0x2UL, /*!< sysclk divided by 4 */ + QEP_QCAPCTL_CCPS_Div8 = 0x3UL, /*!< sysclk divided by 8 */ + QEP_QCAPCTL_CCPS_Div16 = 0x4UL, /*!< sysclk divided by 16 */ + QEP_QCAPCTL_CCPS_Div32 = 0x5UL, /*!< sysclk divided by 32 */ + QEP_QCAPCTL_CCPS_Div64 = 0x6UL, /*!< sysclk divided by 64 */ + QEP_QCAPCTL_CCPS_Div128 = 0x7UL, /*!< sysclk divided by 128 */ +} QEP_QCAPCTL_CCPS_Enum; + +/*-- QPOSCTL: Position-compare Control register --------------------------------------------------------------*/ +typedef struct { + uint32_t PCSPW :12; /*!< Select-position-compare sync output pulse width */ + uint32_t PCE :1; /*!< Position-compare enable/disable */ + uint32_t PCPOL :1; /*!< Polarity of sync output */ + uint32_t PCLOAD :1; /*!< Position-compare shadow load mode */ + uint32_t PCSHDW :1; /*!< Position-compare shadow enable */ +} _QEP_QPOSCTL_bits; + +/* Bit field positions: */ +#define QEP_QPOSCTL_PCSPW_Pos 0 /*!< Select-position-compare sync output pulse width */ +#define QEP_QPOSCTL_PCE_Pos 12 /*!< Position-compare enable/disable */ +#define QEP_QPOSCTL_PCPOL_Pos 13 /*!< Polarity of sync output */ +#define QEP_QPOSCTL_PCLOAD_Pos 14 /*!< Position-compare shadow load mode */ +#define QEP_QPOSCTL_PCSHDW_Pos 15 /*!< Position-compare shadow enable */ + +/* Bit field masks: */ +#define QEP_QPOSCTL_PCSPW_Msk 0x00000FFFUL /*!< Select-position-compare sync output pulse width */ +#define QEP_QPOSCTL_PCE_Msk 0x00001000UL /*!< Position-compare enable/disable */ +#define QEP_QPOSCTL_PCPOL_Msk 0x00002000UL /*!< Polarity of sync output */ +#define QEP_QPOSCTL_PCLOAD_Msk 0x00004000UL /*!< Position-compare shadow load mode */ +#define QEP_QPOSCTL_PCSHDW_Msk 0x00008000UL /*!< Position-compare shadow enable */ + +/*-- QEINT: Interrupt Enable register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t PCE :1; /*!< Position counter error interrupt enable */ + uint32_t QPE :1; /*!< Quadrature phase error interrupt enable */ + uint32_t QDC :1; /*!< Quadrature direction change interrupt enable */ + uint32_t WTO :1; /*!< Watchdog time out interrupt enable */ + uint32_t PCU :1; /*!< Position counter underflow interrupt enable */ + uint32_t PCO :1; /*!< Position counter overflow interrupt enable */ + uint32_t PCR :1; /*!< Position-compare ready interrupt enable */ + uint32_t PCM :1; /*!< Position-compare match interrupt enable */ + uint32_t SEL :1; /*!< Strobe event latch interrupt enable */ + uint32_t IEL :1; /*!< Index event latch interrupt enable */ + uint32_t UTO :1; /*!< Unit time out interrupt enable */ +} _QEP_QEINT_bits; + +/* Bit field positions: */ +#define QEP_QEINT_PCE_Pos 1 /*!< Position counter error interrupt enable */ +#define QEP_QEINT_QPE_Pos 2 /*!< Quadrature phase error interrupt enable */ +#define QEP_QEINT_QDC_Pos 3 /*!< Quadrature direction change interrupt enable */ +#define QEP_QEINT_WTO_Pos 4 /*!< Watchdog time out interrupt enable */ +#define QEP_QEINT_PCU_Pos 5 /*!< Position counter underflow interrupt enable */ +#define QEP_QEINT_PCO_Pos 6 /*!< Position counter overflow interrupt enable */ +#define QEP_QEINT_PCR_Pos 7 /*!< Position-compare ready interrupt enable */ +#define QEP_QEINT_PCM_Pos 8 /*!< Position-compare match interrupt enable */ +#define QEP_QEINT_SEL_Pos 9 /*!< Strobe event latch interrupt enable */ +#define QEP_QEINT_IEL_Pos 10 /*!< Index event latch interrupt enable */ +#define QEP_QEINT_UTO_Pos 11 /*!< Unit time out interrupt enable */ + +/* Bit field masks: */ +#define QEP_QEINT_PCE_Msk 0x00000002UL /*!< Position counter error interrupt enable */ +#define QEP_QEINT_QPE_Msk 0x00000004UL /*!< Quadrature phase error interrupt enable */ +#define QEP_QEINT_QDC_Msk 0x00000008UL /*!< Quadrature direction change interrupt enable */ +#define QEP_QEINT_WTO_Msk 0x00000010UL /*!< Watchdog time out interrupt enable */ +#define QEP_QEINT_PCU_Msk 0x00000020UL /*!< Position counter underflow interrupt enable */ +#define QEP_QEINT_PCO_Msk 0x00000040UL /*!< Position counter overflow interrupt enable */ +#define QEP_QEINT_PCR_Msk 0x00000080UL /*!< Position-compare ready interrupt enable */ +#define QEP_QEINT_PCM_Msk 0x00000100UL /*!< Position-compare match interrupt enable */ +#define QEP_QEINT_SEL_Msk 0x00000200UL /*!< Strobe event latch interrupt enable */ +#define QEP_QEINT_IEL_Msk 0x00000400UL /*!< Index event latch interrupt enable */ +#define QEP_QEINT_UTO_Msk 0x00000800UL /*!< Unit time out interrupt enable */ + +/*-- QFLG: Interrupt Flag register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Global interrupt status flag */ + uint32_t PCE :1; /*!< Position counter error interrupt flag */ + uint32_t QPE :1; /*!< Quadrature phase error interrupt flag */ + uint32_t QDC :1; /*!< Quadrature direction change interrupt flag */ + uint32_t WTO :1; /*!< Watchdog timeout interrupt flag */ + uint32_t PCU :1; /*!< Position counter underflow interrupt flag */ + uint32_t PCO :1; /*!< Position counter overflow interrupt flag */ + uint32_t PCR :1; /*!< Position-compare ready interrupt flag */ + uint32_t PCM :1; /*!< QEP compare match event interrupt flag */ + uint32_t SEL :1; /*!< Strobe event latch interrupt flag + */ + uint32_t IEL :1; /*!< Index event latch interrupt flag */ + uint32_t UTO :1; /*!< Unit time out interrupt flag */ + uint32_t :4; /*!< RESERVED */ + uint32_t QFLGLAT :12; /*!< Latches QFLG[11:0] on every QPOSCNT read */ +} _QEP_QFLG_bits; + +/* Bit field positions: */ +#define QEP_QFLG_INT_Pos 0 /*!< Global interrupt status flag */ +#define QEP_QFLG_PCE_Pos 1 /*!< Position counter error interrupt flag */ +#define QEP_QFLG_QPE_Pos 2 /*!< Quadrature phase error interrupt flag */ +#define QEP_QFLG_QDC_Pos 3 /*!< Quadrature direction change interrupt flag */ +#define QEP_QFLG_WTO_Pos 4 /*!< Watchdog timeout interrupt flag */ +#define QEP_QFLG_PCU_Pos 5 /*!< Position counter underflow interrupt flag */ +#define QEP_QFLG_PCO_Pos 6 /*!< Position counter overflow interrupt flag */ +#define QEP_QFLG_PCR_Pos 7 /*!< Position-compare ready interrupt flag */ +#define QEP_QFLG_PCM_Pos 8 /*!< QEP compare match event interrupt flag */ +#define QEP_QFLG_SEL_Pos 9 /*!< Strobe event latch interrupt flag + */ +#define QEP_QFLG_IEL_Pos 10 /*!< Index event latch interrupt flag */ +#define QEP_QFLG_UTO_Pos 11 /*!< Unit time out interrupt flag */ +#define QEP_QFLG_QFLGLAT_Pos 16 /*!< Latches QFLG[11:0] on every QPOSCNT read */ + +/* Bit field masks: */ +#define QEP_QFLG_INT_Msk 0x00000001UL /*!< Global interrupt status flag */ +#define QEP_QFLG_PCE_Msk 0x00000002UL /*!< Position counter error interrupt flag */ +#define QEP_QFLG_QPE_Msk 0x00000004UL /*!< Quadrature phase error interrupt flag */ +#define QEP_QFLG_QDC_Msk 0x00000008UL /*!< Quadrature direction change interrupt flag */ +#define QEP_QFLG_WTO_Msk 0x00000010UL /*!< Watchdog timeout interrupt flag */ +#define QEP_QFLG_PCU_Msk 0x00000020UL /*!< Position counter underflow interrupt flag */ +#define QEP_QFLG_PCO_Msk 0x00000040UL /*!< Position counter overflow interrupt flag */ +#define QEP_QFLG_PCR_Msk 0x00000080UL /*!< Position-compare ready interrupt flag */ +#define QEP_QFLG_PCM_Msk 0x00000100UL /*!< QEP compare match event interrupt flag */ +#define QEP_QFLG_SEL_Msk 0x00000200UL /*!< Strobe event latch interrupt flag + */ +#define QEP_QFLG_IEL_Msk 0x00000400UL /*!< Index event latch interrupt flag */ +#define QEP_QFLG_UTO_Msk 0x00000800UL /*!< Unit time out interrupt flag */ +#define QEP_QFLG_QFLGLAT_Msk 0x0FFF0000UL /*!< Latches QFLG[11:0] on every QPOSCNT read */ + +/*-- QCLR: Interrupt Clear register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Global interrupt clear flag */ + uint32_t PCE :1; /*!< Clear position counter error interrupt flag */ + uint32_t QPE :1; /*!< Clear quadrature phase error interrupt flag */ + uint32_t QDC :1; /*!< Clear quadrature direction change interrupt flag */ + uint32_t WTO :1; /*!< Clear watchdog timeout interrupt flag */ + uint32_t PCU :1; /*!< Clear position counter underflow interrupt flag */ + uint32_t PCO :1; /*!< Clear position counter overflow interrupt flag */ + uint32_t PCR :1; /*!< Clear position-compare ready interrupt flag */ + uint32_t PCM :1; /*!< Clear eQEP compare match event interrupt flag */ + uint32_t SEL :1; /*!< Clear strobe event latch interrupt flag */ + uint32_t IEL :1; /*!< Clear index event latch interrupt flag */ + uint32_t UTO :1; /*!< Clear unit time out interrupt flag */ +} _QEP_QCLR_bits; + +/* Bit field positions: */ +#define QEP_QCLR_INT_Pos 0 /*!< Global interrupt clear flag */ +#define QEP_QCLR_PCE_Pos 1 /*!< Clear position counter error interrupt flag */ +#define QEP_QCLR_QPE_Pos 2 /*!< Clear quadrature phase error interrupt flag */ +#define QEP_QCLR_QDC_Pos 3 /*!< Clear quadrature direction change interrupt flag */ +#define QEP_QCLR_WTO_Pos 4 /*!< Clear watchdog timeout interrupt flag */ +#define QEP_QCLR_PCU_Pos 5 /*!< Clear position counter underflow interrupt flag */ +#define QEP_QCLR_PCO_Pos 6 /*!< Clear position counter overflow interrupt flag */ +#define QEP_QCLR_PCR_Pos 7 /*!< Clear position-compare ready interrupt flag */ +#define QEP_QCLR_PCM_Pos 8 /*!< Clear eQEP compare match event interrupt flag */ +#define QEP_QCLR_SEL_Pos 9 /*!< Clear strobe event latch interrupt flag */ +#define QEP_QCLR_IEL_Pos 10 /*!< Clear index event latch interrupt flag */ +#define QEP_QCLR_UTO_Pos 11 /*!< Clear unit time out interrupt flag */ + +/* Bit field masks: */ +#define QEP_QCLR_INT_Msk 0x00000001UL /*!< Global interrupt clear flag */ +#define QEP_QCLR_PCE_Msk 0x00000002UL /*!< Clear position counter error interrupt flag */ +#define QEP_QCLR_QPE_Msk 0x00000004UL /*!< Clear quadrature phase error interrupt flag */ +#define QEP_QCLR_QDC_Msk 0x00000008UL /*!< Clear quadrature direction change interrupt flag */ +#define QEP_QCLR_WTO_Msk 0x00000010UL /*!< Clear watchdog timeout interrupt flag */ +#define QEP_QCLR_PCU_Msk 0x00000020UL /*!< Clear position counter underflow interrupt flag */ +#define QEP_QCLR_PCO_Msk 0x00000040UL /*!< Clear position counter overflow interrupt flag */ +#define QEP_QCLR_PCR_Msk 0x00000080UL /*!< Clear position-compare ready interrupt flag */ +#define QEP_QCLR_PCM_Msk 0x00000100UL /*!< Clear eQEP compare match event interrupt flag */ +#define QEP_QCLR_SEL_Msk 0x00000200UL /*!< Clear strobe event latch interrupt flag */ +#define QEP_QCLR_IEL_Msk 0x00000400UL /*!< Clear index event latch interrupt flag */ +#define QEP_QCLR_UTO_Msk 0x00000800UL /*!< Clear unit time out interrupt flag */ + +/*-- QFRC: Interrupt Force register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t :1; /*!< RESERVED */ + uint32_t PCE :1; /*!< Force position counter error interrupt */ + uint32_t QPE :1; /*!< Force quadrature phase error interrupt */ + uint32_t QDC :1; /*!< Force quadrature direction change interrupt */ + uint32_t WTO :1; /*!< Force watchdog time out interrupt */ + uint32_t PCU :1; /*!< Force position counter underflow interrupt */ + uint32_t PCO :1; /*!< Force position counter overflow interrupt */ + uint32_t PCR :1; /*!< Force position-compare ready interrupt */ + uint32_t PCM :1; /*!< Force position-compare match interrupt */ + uint32_t SEL :1; /*!< Force strobe event latch interrupt */ + uint32_t IEL :1; /*!< Force index event latch interrupt */ + uint32_t UTO :1; /*!< Force unit time out interrupt */ +} _QEP_QFRC_bits; + +/* Bit field positions: */ +#define QEP_QFRC_PCE_Pos 1 /*!< Force position counter error interrupt */ +#define QEP_QFRC_QPE_Pos 2 /*!< Force quadrature phase error interrupt */ +#define QEP_QFRC_QDC_Pos 3 /*!< Force quadrature direction change interrupt */ +#define QEP_QFRC_WTO_Pos 4 /*!< Force watchdog time out interrupt */ +#define QEP_QFRC_PCU_Pos 5 /*!< Force position counter underflow interrupt */ +#define QEP_QFRC_PCO_Pos 6 /*!< Force position counter overflow interrupt */ +#define QEP_QFRC_PCR_Pos 7 /*!< Force position-compare ready interrupt */ +#define QEP_QFRC_PCM_Pos 8 /*!< Force position-compare match interrupt */ +#define QEP_QFRC_SEL_Pos 9 /*!< Force strobe event latch interrupt */ +#define QEP_QFRC_IEL_Pos 10 /*!< Force index event latch interrupt */ +#define QEP_QFRC_UTO_Pos 11 /*!< Force unit time out interrupt */ + +/* Bit field masks: */ +#define QEP_QFRC_PCE_Msk 0x00000002UL /*!< Force position counter error interrupt */ +#define QEP_QFRC_QPE_Msk 0x00000004UL /*!< Force quadrature phase error interrupt */ +#define QEP_QFRC_QDC_Msk 0x00000008UL /*!< Force quadrature direction change interrupt */ +#define QEP_QFRC_WTO_Msk 0x00000010UL /*!< Force watchdog time out interrupt */ +#define QEP_QFRC_PCU_Msk 0x00000020UL /*!< Force position counter underflow interrupt */ +#define QEP_QFRC_PCO_Msk 0x00000040UL /*!< Force position counter overflow interrupt */ +#define QEP_QFRC_PCR_Msk 0x00000080UL /*!< Force position-compare ready interrupt */ +#define QEP_QFRC_PCM_Msk 0x00000100UL /*!< Force position-compare match interrupt */ +#define QEP_QFRC_SEL_Msk 0x00000200UL /*!< Force strobe event latch interrupt */ +#define QEP_QFRC_IEL_Msk 0x00000400UL /*!< Force index event latch interrupt */ +#define QEP_QFRC_UTO_Msk 0x00000800UL /*!< Force unit time out interrupt */ + +/*-- QEPSTS: Status register ---------------------------------------------------------------------------------*/ +typedef struct { + uint32_t PCEF :1; /*!< Position counter error flag */ + uint32_t FIMF :1; /*!< First index marker flag */ + uint32_t CDEF :1; /*!< Capture direction error flag */ + uint32_t COEF :1; /*!< Capture overflow error flag */ + uint32_t QDLF :1; /*!< QEP direction latch flag */ + uint32_t QDF :1; /*!< Quadrature direction flag */ + uint32_t FIDF :1; /*!< Direction on the first index marker */ + uint32_t UPEVNT :1; /*!< Unit position event flag */ + uint32_t DCF :1; /*!< Direction change flag */ +} _QEP_QEPSTS_bits; + +/* Bit field positions: */ +#define QEP_QEPSTS_PCEF_Pos 0 /*!< Position counter error flag */ +#define QEP_QEPSTS_FIMF_Pos 1 /*!< First index marker flag */ +#define QEP_QEPSTS_CDEF_Pos 2 /*!< Capture direction error flag */ +#define QEP_QEPSTS_COEF_Pos 3 /*!< Capture overflow error flag */ +#define QEP_QEPSTS_QDLF_Pos 4 /*!< QEP direction latch flag */ +#define QEP_QEPSTS_QDF_Pos 5 /*!< Quadrature direction flag */ +#define QEP_QEPSTS_FIDF_Pos 6 /*!< Direction on the first index marker */ +#define QEP_QEPSTS_UPEVNT_Pos 7 /*!< Unit position event flag */ +#define QEP_QEPSTS_DCF_Pos 8 /*!< Direction change flag */ + +/* Bit field masks: */ +#define QEP_QEPSTS_PCEF_Msk 0x00000001UL /*!< Position counter error flag */ +#define QEP_QEPSTS_FIMF_Msk 0x00000002UL /*!< First index marker flag */ +#define QEP_QEPSTS_CDEF_Msk 0x00000004UL /*!< Capture direction error flag */ +#define QEP_QEPSTS_COEF_Msk 0x00000008UL /*!< Capture overflow error flag */ +#define QEP_QEPSTS_QDLF_Msk 0x00000010UL /*!< QEP direction latch flag */ +#define QEP_QEPSTS_QDF_Msk 0x00000020UL /*!< Quadrature direction flag */ +#define QEP_QEPSTS_FIDF_Msk 0x00000040UL /*!< Direction on the first index marker */ +#define QEP_QEPSTS_UPEVNT_Msk 0x00000080UL /*!< Unit position event flag */ +#define QEP_QEPSTS_DCF_Msk 0x00000100UL /*!< Direction change flag */ + +/*-- QCTMR: Capture Timer register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QCTMR_bits; + +/* Bit field positions: */ +#define QEP_QCTMR_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QCTMR_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QCPRD: Capture Period register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QCPRD_bits; + +/* Bit field positions: */ +#define QEP_QCPRD_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QCPRD_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QCTMRLAT: Capture Timer Latch register ------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QCTMRLAT_bits; + +/* Bit field positions: */ +#define QEP_QCTMRLAT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QCTMRLAT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- QCPRDLAT: Capture Period Latch register -----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< */ +} _QEP_QCPRDLAT_bits; + +/* Bit field positions: */ +#define QEP_QCPRDLAT_VAL_Pos 0 /*!< */ + +/* Bit field masks: */ +#define QEP_QCPRDLAT_VAL_Msk 0xFFFFFFFFUL /*!< */ + +/*-- DMAREQ: DMA request register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t DMAEN :1; /*!< DMA request enable */ +} _QEP_DMAREQ_bits; + +/* Bit field positions: */ +#define QEP_DMAREQ_DMAEN_Pos 0 /*!< DMA request enable */ + +/* Bit field masks: */ +#define QEP_DMAREQ_DMAEN_Msk 0x00000001UL /*!< DMA request enable */ + +/*-- INTCLR: Clear active interrupt register -----------------------------------------------------------------*/ +typedef struct { + uint32_t INT :1; /*!< Active interrupt by read, write 1 to clear interrupt */ +} _QEP_INTCLR_bits; + +/* Bit field positions: */ +#define QEP_INTCLR_INT_Pos 0 /*!< Active interrupt by read, write 1 to clear interrupt */ + +/* Bit field masks: */ +#define QEP_INTCLR_INT_Msk 0x00000001UL /*!< Active interrupt by read, write 1 to clear interrupt */ + +typedef struct { + union { /*!< Position Counter register */ + __IO uint32_t QPOSCNT; /*!< QPOSCNT : type used for word access */ + __IO _QEP_QPOSCNT_bits QPOSCNT_bit; /*!< QPOSCNT_bit: structure used for bit access */ + }; + union { /*!< Position Counter Initialization register */ + __IO uint32_t QPOSINIT; /*!< QPOSINIT : type used for word access */ + __IO _QEP_QPOSINIT_bits QPOSINIT_bit; /*!< QPOSINIT_bit: structure used for bit access */ + }; + union { /*!< Maximum Position Count register */ + __IO uint32_t QPOSMAX; /*!< QPOSMAX : type used for word access */ + __IO _QEP_QPOSMAX_bits QPOSMAX_bit; /*!< QPOSMAX_bit: structure used for bit access */ + }; + union { /*!< Position-compare register */ + __IO uint32_t QPOSCMP; /*!< QPOSCMP : type used for word access */ + __IO _QEP_QPOSCMP_bits QPOSCMP_bit; /*!< QPOSCMP_bit: structure used for bit access */ + }; + union { /*!< Index Position Latch register */ + __I uint32_t QPOSILAT; /*!< QPOSILAT : type used for word access */ + __I _QEP_QPOSILAT_bits QPOSILAT_bit; /*!< QPOSILAT_bit: structure used for bit access */ + }; + union { /*!< Strobe Position Latch register */ + __I uint32_t QPOSSLAT; /*!< QPOSSLAT : type used for word access */ + __I _QEP_QPOSSLAT_bits QPOSSLAT_bit; /*!< QPOSSLAT_bit: structure used for bit access */ + }; + union { /*!< Position Counter Latch register */ + __I uint32_t QPOSLAT; /*!< QPOSLAT : type used for word access */ + __I _QEP_QPOSLAT_bits QPOSLAT_bit; /*!< QPOSLAT_bit: structure used for bit access */ + }; + union { /*!< Unit Timer register */ + __IO uint32_t QUTMR; /*!< QUTMR : type used for word access */ + __IO _QEP_QUTMR_bits QUTMR_bit; /*!< QUTMR_bit: structure used for bit access */ + }; + union { /*!< Unit Period register */ + __IO uint32_t QUPRD; /*!< QUPRD : type used for word access */ + __IO _QEP_QUPRD_bits QUPRD_bit; /*!< QUPRD_bit: structure used for bit access */ + }; + union { /*!< Watchdog Timer register */ + __IO uint32_t QWDTMR; /*!< QWDTMR : type used for word access */ + __IO _QEP_QWDTMR_bits QWDTMR_bit; /*!< QWDTMR_bit: structure used for bit access */ + }; + union { /*!< Watchdog Period register */ + __IO uint32_t QWDPRD; /*!< QWDPRD : type used for word access */ + __IO _QEP_QWDPRD_bits QWDPRD_bit; /*!< QWDPRD_bit: structure used for bit access */ + }; + union { /*!< Decoder Control register */ + __IO uint32_t QDECCTL; /*!< QDECCTL : type used for word access */ + __IO _QEP_QDECCTL_bits QDECCTL_bit; /*!< QDECCTL_bit: structure used for bit access */ + }; + union { /*!< Control register */ + __IO uint32_t QEPCTL; /*!< QEPCTL : type used for word access */ + __IO _QEP_QEPCTL_bits QEPCTL_bit; /*!< QEPCTL_bit: structure used for bit access */ + }; + union { /*!< Capture Control register */ + __IO uint32_t QCAPCTL; /*!< QCAPCTL : type used for word access */ + __IO _QEP_QCAPCTL_bits QCAPCTL_bit; /*!< QCAPCTL_bit: structure used for bit access */ + }; + union { /*!< Position-compare Control register */ + __IO uint32_t QPOSCTL; /*!< QPOSCTL : type used for word access */ + __IO _QEP_QPOSCTL_bits QPOSCTL_bit; /*!< QPOSCTL_bit: structure used for bit access */ + }; + union { /*!< Interrupt Enable register */ + __IO uint32_t QEINT; /*!< QEINT : type used for word access */ + __IO _QEP_QEINT_bits QEINT_bit; /*!< QEINT_bit: structure used for bit access */ + }; + union { /*!< Interrupt Flag register */ + __I uint32_t QFLG; /*!< QFLG : type used for word access */ + __I _QEP_QFLG_bits QFLG_bit; /*!< QFLG_bit: structure used for bit access */ + }; + union { /*!< Interrupt Clear register */ + __O uint32_t QCLR; /*!< QCLR : type used for word access */ + __O _QEP_QCLR_bits QCLR_bit; /*!< QCLR_bit: structure used for bit access */ + }; + union { /*!< Interrupt Force register */ + __O uint32_t QFRC; /*!< QFRC : type used for word access */ + __O _QEP_QFRC_bits QFRC_bit; /*!< QFRC_bit: structure used for bit access */ + }; + union { /*!< Status register */ + __IO uint32_t QEPSTS; /*!< QEPSTS : type used for word access */ + __IO _QEP_QEPSTS_bits QEPSTS_bit; /*!< QEPSTS_bit: structure used for bit access */ + }; + union { /*!< Capture Timer register */ + __IO uint32_t QCTMR; /*!< QCTMR : type used for word access */ + __IO _QEP_QCTMR_bits QCTMR_bit; /*!< QCTMR_bit: structure used for bit access */ + }; + union { /*!< Capture Period register */ + __IO uint32_t QCPRD; /*!< QCPRD : type used for word access */ + __IO _QEP_QCPRD_bits QCPRD_bit; /*!< QCPRD_bit: structure used for bit access */ + }; + union { /*!< Capture Timer Latch register */ + __I uint32_t QCTMRLAT; /*!< QCTMRLAT : type used for word access */ + __I _QEP_QCTMRLAT_bits QCTMRLAT_bit; /*!< QCTMRLAT_bit: structure used for bit access */ + }; + union { /*!< Capture Period Latch register */ + __I uint32_t QCPRDLAT; /*!< QCPRDLAT : type used for word access */ + __I _QEP_QCPRDLAT_bits QCPRDLAT_bit; /*!< QCPRDLAT_bit: structure used for bit access */ + }; + union { /*!< DMA request register */ + __IO uint32_t DMAREQ; /*!< DMAREQ : type used for word access */ + __IO _QEP_DMAREQ_bits DMAREQ_bit; /*!< DMAREQ_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[3]; + union { /*!< Clear active interrupt register */ + __IO uint32_t INTCLR; /*!< INTCLR : type used for word access */ + __IO _QEP_INTCLR_bits INTCLR_bit; /*!< INTCLR_bit: structure used for bit access */ + }; +} QEP_TypeDef; + + +/******************************************************************************/ +/* MILSTD registers */ +/******************************************************************************/ + +/*-- IR: BSI interrupt register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BCEV :1; /*!< BC transfer event interrupt */ + uint32_t BCD :1; /*!< BC DMA error */ + uint32_t BCWK :1; /*!< BC timer interrupt */ + uint32_t :5; /*!< RESERVED */ + uint32_t RTEV :1; /*!< RT transfer event interrupt */ + uint32_t RTD :1; /*!< RT DMA error */ + uint32_t RTTE :1; /*!< RT table access error */ + uint32_t :5; /*!< RESERVED */ + uint32_t BMD :1; /*!< BM DMA error */ + uint32_t BMTOF :1; /*!< BM timer overflow */ +} _MILSTD_IR_bits; + +/* Bit field positions: */ +#define MILSTD_IR_BCEV_Pos 0 /*!< BC transfer event interrupt */ +#define MILSTD_IR_BCD_Pos 1 /*!< BC DMA error */ +#define MILSTD_IR_BCWK_Pos 2 /*!< BC timer interrupt */ +#define MILSTD_IR_RTEV_Pos 8 /*!< RT transfer event interrupt */ +#define MILSTD_IR_RTD_Pos 9 /*!< RT DMA error */ +#define MILSTD_IR_RTTE_Pos 10 /*!< RT table access error */ +#define MILSTD_IR_BMD_Pos 16 /*!< BM DMA error */ +#define MILSTD_IR_BMTOF_Pos 17 /*!< BM timer overflow */ + +/* Bit field masks: */ +#define MILSTD_IR_BCEV_Msk 0x00000001UL /*!< BC transfer event interrupt */ +#define MILSTD_IR_BCD_Msk 0x00000002UL /*!< BC DMA error */ +#define MILSTD_IR_BCWK_Msk 0x00000004UL /*!< BC timer interrupt */ +#define MILSTD_IR_RTEV_Msk 0x00000100UL /*!< RT transfer event interrupt */ +#define MILSTD_IR_RTD_Msk 0x00000200UL /*!< RT DMA error */ +#define MILSTD_IR_RTTE_Msk 0x00000400UL /*!< RT table access error */ +#define MILSTD_IR_BMD_Msk 0x00010000UL /*!< BM DMA error */ +#define MILSTD_IR_BMTOF_Msk 0x00020000UL /*!< BM timer overflow */ + +/*-- IENR: BSI interrupt enable register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t BCEVE :1; /*!< BCEVE interrupt enable */ + uint32_t BCDE :1; /*!< BCD interrupt enable */ + uint32_t BCWKE :1; /*!< BCWK interrupt enable */ + uint32_t :5; /*!< RESERVED */ + uint32_t RTEVE :1; /*!< RTEV interrupt enable */ + uint32_t RTDE :1; /*!< RTD interrupt enable */ + uint32_t RTTEE :1; /*!< RTTE interrupt enable */ + uint32_t :5; /*!< RESERVED */ + uint32_t BMDE :1; /*!< BMD interrupt enable */ + uint32_t BMTOE :1; /*!< BMTOF interrupt enable */ +} _MILSTD_IENR_bits; + +/* Bit field positions: */ +#define MILSTD_IENR_BCEVE_Pos 0 /*!< BCEVE interrupt enable */ +#define MILSTD_IENR_BCDE_Pos 1 /*!< BCD interrupt enable */ +#define MILSTD_IENR_BCWKE_Pos 2 /*!< BCWK interrupt enable */ +#define MILSTD_IENR_RTEVE_Pos 8 /*!< RTEV interrupt enable */ +#define MILSTD_IENR_RTDE_Pos 9 /*!< RTD interrupt enable */ +#define MILSTD_IENR_RTTEE_Pos 10 /*!< RTTE interrupt enable */ +#define MILSTD_IENR_BMDE_Pos 16 /*!< BMD interrupt enable */ +#define MILSTD_IENR_BMTOE_Pos 17 /*!< BMTOF interrupt enable */ + +/* Bit field masks: */ +#define MILSTD_IENR_BCEVE_Msk 0x00000001UL /*!< BCEVE interrupt enable */ +#define MILSTD_IENR_BCDE_Msk 0x00000002UL /*!< BCD interrupt enable */ +#define MILSTD_IENR_BCWKE_Msk 0x00000004UL /*!< BCWK interrupt enable */ +#define MILSTD_IENR_RTEVE_Msk 0x00000100UL /*!< RTEV interrupt enable */ +#define MILSTD_IENR_RTDE_Msk 0x00000200UL /*!< RTD interrupt enable */ +#define MILSTD_IENR_RTTEE_Msk 0x00000400UL /*!< RTTE interrupt enable */ +#define MILSTD_IENR_BMDE_Msk 0x00010000UL /*!< BMD interrupt enable */ +#define MILSTD_IENR_BMTOE_Msk 0x00020000UL /*!< BMTOF interrupt enable */ + +/*-- HCON: BSI hardware configuration register ---------------------------------------------------------------*/ +typedef struct { + uint32_t CCFREQ :8; /*!< Codec clock frequency */ + uint32_t SCLK :1; /*!< Same clock */ + uint32_t ENDIAN :2; /*!< AHB Endianness */ + uint32_t XKEYS :1; /*!< Enable safety keys */ + uint32_t :19; /*!< RESERVED */ + uint32_t MOD :1; /*!< Modified */ +} _MILSTD_HCON_bits; + +/* Bit field positions: */ +#define MILSTD_HCON_CCFREQ_Pos 0 /*!< Codec clock frequency */ +#define MILSTD_HCON_SCLK_Pos 8 /*!< Same clock */ +#define MILSTD_HCON_ENDIAN_Pos 9 /*!< AHB Endianness */ +#define MILSTD_HCON_XKEYS_Pos 11 /*!< Enable safety keys */ +#define MILSTD_HCON_MOD_Pos 31 /*!< Modified */ + +/* Bit field masks: */ +#define MILSTD_HCON_CCFREQ_Msk 0x000000FFUL /*!< Codec clock frequency */ +#define MILSTD_HCON_SCLK_Msk 0x00000100UL /*!< Same clock */ +#define MILSTD_HCON_ENDIAN_Msk 0x00000600UL /*!< AHB Endianness */ +#define MILSTD_HCON_XKEYS_Msk 0x00000800UL /*!< Enable safety keys */ +#define MILSTD_HCON_MOD_Msk 0x80000000UL /*!< Modified */ + +/*-- BCSTCON: BC status and config register ------------------------------------------------------------------*/ +typedef struct { + uint32_t SCST :3; /*!< Schedule state */ + uint32_t SCADL :5; /*!< Schedule address low bits */ + uint32_t ASST :2; /*!< Asynchronous list state */ + uint32_t :1; /*!< RESERVED */ + uint32_t ASADL :5; /*!< Asynchronous list address low bits */ + uint32_t BCCHK :1; /*!< Check broadcast */ + uint32_t :11; /*!< RESERVED */ + uint32_t BCFEAT :3; /*!< BC features */ + uint32_t BCSUP :1; /*!< BC supported */ +} _MILSTD_BCSTCON_bits; + +/* Bit field positions: */ +#define MILSTD_BCSTCON_SCST_Pos 0 /*!< Schedule state */ +#define MILSTD_BCSTCON_SCADL_Pos 3 /*!< Schedule address low bits */ +#define MILSTD_BCSTCON_ASST_Pos 8 /*!< Asynchronous list state */ +#define MILSTD_BCSTCON_ASADL_Pos 11 /*!< Asynchronous list address low bits */ +#define MILSTD_BCSTCON_BCCHK_Pos 16 /*!< Check broadcast */ +#define MILSTD_BCSTCON_BCFEAT_Pos 28 /*!< BC features */ +#define MILSTD_BCSTCON_BCSUP_Pos 31 /*!< BC supported */ + +/* Bit field masks: */ +#define MILSTD_BCSTCON_SCST_Msk 0x00000007UL /*!< Schedule state */ +#define MILSTD_BCSTCON_SCADL_Msk 0x000000F8UL /*!< Schedule address low bits */ +#define MILSTD_BCSTCON_ASST_Msk 0x00000300UL /*!< Asynchronous list state */ +#define MILSTD_BCSTCON_ASADL_Msk 0x0000F800UL /*!< Asynchronous list address low bits */ +#define MILSTD_BCSTCON_BCCHK_Msk 0x00010000UL /*!< Check broadcast */ +#define MILSTD_BCSTCON_BCFEAT_Msk 0x70000000UL /*!< BC features */ +#define MILSTD_BCSTCON_BCSUP_Msk 0x80000000UL /*!< BC supported */ + +/*-- BCACT: BC action register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t SCSRT :1; /*!< Schedule start */ + uint32_t SCSUS :1; /*!< Schedule suspend */ + uint32_t SCSTP :1; /*!< Schedule stop */ + uint32_t SETT :1; /*!< Set external trigger */ + uint32_t CLRT :1; /*!< Clear external trigger */ + uint32_t :3; /*!< RESERVED */ + uint32_t ASSRT :1; /*!< Asynchronous list start */ + uint32_t ASSTP :1; /*!< Asynchronous list stop */ + uint32_t :6; /*!< RESERVED */ + uint32_t BCKEY :16; /*!< BC safety code */ +} _MILSTD_BCACT_bits; + +/* Bit field positions: */ +#define MILSTD_BCACT_SCSRT_Pos 0 /*!< Schedule start */ +#define MILSTD_BCACT_SCSUS_Pos 1 /*!< Schedule suspend */ +#define MILSTD_BCACT_SCSTP_Pos 2 /*!< Schedule stop */ +#define MILSTD_BCACT_SETT_Pos 3 /*!< Set external trigger */ +#define MILSTD_BCACT_CLRT_Pos 4 /*!< Clear external trigger */ +#define MILSTD_BCACT_ASSRT_Pos 8 /*!< Asynchronous list start */ +#define MILSTD_BCACT_ASSTP_Pos 9 /*!< Asynchronous list stop */ +#define MILSTD_BCACT_BCKEY_Pos 16 /*!< BC safety code */ + +/* Bit field masks: */ +#define MILSTD_BCACT_SCSRT_Msk 0x00000001UL /*!< Schedule start */ +#define MILSTD_BCACT_SCSUS_Msk 0x00000002UL /*!< Schedule suspend */ +#define MILSTD_BCACT_SCSTP_Msk 0x00000004UL /*!< Schedule stop */ +#define MILSTD_BCACT_SETT_Msk 0x00000008UL /*!< Set external trigger */ +#define MILSTD_BCACT_CLRT_Msk 0x00000010UL /*!< Clear external trigger */ +#define MILSTD_BCACT_ASSRT_Msk 0x00000100UL /*!< Asynchronous list start */ +#define MILSTD_BCACT_ASSTP_Msk 0x00000200UL /*!< Asynchronous list stop */ +#define MILSTD_BCACT_BCKEY_Msk 0xFFFF0000UL /*!< BC safety code */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BCACT_BCKEY_Code = 0x1552UL, /*!< BC safety code */ +} MILSTD_BCACT_BCKEY_Enum; + +/*-- BCLNP: BC transfer list next pointer --------------------------------------------------------------------*/ +typedef struct { + uint32_t SCTLP :32; /*!< Schedule transfer list pointer */ +} _MILSTD_BCLNP_bits; + +/* Bit field positions: */ +#define MILSTD_BCLNP_SCTLP_Pos 0 /*!< Schedule transfer list pointer */ + +/* Bit field masks: */ +#define MILSTD_BCLNP_SCTLP_Msk 0xFFFFFFFFUL /*!< Schedule transfer list pointer */ + +/*-- BCALNP: BC asynchronous list next pointer register ------------------------------------------------------*/ +typedef struct { + uint32_t ASLP :32; /*!< Asynchronous list pointer */ +} _MILSTD_BCALNP_bits; + +/* Bit field positions: */ +#define MILSTD_BCALNP_ASLP_Pos 0 /*!< Asynchronous list pointer */ + +/* Bit field masks: */ +#define MILSTD_BCALNP_ASLP_Msk 0xFFFFFFFFUL /*!< Asynchronous list pointer */ + +/*-- BCTIM: BC timer register --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t SCTM :24; /*!< Schedule time */ +} _MILSTD_BCTIM_bits; + +/* Bit field positions: */ +#define MILSTD_BCTIM_SCTM_Pos 0 /*!< Schedule time */ + +/* Bit field masks: */ +#define MILSTD_BCTIM_SCTM_Msk 0x00FFFFFFUL /*!< Schedule time */ + +/*-- BCTIMWK: BC timer wake-up register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t WKTM :24; /*!< Wake-up time */ + uint32_t :7; /*!< RESERVED */ + uint32_t WKEN :1; /*!< Wake-up timer enable */ +} _MILSTD_BCTIMWK_bits; + +/* Bit field positions: */ +#define MILSTD_BCTIMWK_WKTM_Pos 0 /*!< Wake-up time */ +#define MILSTD_BCTIMWK_WKEN_Pos 31 /*!< Wake-up timer enable */ + +/* Bit field masks: */ +#define MILSTD_BCTIMWK_WKTM_Msk 0x00FFFFFFUL /*!< Wake-up time */ +#define MILSTD_BCTIMWK_WKEN_Msk 0x80000000UL /*!< Wake-up timer enable */ + +/*-- BCTRP: BC transfer-triggered IRQ ring position register -------------------------------------------------*/ +typedef struct { + uint32_t SPRP :32; /*!< BC IRQ source pointer ring position */ +} _MILSTD_BCTRP_bits; + +/* Bit field positions: */ +#define MILSTD_BCTRP_SPRP_Pos 0 /*!< BC IRQ source pointer ring position */ + +/* Bit field masks: */ +#define MILSTD_BCTRP_SPRP_Msk 0xFFFFFFFFUL /*!< BC IRQ source pointer ring position */ + +/*-- BCBSW: BC per-RT bus swap register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t BPRBS :32; /*!< BC per-RT bus swap */ +} _MILSTD_BCBSW_bits; + +/* Bit field positions: */ +#define MILSTD_BCBSW_BPRBS_Pos 0 /*!< BC per-RT bus swap */ + +/* Bit field masks: */ +#define MILSTD_BCBSW_BPRBS_Msk 0xFFFFFFFFUL /*!< BC per-RT bus swap */ + +/*-- BCTSP: BC transfer list current slot pointer ------------------------------------------------------------*/ +typedef struct { + uint32_t TSP :32; /*!< BC transfer slot pointer */ +} _MILSTD_BCTSP_bits; + +/* Bit field positions: */ +#define MILSTD_BCTSP_TSP_Pos 0 /*!< BC transfer slot pointer */ + +/* Bit field masks: */ +#define MILSTD_BCTSP_TSP_Msk 0xFFFFFFFFUL /*!< BC transfer slot pointer */ + +/*-- BCATSP: BC asynchronous list current slot pointer -------------------------------------------------------*/ +typedef struct { + uint32_t ATSP :32; /*!< BC asynchronous transfer slot pointer */ +} _MILSTD_BCATSP_bits; + +/* Bit field positions: */ +#define MILSTD_BCATSP_ATSP_Pos 0 /*!< BC asynchronous transfer slot pointer */ + +/* Bit field masks: */ +#define MILSTD_BCATSP_ATSP_Msk 0xFFFFFFFFUL /*!< BC asynchronous transfer slot pointer */ + +/*-- RTSTAT: RT status register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t RUN :1; /*!< RT running */ + uint32_t SHDB :1; /*!< Bus B shutdown */ + uint32_t SHDA :1; /*!< Bus A shutdown */ + uint32_t ACT :1; /*!< RT active */ + uint32_t :27; /*!< RESERVED */ + uint32_t RTSUP :1; /*!< RT supported */ +} _MILSTD_RTSTAT_bits; + +/* Bit field positions: */ +#define MILSTD_RTSTAT_RUN_Pos 0 /*!< RT running */ +#define MILSTD_RTSTAT_SHDB_Pos 1 /*!< Bus B shutdown */ +#define MILSTD_RTSTAT_SHDA_Pos 2 /*!< Bus A shutdown */ +#define MILSTD_RTSTAT_ACT_Pos 3 /*!< RT active */ +#define MILSTD_RTSTAT_RTSUP_Pos 31 /*!< RT supported */ + +/* Bit field masks: */ +#define MILSTD_RTSTAT_RUN_Msk 0x00000001UL /*!< RT running */ +#define MILSTD_RTSTAT_SHDB_Msk 0x00000002UL /*!< Bus B shutdown */ +#define MILSTD_RTSTAT_SHDA_Msk 0x00000004UL /*!< Bus A shutdown */ +#define MILSTD_RTSTAT_ACT_Msk 0x00000008UL /*!< RT active */ +#define MILSTD_RTSTAT_RTSUP_Msk 0x80000000UL /*!< RT supported */ + +/*-- RTCON: RT config register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t RTEN :1; /*!< RT enable */ + uint32_t RTADDR :5; /*!< RT address */ + uint32_t RTEIS :1; /*!< external RT address set */ + uint32_t :6; /*!< RESERVED */ + uint32_t BRS :1; /*!< Bus reset enable */ + uint32_t SYDS :1; /*!< Sync with data enable */ + uint32_t SYS :1; /*!< Sync enable */ + uint32_t RTKEY :16; /*!< RT safety code */ +} _MILSTD_RTCON_bits; + +/* Bit field positions: */ +#define MILSTD_RTCON_RTEN_Pos 0 /*!< RT enable */ +#define MILSTD_RTCON_RTADDR_Pos 1 /*!< RT address */ +#define MILSTD_RTCON_RTEIS_Pos 6 /*!< external RT address set */ +#define MILSTD_RTCON_BRS_Pos 13 /*!< Bus reset enable */ +#define MILSTD_RTCON_SYDS_Pos 14 /*!< Sync with data enable */ +#define MILSTD_RTCON_SYS_Pos 15 /*!< Sync enable */ +#define MILSTD_RTCON_RTKEY_Pos 16 /*!< RT safety code */ + +/* Bit field masks: */ +#define MILSTD_RTCON_RTEN_Msk 0x00000001UL /*!< RT enable */ +#define MILSTD_RTCON_RTADDR_Msk 0x0000003EUL /*!< RT address */ +#define MILSTD_RTCON_RTEIS_Msk 0x00000040UL /*!< external RT address set */ +#define MILSTD_RTCON_BRS_Msk 0x00002000UL /*!< Bus reset enable */ +#define MILSTD_RTCON_SYDS_Msk 0x00004000UL /*!< Sync with data enable */ +#define MILSTD_RTCON_SYS_Msk 0x00008000UL /*!< Sync enable */ +#define MILSTD_RTCON_RTKEY_Msk 0xFFFF0000UL /*!< RT safety code */ + +/* Bit field enums: */ +typedef enum { + MILSTD_RTCON_RTKEY_Code = 0x1553UL, /*!< RT safety code */ +} MILSTD_RTCON_RTKEY_Enum; + +/*-- RTBST: RT bus status register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t TFLG :1; /*!< Terminal flag */ + uint32_t DBCA :1; /*!< Dynamic BC acceptance */ + uint32_t SSF :1; /*!< Subsystem flag */ + uint32_t BUSY :1; /*!< Busy bit */ + uint32_t SREQ :1; /*!< Service request */ + uint32_t :3; /*!< RESERVED */ + uint32_t TFDE :1; /*!< Set terminal flag */ +} _MILSTD_RTBST_bits; + +/* Bit field positions: */ +#define MILSTD_RTBST_TFLG_Pos 0 /*!< Terminal flag */ +#define MILSTD_RTBST_DBCA_Pos 1 /*!< Dynamic BC acceptance */ +#define MILSTD_RTBST_SSF_Pos 2 /*!< Subsystem flag */ +#define MILSTD_RTBST_BUSY_Pos 3 /*!< Busy bit */ +#define MILSTD_RTBST_SREQ_Pos 4 /*!< Service request */ +#define MILSTD_RTBST_TFDE_Pos 8 /*!< Set terminal flag */ + +/* Bit field masks: */ +#define MILSTD_RTBST_TFLG_Msk 0x00000001UL /*!< Terminal flag */ +#define MILSTD_RTBST_DBCA_Msk 0x00000002UL /*!< Dynamic BC acceptance */ +#define MILSTD_RTBST_SSF_Msk 0x00000004UL /*!< Subsystem flag */ +#define MILSTD_RTBST_BUSY_Msk 0x00000008UL /*!< Busy bit */ +#define MILSTD_RTBST_SREQ_Msk 0x00000010UL /*!< Service request */ +#define MILSTD_RTBST_TFDE_Msk 0x00000100UL /*!< Set terminal flag */ + +/*-- RTSW: RT status words register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t VECW :16; /*!< Vector word */ + uint32_t BITW :16; /*!< BIT Word */ +} _MILSTD_RTSW_bits; + +/* Bit field positions: */ +#define MILSTD_RTSW_VECW_Pos 0 /*!< Vector word */ +#define MILSTD_RTSW_BITW_Pos 16 /*!< BIT Word */ + +/* Bit field masks: */ +#define MILSTD_RTSW_VECW_Msk 0x0000FFFFUL /*!< Vector word */ +#define MILSTD_RTSW_BITW_Msk 0xFFFF0000UL /*!< BIT Word */ + +/*-- RTSYNC: RT sync register --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t SYD :16; /*!< RT sync data */ + uint32_t SYTM :16; /*!< RT sync time */ +} _MILSTD_RTSYNC_bits; + +/* Bit field positions: */ +#define MILSTD_RTSYNC_SYD_Pos 0 /*!< RT sync data */ +#define MILSTD_RTSYNC_SYTM_Pos 16 /*!< RT sync time */ + +/* Bit field masks: */ +#define MILSTD_RTSYNC_SYD_Msk 0x0000FFFFUL /*!< RT sync data */ +#define MILSTD_RTSYNC_SYTM_Msk 0xFFFF0000UL /*!< RT sync time */ + +/*-- RTSADDR: RT subaddress table base address ---------------------------------------------------------------*/ +typedef struct { + uint32_t :9; /*!< RESERVED */ + uint32_t SATB :23; /*!< RT subaddress table base */ +} _MILSTD_RTSADDR_bits; + +/* Bit field positions: */ +#define MILSTD_RTSADDR_SATB_Pos 9 /*!< RT subaddress table base */ + +/* Bit field masks: */ +#define MILSTD_RTSADDR_SATB_Msk 0xFFFFFE00UL /*!< RT subaddress table base */ + +/*-- RTMOD: RT mode control register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t S :2; /*!< Syncronize */ + uint32_t SB :2; /*!< Synchronize broadcast */ + uint32_t SD :2; /*!< Synchronize with data word */ + uint32_t SDB :2; /*!< Synchronize with data word broadcast */ + uint32_t TS :2; /*!< Transmitter shutdown */ + uint32_t TSB :2; /*!< Transmitter shutdown broadcast */ + uint32_t TVW :2; /*!< Transmit vector word */ + uint32_t TBW :2; /*!< Transmit BIT word */ + uint32_t DBC :2; /*!< Dynamic bus control */ + uint32_t IST :2; /*!< Initiate self test */ + uint32_t ISTB :2; /*!< Initiate self test broadcast */ + uint32_t ITF :2; /*!< Inhibit terminal flag */ + uint32_t ITFB :2; /*!< Inhibit terminal flag broadcast */ + uint32_t RRT :2; /*!< Reset RT */ + uint32_t RRTB :2; /*!< reset RT broadcast */ +} _MILSTD_RTMOD_bits; + +/* Bit field positions: */ +#define MILSTD_RTMOD_S_Pos 0 /*!< Syncronize */ +#define MILSTD_RTMOD_SB_Pos 2 /*!< Synchronize broadcast */ +#define MILSTD_RTMOD_SD_Pos 4 /*!< Synchronize with data word */ +#define MILSTD_RTMOD_SDB_Pos 6 /*!< Synchronize with data word broadcast */ +#define MILSTD_RTMOD_TS_Pos 8 /*!< Transmitter shutdown */ +#define MILSTD_RTMOD_TSB_Pos 10 /*!< Transmitter shutdown broadcast */ +#define MILSTD_RTMOD_TVW_Pos 12 /*!< Transmit vector word */ +#define MILSTD_RTMOD_TBW_Pos 14 /*!< Transmit BIT word */ +#define MILSTD_RTMOD_DBC_Pos 16 /*!< Dynamic bus control */ +#define MILSTD_RTMOD_IST_Pos 18 /*!< Initiate self test */ +#define MILSTD_RTMOD_ISTB_Pos 20 /*!< Initiate self test broadcast */ +#define MILSTD_RTMOD_ITF_Pos 22 /*!< Inhibit terminal flag */ +#define MILSTD_RTMOD_ITFB_Pos 24 /*!< Inhibit terminal flag broadcast */ +#define MILSTD_RTMOD_RRT_Pos 26 /*!< Reset RT */ +#define MILSTD_RTMOD_RRTB_Pos 28 /*!< reset RT broadcast */ + +/* Bit field masks: */ +#define MILSTD_RTMOD_S_Msk 0x00000003UL /*!< Syncronize */ +#define MILSTD_RTMOD_SB_Msk 0x0000000CUL /*!< Synchronize broadcast */ +#define MILSTD_RTMOD_SD_Msk 0x00000030UL /*!< Synchronize with data word */ +#define MILSTD_RTMOD_SDB_Msk 0x000000C0UL /*!< Synchronize with data word broadcast */ +#define MILSTD_RTMOD_TS_Msk 0x00000300UL /*!< Transmitter shutdown */ +#define MILSTD_RTMOD_TSB_Msk 0x00000C00UL /*!< Transmitter shutdown broadcast */ +#define MILSTD_RTMOD_TVW_Msk 0x00003000UL /*!< Transmit vector word */ +#define MILSTD_RTMOD_TBW_Msk 0x0000C000UL /*!< Transmit BIT word */ +#define MILSTD_RTMOD_DBC_Msk 0x00030000UL /*!< Dynamic bus control */ +#define MILSTD_RTMOD_IST_Msk 0x000C0000UL /*!< Initiate self test */ +#define MILSTD_RTMOD_ISTB_Msk 0x00300000UL /*!< Initiate self test broadcast */ +#define MILSTD_RTMOD_ITF_Msk 0x00C00000UL /*!< Inhibit terminal flag */ +#define MILSTD_RTMOD_ITFB_Msk 0x03000000UL /*!< Inhibit terminal flag broadcast */ +#define MILSTD_RTMOD_RRT_Msk 0x0C000000UL /*!< Reset RT */ +#define MILSTD_RTMOD_RRTB_Msk 0x30000000UL /*!< reset RT broadcast */ + +/*-- RTTIM: RT time tag control register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t TVAL :16; /*!< Time tag value */ + uint32_t TRES :16; /*!< Time tag resolution */ +} _MILSTD_RTTIM_bits; + +/* Bit field positions: */ +#define MILSTD_RTTIM_TVAL_Pos 0 /*!< Time tag value */ +#define MILSTD_RTTIM_TRES_Pos 16 /*!< Time tag resolution */ + +/* Bit field masks: */ +#define MILSTD_RTTIM_TVAL_Msk 0x0000FFFFUL /*!< Time tag value */ +#define MILSTD_RTTIM_TRES_Msk 0xFFFF0000UL /*!< Time tag resolution */ + +/*-- RTELMSK: RT event log mask register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t :2; /*!< RESERVED */ + uint32_t ELSM :19; /*!< Event log size mask */ +} _MILSTD_RTELMSK_bits; + +/* Bit field positions: */ +#define MILSTD_RTELMSK_ELSM_Pos 2 /*!< Event log size mask */ + +/* Bit field masks: */ +#define MILSTD_RTELMSK_ELSM_Msk 0x001FFFFCUL /*!< Event log size mask */ + +/*-- RTELP: RT event log position pointer --------------------------------------------------------------------*/ +typedef struct { + uint32_t ELWP :32; /*!< Event log write pointer */ +} _MILSTD_RTELP_bits; + +/* Bit field positions: */ +#define MILSTD_RTELP_ELWP_Pos 0 /*!< Event log write pointer */ + +/* Bit field masks: */ +#define MILSTD_RTELP_ELWP_Msk 0xFFFFFFFFUL /*!< Event log write pointer */ + +/*-- RTELIP: RT event log interrupt position register --------------------------------------------------------*/ +typedef struct { + uint32_t ELIP :32; /*!< Event log irq pointer */ +} _MILSTD_RTELIP_bits; + +/* Bit field positions: */ +#define MILSTD_RTELIP_ELIP_Pos 0 /*!< Event log irq pointer */ + +/* Bit field masks: */ +#define MILSTD_RTELIP_ELIP_Msk 0xFFFFFFFFUL /*!< Event log irq pointer */ + +/*-- BMSTAT: BM status register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t :30; /*!< RESERVED */ + uint32_t KEYEN :1; /*!< Key enabled */ + uint32_t BMSUP :1; /*!< BM supported */ +} _MILSTD_BMSTAT_bits; + +/* Bit field positions: */ +#define MILSTD_BMSTAT_KEYEN_Pos 30 /*!< Key enabled */ +#define MILSTD_BMSTAT_BMSUP_Pos 31 /*!< BM supported */ + +/* Bit field masks: */ +#define MILSTD_BMSTAT_KEYEN_Msk 0x40000000UL /*!< Key enabled */ +#define MILSTD_BMSTAT_BMSUP_Msk 0x80000000UL /*!< BM supported */ + +/*-- BMCON: BM control register ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BMEN :1; /*!< BM enable */ + uint32_t MANL :1; /*!< Manchester parity error log */ + uint32_t UDWL :1; /*!< Unexpected data word log */ + uint32_t IMCL :1; /*!< Invalid mode code log */ + uint32_t EXST :1; /*!< External sync start */ + uint32_t WRSTP :1; /*!< Wrap stop */ + uint32_t :10; /*!< RESERVED */ + uint32_t BMKEY :16; /*!< Safety key */ +} _MILSTD_BMCON_bits; + +/* Bit field positions: */ +#define MILSTD_BMCON_BMEN_Pos 0 /*!< BM enable */ +#define MILSTD_BMCON_MANL_Pos 1 /*!< Manchester parity error log */ +#define MILSTD_BMCON_UDWL_Pos 2 /*!< Unexpected data word log */ +#define MILSTD_BMCON_IMCL_Pos 3 /*!< Invalid mode code log */ +#define MILSTD_BMCON_EXST_Pos 4 /*!< External sync start */ +#define MILSTD_BMCON_WRSTP_Pos 5 /*!< Wrap stop */ +#define MILSTD_BMCON_BMKEY_Pos 16 /*!< Safety key */ + +/* Bit field masks: */ +#define MILSTD_BMCON_BMEN_Msk 0x00000001UL /*!< BM enable */ +#define MILSTD_BMCON_MANL_Msk 0x00000002UL /*!< Manchester parity error log */ +#define MILSTD_BMCON_UDWL_Msk 0x00000004UL /*!< Unexpected data word log */ +#define MILSTD_BMCON_IMCL_Msk 0x00000008UL /*!< Invalid mode code log */ +#define MILSTD_BMCON_EXST_Msk 0x00000010UL /*!< External sync start */ +#define MILSTD_BMCON_WRSTP_Msk 0x00000020UL /*!< Wrap stop */ +#define MILSTD_BMCON_BMKEY_Msk 0xFFFF0000UL /*!< Safety key */ + +/* Bit field enums: */ +typedef enum { + MILSTD_BMCON_BMKEY_Code = 0x1554UL, /*!< BM safety code */ +} MILSTD_BMCON_BMKEY_Enum; + +/*-- BMADF: BM RT address filter register --------------------------------------------------------------------*/ +typedef struct { + uint32_t AFM :32; /*!< Address filter mask */ +} _MILSTD_BMADF_bits; + +/* Bit field positions: */ +#define MILSTD_BMADF_AFM_Pos 0 /*!< Address filter mask */ + +/* Bit field masks: */ +#define MILSTD_BMADF_AFM_Msk 0xFFFFFFFFUL /*!< Address filter mask */ + +/*-- BMSADF: BM RT subaddress filter register ----------------------------------------------------------------*/ +typedef struct { + uint32_t SAFM :32; /*!< Subaddress filter mask */ +} _MILSTD_BMSADF_bits; + +/* Bit field positions: */ +#define MILSTD_BMSADF_SAFM_Pos 0 /*!< Subaddress filter mask */ + +/* Bit field masks: */ +#define MILSTD_BMSADF_SAFM_Msk 0xFFFFFFFFUL /*!< Subaddress filter mask */ + +/*-- BMMODF: BM RT mode code filter register -----------------------------------------------------------------*/ +typedef struct { + uint32_t S :1; /*!< Syncronize */ + uint32_t SB :1; /*!< Syncronize broadcast */ + uint32_t SD :1; /*!< Syncronize with data word */ + uint32_t SDB :1; /*!< Syncronize with data word broadcast */ + uint32_t TS :1; /*!< Transmitter shutdown */ + uint32_t TSB :1; /*!< Transmitter shutdown broadcast */ + uint32_t TVW :1; /*!< Transmit vector word */ + uint32_t TBW :1; /*!< Transmit BIT word */ + uint32_t DBC :1; /*!< Dynamic bus control */ + uint32_t IST :1; /*!< Initiate self test */ + uint32_t ISTB :1; /*!< Initiate self test broadcast */ + uint32_t ITF :1; /*!< Inhibit terminal flag */ + uint32_t ITFB :1; /*!< Inhibit termital flag broadcast */ + uint32_t RRT :1; /*!< Reset RT */ + uint32_t RRTB :1; /*!< Reset RT broadcast */ + uint32_t TSW :1; /*!< Transmit status word */ + uint32_t TLC :1; /*!< Transmit last command */ + uint32_t STS :1; /*!< Selected transmitter shutdown */ + uint32_t STSB :1; /*!< Selected transmitter shutdown broadcast */ +} _MILSTD_BMMODF_bits; + +/* Bit field positions: */ +#define MILSTD_BMMODF_S_Pos 0 /*!< Syncronize */ +#define MILSTD_BMMODF_SB_Pos 1 /*!< Syncronize broadcast */ +#define MILSTD_BMMODF_SD_Pos 2 /*!< Syncronize with data word */ +#define MILSTD_BMMODF_SDB_Pos 3 /*!< Syncronize with data word broadcast */ +#define MILSTD_BMMODF_TS_Pos 4 /*!< Transmitter shutdown */ +#define MILSTD_BMMODF_TSB_Pos 5 /*!< Transmitter shutdown broadcast */ +#define MILSTD_BMMODF_TVW_Pos 6 /*!< Transmit vector word */ +#define MILSTD_BMMODF_TBW_Pos 7 /*!< Transmit BIT word */ +#define MILSTD_BMMODF_DBC_Pos 8 /*!< Dynamic bus control */ +#define MILSTD_BMMODF_IST_Pos 9 /*!< Initiate self test */ +#define MILSTD_BMMODF_ISTB_Pos 10 /*!< Initiate self test broadcast */ +#define MILSTD_BMMODF_ITF_Pos 11 /*!< Inhibit terminal flag */ +#define MILSTD_BMMODF_ITFB_Pos 12 /*!< Inhibit termital flag broadcast */ +#define MILSTD_BMMODF_RRT_Pos 13 /*!< Reset RT */ +#define MILSTD_BMMODF_RRTB_Pos 14 /*!< Reset RT broadcast */ +#define MILSTD_BMMODF_TSW_Pos 15 /*!< Transmit status word */ +#define MILSTD_BMMODF_TLC_Pos 16 /*!< Transmit last command */ +#define MILSTD_BMMODF_STS_Pos 17 /*!< Selected transmitter shutdown */ +#define MILSTD_BMMODF_STSB_Pos 18 /*!< Selected transmitter shutdown broadcast */ + +/* Bit field masks: */ +#define MILSTD_BMMODF_S_Msk 0x00000001UL /*!< Syncronize */ +#define MILSTD_BMMODF_SB_Msk 0x00000002UL /*!< Syncronize broadcast */ +#define MILSTD_BMMODF_SD_Msk 0x00000004UL /*!< Syncronize with data word */ +#define MILSTD_BMMODF_SDB_Msk 0x00000008UL /*!< Syncronize with data word broadcast */ +#define MILSTD_BMMODF_TS_Msk 0x00000010UL /*!< Transmitter shutdown */ +#define MILSTD_BMMODF_TSB_Msk 0x00000020UL /*!< Transmitter shutdown broadcast */ +#define MILSTD_BMMODF_TVW_Msk 0x00000040UL /*!< Transmit vector word */ +#define MILSTD_BMMODF_TBW_Msk 0x00000080UL /*!< Transmit BIT word */ +#define MILSTD_BMMODF_DBC_Msk 0x00000100UL /*!< Dynamic bus control */ +#define MILSTD_BMMODF_IST_Msk 0x00000200UL /*!< Initiate self test */ +#define MILSTD_BMMODF_ISTB_Msk 0x00000400UL /*!< Initiate self test broadcast */ +#define MILSTD_BMMODF_ITF_Msk 0x00000800UL /*!< Inhibit terminal flag */ +#define MILSTD_BMMODF_ITFB_Msk 0x00001000UL /*!< Inhibit termital flag broadcast */ +#define MILSTD_BMMODF_RRT_Msk 0x00002000UL /*!< Reset RT */ +#define MILSTD_BMMODF_RRTB_Msk 0x00004000UL /*!< Reset RT broadcast */ +#define MILSTD_BMMODF_TSW_Msk 0x00008000UL /*!< Transmit status word */ +#define MILSTD_BMMODF_TLC_Msk 0x00010000UL /*!< Transmit last command */ +#define MILSTD_BMMODF_STS_Msk 0x00020000UL /*!< Selected transmitter shutdown */ +#define MILSTD_BMMODF_STSB_Msk 0x00040000UL /*!< Selected transmitter shutdown broadcast */ + +/*-- BMLBS: BM log buffer start ------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BMBS :32; /*!< BM log buffer start */ +} _MILSTD_BMLBS_bits; + +/* Bit field positions: */ +#define MILSTD_BMLBS_BMBS_Pos 0 /*!< BM log buffer start */ + +/* Bit field masks: */ +#define MILSTD_BMLBS_BMBS_Msk 0xFFFFFFFFUL /*!< BM log buffer start */ + +/*-- BMLBE: BM log buffer end --------------------------------------------------------------------------------*/ +typedef struct { + uint32_t BMBE :22; /*!< BM log buffer end */ +} _MILSTD_BMLBE_bits; + +/* Bit field positions: */ +#define MILSTD_BMLBE_BMBE_Pos 0 /*!< BM log buffer end */ + +/* Bit field masks: */ +#define MILSTD_BMLBE_BMBE_Msk 0x003FFFFFUL /*!< BM log buffer end */ + +/*-- BMLBP: BM log buffer position ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t BMBP :22; /*!< BM log buffer position */ +} _MILSTD_BMLBP_bits; + +/* Bit field positions: */ +#define MILSTD_BMLBP_BMBP_Pos 0 /*!< BM log buffer position */ + +/* Bit field masks: */ +#define MILSTD_BMLBP_BMBP_Msk 0x003FFFFFUL /*!< BM log buffer position */ + +/*-- BMTIM: BM time tag control register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t BMTVAL :24; /*!< Time tag value */ + uint32_t BMTRES :8; /*!< Time tag resolution */ +} _MILSTD_BMTIM_bits; + +/* Bit field positions: */ +#define MILSTD_BMTIM_BMTVAL_Pos 0 /*!< Time tag value */ +#define MILSTD_BMTIM_BMTRES_Pos 24 /*!< Time tag resolution */ + +/* Bit field masks: */ +#define MILSTD_BMTIM_BMTVAL_Msk 0x00FFFFFFUL /*!< Time tag value */ +#define MILSTD_BMTIM_BMTRES_Msk 0xFF000000UL /*!< Time tag resolution */ + +typedef struct { + union { /*!< BSI interrupt register */ + __IO uint32_t IR; /*!< IR : type used for word access */ + __IO _MILSTD_IR_bits IR_bit; /*!< IR_bit: structure used for bit access */ + }; + union { /*!< BSI interrupt enable register */ + __IO uint32_t IENR; /*!< IENR : type used for word access */ + __IO _MILSTD_IENR_bits IENR_bit; /*!< IENR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[2]; + union { /*!< BSI hardware configuration register */ + __I uint32_t HCON; /*!< HCON : type used for word access */ + __I _MILSTD_HCON_bits HCON_bit; /*!< HCON_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1[11]; + union { /*!< BC status and config register */ + __IO uint32_t BCSTCON; /*!< BCSTCON : type used for word access */ + __IO _MILSTD_BCSTCON_bits BCSTCON_bit; /*!< BCSTCON_bit: structure used for bit access */ + }; + union { /*!< BC action register */ + __O uint32_t BCACT; /*!< BCACT : type used for word access */ + __O _MILSTD_BCACT_bits BCACT_bit; /*!< BCACT_bit: structure used for bit access */ + }; + union { /*!< BC transfer list next pointer */ + __IO uint32_t BCLNP; /*!< BCLNP : type used for word access */ + __IO _MILSTD_BCLNP_bits BCLNP_bit; /*!< BCLNP_bit: structure used for bit access */ + }; + union { /*!< BC asynchronous list next pointer register */ + __IO uint32_t BCALNP; /*!< BCALNP : type used for word access */ + __IO _MILSTD_BCALNP_bits BCALNP_bit; /*!< BCALNP_bit: structure used for bit access */ + }; + union { /*!< BC timer register */ + __I uint32_t BCTIM; /*!< BCTIM : type used for word access */ + __I _MILSTD_BCTIM_bits BCTIM_bit; /*!< BCTIM_bit: structure used for bit access */ + }; + union { /*!< BC timer wake-up register */ + __IO uint32_t BCTIMWK; /*!< BCTIMWK : type used for word access */ + __IO _MILSTD_BCTIMWK_bits BCTIMWK_bit; /*!< BCTIMWK_bit: structure used for bit access */ + }; + union { /*!< BC transfer-triggered IRQ ring position register */ + __IO uint32_t BCTRP; /*!< BCTRP : type used for word access */ + __IO _MILSTD_BCTRP_bits BCTRP_bit; /*!< BCTRP_bit: structure used for bit access */ + }; + union { /*!< BC per-RT bus swap register */ + __IO uint32_t BCBSW; /*!< BCBSW : type used for word access */ + __IO _MILSTD_BCBSW_bits BCBSW_bit; /*!< BCBSW_bit: structure used for bit access */ + }; + __IO uint32_t Reserved2[2]; + union { /*!< BC transfer list current slot pointer */ + __I uint32_t BCTSP; /*!< BCTSP : type used for word access */ + __I _MILSTD_BCTSP_bits BCTSP_bit; /*!< BCTSP_bit: structure used for bit access */ + }; + union { /*!< BC asynchronous list current slot pointer */ + __I uint32_t BCATSP; /*!< BCATSP : type used for word access */ + __I _MILSTD_BCATSP_bits BCATSP_bit; /*!< BCATSP_bit: structure used for bit access */ + }; + __IO uint32_t Reserved3[4]; + union { /*!< RT status register */ + __I uint32_t RTSTAT; /*!< RTSTAT : type used for word access */ + __I _MILSTD_RTSTAT_bits RTSTAT_bit; /*!< RTSTAT_bit: structure used for bit access */ + }; + union { /*!< RT config register */ + __IO uint32_t RTCON; /*!< RTCON : type used for word access */ + __IO _MILSTD_RTCON_bits RTCON_bit; /*!< RTCON_bit: structure used for bit access */ + }; + union { /*!< RT bus status register */ + __IO uint32_t RTBST; /*!< RTBST : type used for word access */ + __IO _MILSTD_RTBST_bits RTBST_bit; /*!< RTBST_bit: structure used for bit access */ + }; + union { /*!< RT status words register */ + __IO uint32_t RTSW; /*!< RTSW : type used for word access */ + __IO _MILSTD_RTSW_bits RTSW_bit; /*!< RTSW_bit: structure used for bit access */ + }; + union { /*!< RT sync register */ + __I uint32_t RTSYNC; /*!< RTSYNC : type used for word access */ + __I _MILSTD_RTSYNC_bits RTSYNC_bit; /*!< RTSYNC_bit: structure used for bit access */ + }; + union { /*!< RT subaddress table base address */ + __IO uint32_t RTSADDR; /*!< RTSADDR : type used for word access */ + __IO _MILSTD_RTSADDR_bits RTSADDR_bit; /*!< RTSADDR_bit: structure used for bit access */ + }; + union { /*!< RT mode control register */ + __IO uint32_t RTMOD; /*!< RTMOD : type used for word access */ + __IO _MILSTD_RTMOD_bits RTMOD_bit; /*!< RTMOD_bit: structure used for bit access */ + }; + __IO uint32_t Reserved4[2]; + union { /*!< RT time tag control register */ + __IO uint32_t RTTIM; /*!< RTTIM : type used for word access */ + __IO _MILSTD_RTTIM_bits RTTIM_bit; /*!< RTTIM_bit: structure used for bit access */ + }; + __IO uint32_t Reserved5; + union { /*!< RT event log mask register */ + __IO uint32_t RTELMSK; /*!< RTELMSK : type used for word access */ + __IO _MILSTD_RTELMSK_bits RTELMSK_bit; /*!< RTELMSK_bit: structure used for bit access */ + }; + union { /*!< RT event log position pointer */ + __IO uint32_t RTELP; /*!< RTELP : type used for word access */ + __IO _MILSTD_RTELP_bits RTELP_bit; /*!< RTELP_bit: structure used for bit access */ + }; + union { /*!< RT event log interrupt position register */ + __I uint32_t RTELIP; /*!< RTELIP : type used for word access */ + __I _MILSTD_RTELIP_bits RTELIP_bit; /*!< RTELIP_bit: structure used for bit access */ + }; + __IO uint32_t Reserved6[2]; + union { /*!< BM status register */ + __I uint32_t BMSTAT; /*!< BMSTAT : type used for word access */ + __I _MILSTD_BMSTAT_bits BMSTAT_bit; /*!< BMSTAT_bit: structure used for bit access */ + }; + union { /*!< BM control register */ + __IO uint32_t BMCON; /*!< BMCON : type used for word access */ + __IO _MILSTD_BMCON_bits BMCON_bit; /*!< BMCON_bit: structure used for bit access */ + }; + union { /*!< BM RT address filter register */ + __IO uint32_t BMADF; /*!< BMADF : type used for word access */ + __IO _MILSTD_BMADF_bits BMADF_bit; /*!< BMADF_bit: structure used for bit access */ + }; + union { /*!< BM RT subaddress filter register */ + __IO uint32_t BMSADF; /*!< BMSADF : type used for word access */ + __IO _MILSTD_BMSADF_bits BMSADF_bit; /*!< BMSADF_bit: structure used for bit access */ + }; + union { /*!< BM RT mode code filter register */ + __IO uint32_t BMMODF; /*!< BMMODF : type used for word access */ + __IO _MILSTD_BMMODF_bits BMMODF_bit; /*!< BMMODF_bit: structure used for bit access */ + }; + union { /*!< BM log buffer start */ + __IO uint32_t BMLBS; /*!< BMLBS : type used for word access */ + __IO _MILSTD_BMLBS_bits BMLBS_bit; /*!< BMLBS_bit: structure used for bit access */ + }; + union { /*!< BM log buffer end */ + __IO uint32_t BMLBE; /*!< BMLBE : type used for word access */ + __IO _MILSTD_BMLBE_bits BMLBE_bit; /*!< BMLBE_bit: structure used for bit access */ + }; + union { /*!< BM log buffer position */ + __IO uint32_t BMLBP; /*!< BMLBP : type used for word access */ + __IO _MILSTD_BMLBP_bits BMLBP_bit; /*!< BMLBP_bit: structure used for bit access */ + }; + union { /*!< BM time tag control register */ + __IO uint32_t BMTIM; /*!< BMTIM : type used for word access */ + __IO _MILSTD_BMTIM_bits BMTIM_bit; /*!< BMTIM_bit: structure used for bit access */ + }; +} MILSTD_TypeDef; + + +/******************************************************************************/ +/* SPWRTMR registers */ +/******************************************************************************/ + +/*-- CFG: SpaceWire Tick Control Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t T0EN :1; /*!< Enable timer 0 count */ + uint32_t T1EN :1; /*!< Enable timer 1 count */ +} _SPWRTMR_CFG_bits; + +/* Bit field positions: */ +#define SPWRTMR_CFG_T0EN_Pos 0 /*!< Enable timer 0 count */ +#define SPWRTMR_CFG_T1EN_Pos 1 /*!< Enable timer 1 count */ + +/* Bit field masks: */ +#define SPWRTMR_CFG_T0EN_Msk 0x00000001UL /*!< Enable timer 0 count */ +#define SPWRTMR_CFG_T1EN_Msk 0x00000002UL /*!< Enable timer 1 count */ + +/*-- REL0: SpaceWire Timer 0 Reload value register -----------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Timer 0 Reload value */ +} _SPWRTMR_REL0_bits; + +/* Bit field positions: */ +#define SPWRTMR_REL0_VAL_Pos 0 /*!< Timer 0 Reload value */ + +/* Bit field masks: */ +#define SPWRTMR_REL0_VAL_Msk 0xFFFFFFFFUL /*!< Timer 0 Reload value */ + +/*-- REL1: SpaceWire Timer 1 Reload value register -----------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Timer 1 Reload value */ +} _SPWRTMR_REL1_bits; + +/* Bit field positions: */ +#define SPWRTMR_REL1_VAL_Pos 0 /*!< Timer 1 Reload value */ + +/* Bit field masks: */ +#define SPWRTMR_REL1_VAL_Msk 0xFFFFFFFFUL /*!< Timer 1 Reload value */ + +typedef struct { + union { /*!< SpaceWire Tick Control Register */ + __IO uint32_t CFG; /*!< CFG : type used for word access */ + __IO _SPWRTMR_CFG_bits CFG_bit; /*!< CFG_bit: structure used for bit access */ + }; + union { /*!< SpaceWire Timer 0 Reload value register */ + __IO uint32_t REL0; /*!< REL0 : type used for word access */ + __IO _SPWRTMR_REL0_bits REL0_bit; /*!< REL0_bit: structure used for bit access */ + }; + union { /*!< SpaceWire Timer 1 Reload value register */ + __IO uint32_t REL1; /*!< REL1 : type used for word access */ + __IO _SPWRTMR_REL1_bits REL1_bit; /*!< REL1_bit: structure used for bit access */ + }; +} SPWRTMR_TypeDef; + + +/******************************************************************************/ +/* SPWR registers */ +/******************************************************************************/ + +/*-- CTRL: Control Register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t LD :1; /*!< Link Disable */ + uint32_t LS :1; /*!< Link Start */ + uint32_t AS :1; /*!< Link Autostart */ + uint32_t IE :1; /*!< Interrupt Enable */ + uint32_t TI :1; /*!< Tick In */ + uint32_t PM :1; /*!< Promiscious Mode */ + uint32_t RS :1; /*!< Reset */ + uint32_t :1; /*!< RESERVED */ + uint32_t TQ :1; /*!< Tick-out IRQ */ + uint32_t LI :1; /*!< Link Error IRQ */ + uint32_t TT :1; /*!< Time TX enable */ + uint32_t TR :1; /*!< Time RX enable */ + uint32_t TF :1; /*!< Time_coded control flag filter */ + uint32_t TL :1; /*!< Transmitter enable lock control */ +} _SPWR_CTRL_bits; + +/* Bit field positions: */ +#define SPWR_CTRL_LD_Pos 0 /*!< Link Disable */ +#define SPWR_CTRL_LS_Pos 1 /*!< Link Start */ +#define SPWR_CTRL_AS_Pos 2 /*!< Link Autostart */ +#define SPWR_CTRL_IE_Pos 3 /*!< Interrupt Enable */ +#define SPWR_CTRL_TI_Pos 4 /*!< Tick In */ +#define SPWR_CTRL_PM_Pos 5 /*!< Promiscious Mode */ +#define SPWR_CTRL_RS_Pos 6 /*!< Reset */ +#define SPWR_CTRL_TQ_Pos 8 /*!< Tick-out IRQ */ +#define SPWR_CTRL_LI_Pos 9 /*!< Link Error IRQ */ +#define SPWR_CTRL_TT_Pos 10 /*!< Time TX enable */ +#define SPWR_CTRL_TR_Pos 11 /*!< Time RX enable */ +#define SPWR_CTRL_TF_Pos 12 /*!< Time_coded control flag filter */ +#define SPWR_CTRL_TL_Pos 13 /*!< Transmitter enable lock control */ + +/* Bit field masks: */ +#define SPWR_CTRL_LD_Msk 0x00000001UL /*!< Link Disable */ +#define SPWR_CTRL_LS_Msk 0x00000002UL /*!< Link Start */ +#define SPWR_CTRL_AS_Msk 0x00000004UL /*!< Link Autostart */ +#define SPWR_CTRL_IE_Msk 0x00000008UL /*!< Interrupt Enable */ +#define SPWR_CTRL_TI_Msk 0x00000010UL /*!< Tick In */ +#define SPWR_CTRL_PM_Msk 0x00000020UL /*!< Promiscious Mode */ +#define SPWR_CTRL_RS_Msk 0x00000040UL /*!< Reset */ +#define SPWR_CTRL_TQ_Msk 0x00000100UL /*!< Tick-out IRQ */ +#define SPWR_CTRL_LI_Msk 0x00000200UL /*!< Link Error IRQ */ +#define SPWR_CTRL_TT_Msk 0x00000400UL /*!< Time TX enable */ +#define SPWR_CTRL_TR_Msk 0x00000800UL /*!< Time RX enable */ +#define SPWR_CTRL_TF_Msk 0x00001000UL /*!< Time_coded control flag filter */ +#define SPWR_CTRL_TL_Msk 0x00002000UL /*!< Transmitter enable lock control */ + +/*-- STAT: Status Register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t TO :1; /*!< New Timecount value was received */ + uint32_t CE :1; /*!< Credit Error */ + uint32_t ER :1; /*!< Escape Error */ + uint32_t DE :1; /*!< Disconnect Error */ + uint32_t PE :1; /*!< Parity Error */ + uint32_t :2; /*!< RESERVED */ + uint32_t IA :1; /*!< Invalid Address */ + uint32_t EE :1; /*!< Early EOP/EEP received */ + uint32_t :12; /*!< RESERVED */ + uint32_t LS :3; /*!< Link State */ +} _SPWR_STAT_bits; + +/* Bit field positions: */ +#define SPWR_STAT_TO_Pos 0 /*!< New Timecount value was received */ +#define SPWR_STAT_CE_Pos 1 /*!< Credit Error */ +#define SPWR_STAT_ER_Pos 2 /*!< Escape Error */ +#define SPWR_STAT_DE_Pos 3 /*!< Disconnect Error */ +#define SPWR_STAT_PE_Pos 4 /*!< Parity Error */ +#define SPWR_STAT_IA_Pos 7 /*!< Invalid Address */ +#define SPWR_STAT_EE_Pos 8 /*!< Early EOP/EEP received */ +#define SPWR_STAT_LS_Pos 21 /*!< Link State */ + +/* Bit field masks: */ +#define SPWR_STAT_TO_Msk 0x00000001UL /*!< New Timecount value was received */ +#define SPWR_STAT_CE_Msk 0x00000002UL /*!< Credit Error */ +#define SPWR_STAT_ER_Msk 0x00000004UL /*!< Escape Error */ +#define SPWR_STAT_DE_Msk 0x00000008UL /*!< Disconnect Error */ +#define SPWR_STAT_PE_Msk 0x00000010UL /*!< Parity Error */ +#define SPWR_STAT_IA_Msk 0x00000080UL /*!< Invalid Address */ +#define SPWR_STAT_EE_Msk 0x00000100UL /*!< Early EOP/EEP received */ +#define SPWR_STAT_LS_Msk 0x00E00000UL /*!< Link State */ + +/* Bit field enums: */ +typedef enum { + SPWR_STAT_LS_ErrorReset = 0x0UL, /*!< error reset state */ + SPWR_STAT_LS_ErrorWait = 0x1UL, /*!< error wait state */ + SPWR_STAT_LS_Ready = 0x2UL, /*!< ready state */ + SPWR_STAT_LS_Started = 0x3UL, /*!< started state */ + SPWR_STAT_LS_Connecting = 0x4UL, /*!< connecting state */ + SPWR_STAT_LS_Run = 0x5UL, /*!< run state */ +} SPWR_STAT_LS_Enum; + +/*-- DEFADDR: Default Address Register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t DA :8; /*!< Default Address */ + uint32_t DM :8; /*!< Default address mask */ +} _SPWR_DEFADDR_bits; + +/* Bit field positions: */ +#define SPWR_DEFADDR_DA_Pos 0 /*!< Default Address */ +#define SPWR_DEFADDR_DM_Pos 8 /*!< Default address mask */ + +/* Bit field masks: */ +#define SPWR_DEFADDR_DA_Msk 0x000000FFUL /*!< Default Address */ +#define SPWR_DEFADDR_DM_Msk 0x0000FF00UL /*!< Default address mask */ + +/*-- CLKDIV: Clock Divisor Register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t CKDRUN :8; /*!< Clock Divisor In Run State */ + uint32_t CKDSTRT :8; /*!< Clock Divisor in startup */ +} _SPWR_CLKDIV_bits; + +/* Bit field positions: */ +#define SPWR_CLKDIV_CKDRUN_Pos 0 /*!< Clock Divisor In Run State */ +#define SPWR_CLKDIV_CKDSTRT_Pos 8 /*!< Clock Divisor in startup */ + +/* Bit field masks: */ +#define SPWR_CLKDIV_CKDRUN_Msk 0x000000FFUL /*!< Clock Divisor In Run State */ +#define SPWR_CLKDIV_CKDSTRT_Msk 0x0000FF00UL /*!< Clock Divisor in startup */ + +/*-- TIMECODE: Time Code Register ----------------------------------------------------------------------------*/ +typedef struct { + uint32_t TCNT :6; /*!< Time Counter Value */ + uint32_t TCTRL :2; /*!< Time Control Flags */ +} _SPWR_TIMECODE_bits; + +/* Bit field positions: */ +#define SPWR_TIMECODE_TCNT_Pos 0 /*!< Time Counter Value */ +#define SPWR_TIMECODE_TCTRL_Pos 6 /*!< Time Control Flags */ + +/* Bit field masks: */ +#define SPWR_TIMECODE_TCNT_Msk 0x0000003FUL /*!< Time Counter Value */ +#define SPWR_TIMECODE_TCTRL_Msk 0x000000C0UL /*!< Time Control Flags */ + +/*-- DMACSR: DMA Control/Status Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t TE :1; /*!< Transmitter Enable */ + uint32_t RE :1; /*!< Receiver Rnable */ + uint32_t TI :1; /*!< Transmit Interrupt */ + uint32_t RI :1; /*!< Receive Interrupt */ + uint32_t AI :1; /*!< AHB Error Interrupt */ + uint32_t PS :1; /*!< Packet Sent */ + uint32_t PR :1; /*!< Packet Received */ + uint32_t TA :1; /*!< TX AHB Error */ + uint32_t RA :1; /*!< RX AHB Error */ + uint32_t AT :1; /*!< Abort Tx */ + uint32_t RX :1; /*!< RX Active */ + uint32_t RD :1; /*!< RX descriptors Available */ + uint32_t NS :1; /*!< No Spills */ + uint32_t EN :1; /*!< Enable Address */ + uint32_t SA :1; /*!< Strip Address */ + uint32_t SP :1; /*!< Strip PID */ + uint32_t LE :1; /*!< Link Error Disable transmitter */ + uint32_t TL :1; /*!< Transmiter Enable Lock */ + uint32_t TP :1; /*!< Transmit packet IRQ */ + uint32_t RP :1; /*!< Receive packet IRQ */ + uint32_t :2; /*!< RESERVED */ + uint32_t TR :1; /*!< Truncated */ + uint32_t EP :1; /*!< EEP Termination */ +} _SPWR_DMACSR_bits; + +/* Bit field positions: */ +#define SPWR_DMACSR_TE_Pos 0 /*!< Transmitter Enable */ +#define SPWR_DMACSR_RE_Pos 1 /*!< Receiver Rnable */ +#define SPWR_DMACSR_TI_Pos 2 /*!< Transmit Interrupt */ +#define SPWR_DMACSR_RI_Pos 3 /*!< Receive Interrupt */ +#define SPWR_DMACSR_AI_Pos 4 /*!< AHB Error Interrupt */ +#define SPWR_DMACSR_PS_Pos 5 /*!< Packet Sent */ +#define SPWR_DMACSR_PR_Pos 6 /*!< Packet Received */ +#define SPWR_DMACSR_TA_Pos 7 /*!< TX AHB Error */ +#define SPWR_DMACSR_RA_Pos 8 /*!< RX AHB Error */ +#define SPWR_DMACSR_AT_Pos 9 /*!< Abort Tx */ +#define SPWR_DMACSR_RX_Pos 10 /*!< RX Active */ +#define SPWR_DMACSR_RD_Pos 11 /*!< RX descriptors Available */ +#define SPWR_DMACSR_NS_Pos 12 /*!< No Spills */ +#define SPWR_DMACSR_EN_Pos 13 /*!< Enable Address */ +#define SPWR_DMACSR_SA_Pos 14 /*!< Strip Address */ +#define SPWR_DMACSR_SP_Pos 15 /*!< Strip PID */ +#define SPWR_DMACSR_LE_Pos 16 /*!< Link Error Disable transmitter */ +#define SPWR_DMACSR_TL_Pos 17 /*!< Transmiter Enable Lock */ +#define SPWR_DMACSR_TP_Pos 18 /*!< Transmit packet IRQ */ +#define SPWR_DMACSR_RP_Pos 19 /*!< Receive packet IRQ */ +#define SPWR_DMACSR_TR_Pos 22 /*!< Truncated */ +#define SPWR_DMACSR_EP_Pos 23 /*!< EEP Termination */ + +/* Bit field masks: */ +#define SPWR_DMACSR_TE_Msk 0x00000001UL /*!< Transmitter Enable */ +#define SPWR_DMACSR_RE_Msk 0x00000002UL /*!< Receiver Rnable */ +#define SPWR_DMACSR_TI_Msk 0x00000004UL /*!< Transmit Interrupt */ +#define SPWR_DMACSR_RI_Msk 0x00000008UL /*!< Receive Interrupt */ +#define SPWR_DMACSR_AI_Msk 0x00000010UL /*!< AHB Error Interrupt */ +#define SPWR_DMACSR_PS_Msk 0x00000020UL /*!< Packet Sent */ +#define SPWR_DMACSR_PR_Msk 0x00000040UL /*!< Packet Received */ +#define SPWR_DMACSR_TA_Msk 0x00000080UL /*!< TX AHB Error */ +#define SPWR_DMACSR_RA_Msk 0x00000100UL /*!< RX AHB Error */ +#define SPWR_DMACSR_AT_Msk 0x00000200UL /*!< Abort Tx */ +#define SPWR_DMACSR_RX_Msk 0x00000400UL /*!< RX Active */ +#define SPWR_DMACSR_RD_Msk 0x00000800UL /*!< RX descriptors Available */ +#define SPWR_DMACSR_NS_Msk 0x00001000UL /*!< No Spills */ +#define SPWR_DMACSR_EN_Msk 0x00002000UL /*!< Enable Address */ +#define SPWR_DMACSR_SA_Msk 0x00004000UL /*!< Strip Address */ +#define SPWR_DMACSR_SP_Msk 0x00008000UL /*!< Strip PID */ +#define SPWR_DMACSR_LE_Msk 0x00010000UL /*!< Link Error Disable transmitter */ +#define SPWR_DMACSR_TL_Msk 0x00020000UL /*!< Transmiter Enable Lock */ +#define SPWR_DMACSR_TP_Msk 0x00040000UL /*!< Transmit packet IRQ */ +#define SPWR_DMACSR_RP_Msk 0x00080000UL /*!< Receive packet IRQ */ +#define SPWR_DMACSR_TR_Msk 0x00400000UL /*!< Truncated */ +#define SPWR_DMACSR_EP_Msk 0x00800000UL /*!< EEP Termination */ + +/*-- DMARXLEN: DMA RX Maximum Length Register ----------------------------------------------------------------*/ +typedef struct { + uint32_t RXMAXLEN :25; /*!< RX maximum length packet value */ +} _SPWR_DMARXLEN_bits; + +/* Bit field positions: */ +#define SPWR_DMARXLEN_RXMAXLEN_Pos 0 /*!< RX maximum length packet value */ + +/* Bit field masks: */ +#define SPWR_DMARXLEN_RXMAXLEN_Msk 0x01FFFFFFUL /*!< RX maximum length packet value */ + +/*-- DMATDTADDR: DMA Transmit Descriptor Table Address Register ----------------------------------------------*/ +typedef struct { + uint32_t :4; /*!< RESERVED */ + uint32_t SEL :6; /*!< Descriptor Selector */ + uint32_t BADDR :22; /*!< Descriptor Table Base Address */ +} _SPWR_DMATDTADDR_bits; + +/* Bit field positions: */ +#define SPWR_DMATDTADDR_SEL_Pos 4 /*!< Descriptor Selector */ +#define SPWR_DMATDTADDR_BADDR_Pos 10 /*!< Descriptor Table Base Address */ + +/* Bit field masks: */ +#define SPWR_DMATDTADDR_SEL_Msk 0x000003F0UL /*!< Descriptor Selector */ +#define SPWR_DMATDTADDR_BADDR_Msk 0xFFFFFC00UL /*!< Descriptor Table Base Address */ + +/*-- DMARDTADDR: DMA Receive Descriptor Table Address Register -----------------------------------------------*/ +typedef struct { + uint32_t :3; /*!< RESERVED */ + uint32_t SEL :7; /*!< Descriptor Selector */ + uint32_t BADDR :22; /*!< Descriptor Table Base Address */ +} _SPWR_DMARDTADDR_bits; + +/* Bit field positions: */ +#define SPWR_DMARDTADDR_SEL_Pos 3 /*!< Descriptor Selector */ +#define SPWR_DMARDTADDR_BADDR_Pos 10 /*!< Descriptor Table Base Address */ + +/* Bit field masks: */ +#define SPWR_DMARDTADDR_SEL_Msk 0x000003F8UL /*!< Descriptor Selector */ +#define SPWR_DMARDTADDR_BADDR_Msk 0xFFFFFC00UL /*!< Descriptor Table Base Address */ + +/*-- DMAADDR: -----------------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t ADDR :8; /*!< Address Value For Node Identification */ + uint32_t MASK :8; /*!< Mask value for node Identification */ +} _SPWR_DMAADDR_bits; + +/* Bit field positions: */ +#define SPWR_DMAADDR_ADDR_Pos 0 /*!< Address Value For Node Identification */ +#define SPWR_DMAADDR_MASK_Pos 8 /*!< Mask value for node Identification */ + +/* Bit field masks: */ +#define SPWR_DMAADDR_ADDR_Msk 0x000000FFUL /*!< Address Value For Node Identification */ +#define SPWR_DMAADDR_MASK_Msk 0x0000FF00UL /*!< Mask value for node Identification */ + +typedef struct { + union { /*!< Control Register */ + __IO uint32_t CTRL; /*!< CTRL : type used for word access */ + __IO _SPWR_CTRL_bits CTRL_bit; /*!< CTRL_bit: structure used for bit access */ + }; + union { /*!< Status Register */ + __IO uint32_t STAT; /*!< STAT : type used for word access */ + __IO _SPWR_STAT_bits STAT_bit; /*!< STAT_bit: structure used for bit access */ + }; + union { /*!< Default Address Register */ + __IO uint32_t DEFADDR; /*!< DEFADDR : type used for word access */ + __IO _SPWR_DEFADDR_bits DEFADDR_bit; /*!< DEFADDR_bit: structure used for bit access */ + }; + union { /*!< Clock Divisor Register */ + __IO uint32_t CLKDIV; /*!< CLKDIV : type used for word access */ + __IO _SPWR_CLKDIV_bits CLKDIV_bit; /*!< CLKDIV_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0; + union { /*!< Time Code Register */ + __IO uint32_t TIMECODE; /*!< TIMECODE : type used for word access */ + __IO _SPWR_TIMECODE_bits TIMECODE_bit; /*!< TIMECODE_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1[2]; + union { /*!< DMA Control/Status Register */ + __IO uint32_t DMACSR; /*!< DMACSR : type used for word access */ + __IO _SPWR_DMACSR_bits DMACSR_bit; /*!< DMACSR_bit: structure used for bit access */ + }; + union { /*!< DMA RX Maximum Length Register */ + __IO uint32_t DMARXLEN; /*!< DMARXLEN : type used for word access */ + __IO _SPWR_DMARXLEN_bits DMARXLEN_bit; /*!< DMARXLEN_bit: structure used for bit access */ + }; + union { /*!< DMA Transmit Descriptor Table Address Register */ + __IO uint32_t DMATDTADDR; /*!< DMATDTADDR : type used for word access */ + __IO _SPWR_DMATDTADDR_bits DMATDTADDR_bit; /*!< DMATDTADDR_bit: structure used for bit access */ + }; + union { /*!< DMA Receive Descriptor Table Address Register */ + __IO uint32_t DMARDTADDR; /*!< DMARDTADDR : type used for word access */ + __IO _SPWR_DMARDTADDR_bits DMARDTADDR_bit; /*!< DMARDTADDR_bit: structure used for bit access */ + }; + union { /*!< */ + __IO uint32_t DMAADDR; /*!< DMAADDR : type used for word access */ + __IO _SPWR_DMAADDR_bits DMAADDR_bit; /*!< DMAADDR_bit: structure used for bit access */ + }; +} SPWR_TypeDef; + + +/******************************************************************************/ +/* RTC registers */ +/******************************************************************************/ + +/*-- POS: Parts of seconds register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :10; /*!< Parts of seconds */ +} _RTC_POS_bits; + +/* Bit field positions: */ +#define RTC_POS_VAL_Pos 0 /*!< Parts of seconds */ + +/* Bit field masks: */ +#define RTC_POS_VAL_Msk 0x000003FFUL /*!< Parts of seconds */ + +/*-- SEC: Second register ------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :7; /*!< Seconds in BCD format */ +} _RTC_SEC_bits; + +/* Bit field positions: */ +#define RTC_SEC_VAL_Pos 0 /*!< Seconds in BCD format */ + +/* Bit field masks: */ +#define RTC_SEC_VAL_Msk 0x0000007FUL /*!< Seconds in BCD format */ + +/*-- MIN: Minute register ------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :7; /*!< Minutes in BCD format */ +} _RTC_MIN_bits; + +/* Bit field positions: */ +#define RTC_MIN_VAL_Pos 0 /*!< Minutes in BCD format */ + +/* Bit field masks: */ +#define RTC_MIN_VAL_Msk 0x0000007FUL /*!< Minutes in BCD format */ + +/*-- HOUR: Hour register -------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :6; /*!< Hours in BCD format */ +} _RTC_HOUR_bits; + +/* Bit field positions: */ +#define RTC_HOUR_VAL_Pos 0 /*!< Hours in BCD format */ + +/* Bit field masks: */ +#define RTC_HOUR_VAL_Msk 0x0000003FUL /*!< Hours in BCD format */ + +/*-- DOW: Day of week register -------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :3; /*!< Day of week in BCD format */ +} _RTC_DOW_bits; + +/* Bit field positions: */ +#define RTC_DOW_VAL_Pos 0 /*!< Day of week in BCD format */ + +/* Bit field masks: */ +#define RTC_DOW_VAL_Msk 0x00000007UL /*!< Day of week in BCD format */ + +/*-- DAY: Day register ---------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :6; /*!< Day in BCD format */ +} _RTC_DAY_bits; + +/* Bit field positions: */ +#define RTC_DAY_VAL_Pos 0 /*!< Day in BCD format */ + +/* Bit field masks: */ +#define RTC_DAY_VAL_Msk 0x0000003FUL /*!< Day in BCD format */ + +/*-- MONTH: Month register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :5; /*!< Month in BCD format */ +} _RTC_MONTH_bits; + +/* Bit field positions: */ +#define RTC_MONTH_VAL_Pos 0 /*!< Month in BCD format */ + +/* Bit field masks: */ +#define RTC_MONTH_VAL_Msk 0x0000001FUL /*!< Month in BCD format */ + +/*-- YEAR: Year register -------------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :8; /*!< Year in BCD format */ +} _RTC_YEAR_bits; + +/* Bit field positions: */ +#define RTC_YEAR_VAL_Pos 0 /*!< Year in BCD format */ + +/* Bit field masks: */ +#define RTC_YEAR_VAL_Msk 0x000000FFUL /*!< Year in BCD format */ + +/*-- SHDW: Register Update shadow registers RTC --------------------------------------------------------------*/ +typedef struct { + uint32_t :7; /*!< RESERVED */ + uint32_t UPDTEN :1; /*!< Enable update shadow registers RTC */ +} _RTC_SHDW_bits; + +/* Bit field positions: */ +#define RTC_SHDW_UPDTEN_Pos 7 /*!< Enable update shadow registers RTC */ + +/* Bit field masks: */ +#define RTC_SHDW_UPDTEN_Msk 0x00000080UL /*!< Enable update shadow registers RTC */ + +/*-- TIME: General register Time -----------------------------------------------------------------------------*/ +typedef struct { + uint32_t POS :10; /*!< Parts of seconds */ + uint32_t SEC :7; /*!< Seconds */ + uint32_t MIN :7; /*!< Minutes */ + uint32_t HOUR :6; /*!< Hours */ +} _RTC_TIME_bits; + +/* Bit field positions: */ +#define RTC_TIME_POS_Pos 0 /*!< Parts of seconds */ +#define RTC_TIME_SEC_Pos 10 /*!< Seconds */ +#define RTC_TIME_MIN_Pos 17 /*!< Minutes */ +#define RTC_TIME_HOUR_Pos 24 /*!< Hours */ + +/* Bit field masks: */ +#define RTC_TIME_POS_Msk 0x000003FFUL /*!< Parts of seconds */ +#define RTC_TIME_SEC_Msk 0x0001FC00UL /*!< Seconds */ +#define RTC_TIME_MIN_Msk 0x00FE0000UL /*!< Minutes */ +#define RTC_TIME_HOUR_Msk 0x3F000000UL /*!< Hours */ + +typedef struct { + union { /*!< Parts of seconds register */ + __IO uint32_t POS; /*!< POS : type used for word access */ + __IO _RTC_POS_bits POS_bit; /*!< POS_bit: structure used for bit access */ + }; + union { /*!< Second register */ + __IO uint32_t SEC; /*!< SEC : type used for word access */ + __IO _RTC_SEC_bits SEC_bit; /*!< SEC_bit: structure used for bit access */ + }; + union { /*!< Minute register */ + __IO uint32_t MIN; /*!< MIN : type used for word access */ + __IO _RTC_MIN_bits MIN_bit; /*!< MIN_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0; + union { /*!< Hour register */ + __IO uint32_t HOUR; /*!< HOUR : type used for word access */ + __IO _RTC_HOUR_bits HOUR_bit; /*!< HOUR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved1; + union { /*!< Day of week register */ + __IO uint32_t DOW; /*!< DOW : type used for word access */ + __IO _RTC_DOW_bits DOW_bit; /*!< DOW_bit: structure used for bit access */ + }; + __IO uint32_t Reserved2; + union { /*!< Day register */ + __IO uint32_t DAY; /*!< DAY : type used for word access */ + __IO _RTC_DAY_bits DAY_bit; /*!< DAY_bit: structure used for bit access */ + }; + union { /*!< Month register */ + __IO uint32_t MONTH; /*!< MONTH : type used for word access */ + __IO _RTC_MONTH_bits MONTH_bit; /*!< MONTH_bit: structure used for bit access */ + }; + union { /*!< Year register */ + __IO uint32_t YEAR; /*!< YEAR : type used for word access */ + __IO _RTC_YEAR_bits YEAR_bit; /*!< YEAR_bit: structure used for bit access */ + }; + union { /*!< Register Update shadow registers RTC */ + __O uint32_t SHDW; /*!< SHDW : type used for word access */ + __O _RTC_SHDW_bits SHDW_bit; /*!< SHDW_bit: structure used for bit access */ + }; + union { /*!< General register Time */ + __I uint32_t TIME; /*!< TIME : type used for word access */ + __I _RTC_TIME_bits TIME_bit; /*!< TIME_bit: structure used for bit access */ + }; +} RTC_TypeDef; + + +/******************************************************************************/ +/* LAU registers */ +/******************************************************************************/ + +/*-- INTCTL: Interrupt control register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t POL0 :1; /*!< Interrupt polarity select for LM0 */ + uint32_t POL1 :1; /*!< Interrupt polarity select for LM1 */ + uint32_t POL2 :1; /*!< Interrupt polarity select for LM2 */ + uint32_t POL3 :1; /*!< Interrupt polarity select for LM3 */ + uint32_t POL4 :1; /*!< Interrupt polarity select for LM4 */ + uint32_t POL5 :1; /*!< Interrupt polarity select for LM5 */ + uint32_t POL6 :1; /*!< Interrupt polarity select for LM6 */ + uint32_t POL7 :1; /*!< Interrupt polarity select for LM7 */ + uint32_t TYPE0 :1; /*!< Interrupt type select for LM0 */ + uint32_t TYPE1 :1; /*!< Interrupt type select for LM1 */ + uint32_t TYPE2 :1; /*!< Interrupt type select for LM2 */ + uint32_t TYPE3 :1; /*!< Interrupt type select for LM3 */ + uint32_t TYPE4 :1; /*!< Interrupt type select for LM4 */ + uint32_t TYPE5 :1; /*!< Interrupt type select for LM5 */ + uint32_t TYPE6 :1; /*!< Interrupt type select for LM6 */ + uint32_t TYPE7 :1; /*!< Interrupt type select for LM7 */ +} _LAU_INTCTL_bits; + +/* Bit field positions: */ +#define LAU_INTCTL_POL0_Pos 0 /*!< Interrupt polarity select for LM0 */ +#define LAU_INTCTL_POL1_Pos 1 /*!< Interrupt polarity select for LM1 */ +#define LAU_INTCTL_POL2_Pos 2 /*!< Interrupt polarity select for LM2 */ +#define LAU_INTCTL_POL3_Pos 3 /*!< Interrupt polarity select for LM3 */ +#define LAU_INTCTL_POL4_Pos 4 /*!< Interrupt polarity select for LM4 */ +#define LAU_INTCTL_POL5_Pos 5 /*!< Interrupt polarity select for LM5 */ +#define LAU_INTCTL_POL6_Pos 6 /*!< Interrupt polarity select for LM6 */ +#define LAU_INTCTL_POL7_Pos 7 /*!< Interrupt polarity select for LM7 */ +#define LAU_INTCTL_TYPE0_Pos 8 /*!< Interrupt type select for LM0 */ +#define LAU_INTCTL_TYPE1_Pos 9 /*!< Interrupt type select for LM1 */ +#define LAU_INTCTL_TYPE2_Pos 10 /*!< Interrupt type select for LM2 */ +#define LAU_INTCTL_TYPE3_Pos 11 /*!< Interrupt type select for LM3 */ +#define LAU_INTCTL_TYPE4_Pos 12 /*!< Interrupt type select for LM4 */ +#define LAU_INTCTL_TYPE5_Pos 13 /*!< Interrupt type select for LM5 */ +#define LAU_INTCTL_TYPE6_Pos 14 /*!< Interrupt type select for LM6 */ +#define LAU_INTCTL_TYPE7_Pos 15 /*!< Interrupt type select for LM7 */ + +/* Bit field masks: */ +#define LAU_INTCTL_POL0_Msk 0x00000001UL /*!< Interrupt polarity select for LM0 */ +#define LAU_INTCTL_POL1_Msk 0x00000002UL /*!< Interrupt polarity select for LM1 */ +#define LAU_INTCTL_POL2_Msk 0x00000004UL /*!< Interrupt polarity select for LM2 */ +#define LAU_INTCTL_POL3_Msk 0x00000008UL /*!< Interrupt polarity select for LM3 */ +#define LAU_INTCTL_POL4_Msk 0x00000010UL /*!< Interrupt polarity select for LM4 */ +#define LAU_INTCTL_POL5_Msk 0x00000020UL /*!< Interrupt polarity select for LM5 */ +#define LAU_INTCTL_POL6_Msk 0x00000040UL /*!< Interrupt polarity select for LM6 */ +#define LAU_INTCTL_POL7_Msk 0x00000080UL /*!< Interrupt polarity select for LM7 */ +#define LAU_INTCTL_TYPE0_Msk 0x00000100UL /*!< Interrupt type select for LM0 */ +#define LAU_INTCTL_TYPE1_Msk 0x00000200UL /*!< Interrupt type select for LM1 */ +#define LAU_INTCTL_TYPE2_Msk 0x00000400UL /*!< Interrupt type select for LM2 */ +#define LAU_INTCTL_TYPE3_Msk 0x00000800UL /*!< Interrupt type select for LM3 */ +#define LAU_INTCTL_TYPE4_Msk 0x00001000UL /*!< Interrupt type select for LM4 */ +#define LAU_INTCTL_TYPE5_Msk 0x00002000UL /*!< Interrupt type select for LM5 */ +#define LAU_INTCTL_TYPE6_Msk 0x00004000UL /*!< Interrupt type select for LM6 */ +#define LAU_INTCTL_TYPE7_Msk 0x00008000UL /*!< Interrupt type select for LM7 */ + +/*-- IMSC: Interrupt Mask Set/Clear Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t IMLM0 :1; /*!< LM0 interrupt mask */ + uint32_t IMLM1 :1; /*!< LM1 interrupt mask */ + uint32_t IMLM2 :1; /*!< LM2 interrupt mask */ + uint32_t IMLM3 :1; /*!< LM3 interrupt mask */ + uint32_t IMLM4 :1; /*!< LM4 interrupt mask */ + uint32_t IMLM5 :1; /*!< LM5 interrupt mask */ + uint32_t IMLM6 :1; /*!< LM6 interrupt mask */ + uint32_t IMLM7 :1; /*!< LM7 interrupt mask */ +} _LAU_IMSC_bits; + +/* Bit field positions: */ +#define LAU_IMSC_IMLM0_Pos 0 /*!< LM0 interrupt mask */ +#define LAU_IMSC_IMLM1_Pos 1 /*!< LM1 interrupt mask */ +#define LAU_IMSC_IMLM2_Pos 2 /*!< LM2 interrupt mask */ +#define LAU_IMSC_IMLM3_Pos 3 /*!< LM3 interrupt mask */ +#define LAU_IMSC_IMLM4_Pos 4 /*!< LM4 interrupt mask */ +#define LAU_IMSC_IMLM5_Pos 5 /*!< LM5 interrupt mask */ +#define LAU_IMSC_IMLM6_Pos 6 /*!< LM6 interrupt mask */ +#define LAU_IMSC_IMLM7_Pos 7 /*!< LM7 interrupt mask */ + +/* Bit field masks: */ +#define LAU_IMSC_IMLM0_Msk 0x00000001UL /*!< LM0 interrupt mask */ +#define LAU_IMSC_IMLM1_Msk 0x00000002UL /*!< LM1 interrupt mask */ +#define LAU_IMSC_IMLM2_Msk 0x00000004UL /*!< LM2 interrupt mask */ +#define LAU_IMSC_IMLM3_Msk 0x00000008UL /*!< LM3 interrupt mask */ +#define LAU_IMSC_IMLM4_Msk 0x00000010UL /*!< LM4 interrupt mask */ +#define LAU_IMSC_IMLM5_Msk 0x00000020UL /*!< LM5 interrupt mask */ +#define LAU_IMSC_IMLM6_Msk 0x00000040UL /*!< LM6 interrupt mask */ +#define LAU_IMSC_IMLM7_Msk 0x00000080UL /*!< LM7 interrupt mask */ + +/*-- RIS: Raw Interrupt Status Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t RLM0 :1; /*!< LM0 interrupt status */ + uint32_t RLM1 :1; /*!< LM1 interrupt status */ + uint32_t RLM2 :1; /*!< LM2 interrupt status */ + uint32_t RLM3 :1; /*!< LM3 interrupt status */ + uint32_t RLM4 :1; /*!< LM4 interrupt status */ + uint32_t RLM5 :1; /*!< LM5 interrupt status */ + uint32_t RLM6 :1; /*!< LM6 interrupt status */ + uint32_t RLM7 :1; /*!< LM7 interrupt status */ +} _LAU_RIS_bits; + +/* Bit field positions: */ +#define LAU_RIS_RLM0_Pos 0 /*!< LM0 interrupt status */ +#define LAU_RIS_RLM1_Pos 1 /*!< LM1 interrupt status */ +#define LAU_RIS_RLM2_Pos 2 /*!< LM2 interrupt status */ +#define LAU_RIS_RLM3_Pos 3 /*!< LM3 interrupt status */ +#define LAU_RIS_RLM4_Pos 4 /*!< LM4 interrupt status */ +#define LAU_RIS_RLM5_Pos 5 /*!< LM5 interrupt status */ +#define LAU_RIS_RLM6_Pos 6 /*!< LM6 interrupt status */ +#define LAU_RIS_RLM7_Pos 7 /*!< LM7 interrupt status */ + +/* Bit field masks: */ +#define LAU_RIS_RLM0_Msk 0x00000001UL /*!< LM0 interrupt status */ +#define LAU_RIS_RLM1_Msk 0x00000002UL /*!< LM1 interrupt status */ +#define LAU_RIS_RLM2_Msk 0x00000004UL /*!< LM2 interrupt status */ +#define LAU_RIS_RLM3_Msk 0x00000008UL /*!< LM3 interrupt status */ +#define LAU_RIS_RLM4_Msk 0x00000010UL /*!< LM4 interrupt status */ +#define LAU_RIS_RLM5_Msk 0x00000020UL /*!< LM5 interrupt status */ +#define LAU_RIS_RLM6_Msk 0x00000040UL /*!< LM6 interrupt status */ +#define LAU_RIS_RLM7_Msk 0x00000080UL /*!< LM7 interrupt status */ + +/*-- MIS: Masked Interrupt Status Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t MLM0 :1; /*!< LM0 masked interrupt status */ + uint32_t MLM1 :1; /*!< LM1 masked interrupt status */ + uint32_t MLM2 :1; /*!< LM2 masked interrupt status */ + uint32_t MLM3 :1; /*!< LM3 masked interrupt status */ + uint32_t MLM4 :1; /*!< LM4 masked interrupt status */ + uint32_t MLM5 :1; /*!< LM5 masked interrupt status */ + uint32_t MLM6 :1; /*!< LM6 masked interrupt status */ + uint32_t MLM7 :1; /*!< LM7 masked interrupt status */ +} _LAU_MIS_bits; + +/* Bit field positions: */ +#define LAU_MIS_MLM0_Pos 0 /*!< LM0 masked interrupt status */ +#define LAU_MIS_MLM1_Pos 1 /*!< LM1 masked interrupt status */ +#define LAU_MIS_MLM2_Pos 2 /*!< LM2 masked interrupt status */ +#define LAU_MIS_MLM3_Pos 3 /*!< LM3 masked interrupt status */ +#define LAU_MIS_MLM4_Pos 4 /*!< LM4 masked interrupt status */ +#define LAU_MIS_MLM5_Pos 5 /*!< LM5 masked interrupt status */ +#define LAU_MIS_MLM6_Pos 6 /*!< LM6 masked interrupt status */ +#define LAU_MIS_MLM7_Pos 7 /*!< LM7 masked interrupt status */ + +/* Bit field masks: */ +#define LAU_MIS_MLM0_Msk 0x00000001UL /*!< LM0 masked interrupt status */ +#define LAU_MIS_MLM1_Msk 0x00000002UL /*!< LM1 masked interrupt status */ +#define LAU_MIS_MLM2_Msk 0x00000004UL /*!< LM2 masked interrupt status */ +#define LAU_MIS_MLM3_Msk 0x00000008UL /*!< LM3 masked interrupt status */ +#define LAU_MIS_MLM4_Msk 0x00000010UL /*!< LM4 masked interrupt status */ +#define LAU_MIS_MLM5_Msk 0x00000020UL /*!< LM5 masked interrupt status */ +#define LAU_MIS_MLM6_Msk 0x00000040UL /*!< LM6 masked interrupt status */ +#define LAU_MIS_MLM7_Msk 0x00000080UL /*!< LM7 masked interrupt status */ + +/*-- ICR: Interrupt Clear Register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t ICLM0 :1; /*!< LM0 interrupt clear */ + uint32_t ICLM1 :1; /*!< LM1 interrupt clear */ + uint32_t ICLM2 :1; /*!< LM2 interrupt clear */ + uint32_t ICLM3 :1; /*!< LM3 interrupt clear */ + uint32_t ICLM4 :1; /*!< LM4 interrupt clear */ + uint32_t ICLM5 :1; /*!< LM5 interrupt clear */ + uint32_t ICLM6 :1; /*!< LM6 interrupt clear */ + uint32_t ICLM7 :1; /*!< LM7 interrupt clear */ +} _LAU_ICR_bits; + +/* Bit field positions: */ +#define LAU_ICR_ICLM0_Pos 0 /*!< LM0 interrupt clear */ +#define LAU_ICR_ICLM1_Pos 1 /*!< LM1 interrupt clear */ +#define LAU_ICR_ICLM2_Pos 2 /*!< LM2 interrupt clear */ +#define LAU_ICR_ICLM3_Pos 3 /*!< LM3 interrupt clear */ +#define LAU_ICR_ICLM4_Pos 4 /*!< LM4 interrupt clear */ +#define LAU_ICR_ICLM5_Pos 5 /*!< LM5 interrupt clear */ +#define LAU_ICR_ICLM6_Pos 6 /*!< LM6 interrupt clear */ +#define LAU_ICR_ICLM7_Pos 7 /*!< LM7 interrupt clear */ + +/* Bit field masks: */ +#define LAU_ICR_ICLM0_Msk 0x00000001UL /*!< LM0 interrupt clear */ +#define LAU_ICR_ICLM1_Msk 0x00000002UL /*!< LM1 interrupt clear */ +#define LAU_ICR_ICLM2_Msk 0x00000004UL /*!< LM2 interrupt clear */ +#define LAU_ICR_ICLM3_Msk 0x00000008UL /*!< LM3 interrupt clear */ +#define LAU_ICR_ICLM4_Msk 0x00000010UL /*!< LM4 interrupt clear */ +#define LAU_ICR_ICLM5_Msk 0x00000020UL /*!< LM5 interrupt clear */ +#define LAU_ICR_ICLM6_Msk 0x00000040UL /*!< LM6 interrupt clear */ +#define LAU_ICR_ICLM7_Msk 0x00000080UL /*!< LM7 interrupt clear */ + +/*-- LM: CLKCTL: Clock Control Register -----------------------------------------------------------------------*/ +typedef struct { + uint32_t CLKMUX :3; /*!< Clock select */ + uint32_t CLKEN :1; /*!< Clock enable */ + uint32_t DIV :10; /*!< Clock divider */ + uint32_t :2; /*!< RESERVED */ + uint32_t DIVEN :1; /*!< Clock divider enable */ +} _LAU_LM_CLKCTL_bits; + +/* Bit field positions: */ +#define LAU_LM_CLKCTL_CLKMUX_Pos 0 /*!< Clock select */ +#define LAU_LM_CLKCTL_CLKEN_Pos 3 /*!< Clock enable */ +#define LAU_LM_CLKCTL_DIV_Pos 4 /*!< Clock divider */ +#define LAU_LM_CLKCTL_DIVEN_Pos 16 /*!< Clock divider enable */ + +/* Bit field masks: */ +#define LAU_LM_CLKCTL_CLKMUX_Msk 0x00000007UL /*!< Clock select */ +#define LAU_LM_CLKCTL_CLKEN_Msk 0x00000008UL /*!< Clock enable */ +#define LAU_LM_CLKCTL_DIV_Msk 0x00003FF0UL /*!< Clock divider */ +#define LAU_LM_CLKCTL_DIVEN_Msk 0x00010000UL /*!< Clock divider enable */ + +/*-- LM: INTSEL: Interrupt Selection Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t LUTNUM :3; /*!< LUT chanel to make interrupt */ +} _LAU_LM_INTSEL_bits; + +/* Bit field positions: */ +#define LAU_LM_INTSEL_LUTNUM_Pos 0 /*!< LUT chanel to make interrupt */ + +/* Bit field masks: */ +#define LAU_LM_INTSEL_LUTNUM_Msk 0x00000007UL /*!< LUT chanel to make interrupt */ + +/*-- LM: BUSSEL: LM_BUS Signal Selection Register -------------------------------------------------------------*/ +typedef struct { + uint32_t LMNUM :3; /*!< LUT chanel out to LMBUS */ +} _LAU_LM_BUSSEL_bits; + +/* Bit field positions: */ +#define LAU_LM_BUSSEL_LMNUM_Pos 0 /*!< LUT chanel out to LMBUS */ + +/* Bit field masks: */ +#define LAU_LM_BUSSEL_LMNUM_Msk 0x00000007UL /*!< LUT chanel out to LMBUS */ + +/*-- LM: OUTMUX: LM_OUT Selection Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t OUT0 :3; /*!< LUT chanel connected to OUT_0 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT1 :3; /*!< LUT chanel connected to OUT_1 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT2 :3; /*!< LUT chanel connected to OUT_2 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT3 :3; /*!< LUT chanel connected to OUT_3 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT4 :3; /*!< LUT chanel connected to OUT_4 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT5 :3; /*!< LUT chanel connected to OUT_5 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT6 :3; /*!< LUT chanel connected to OUT_6 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OUT7 :3; /*!< LUT chanel connected to OUT_7 */ +} _LAU_LM_OUTMUX_bits; + +/* Bit field positions: */ +#define LAU_LM_OUTMUX_OUT0_Pos 0 /*!< LUT chanel connected to OUT_0 */ +#define LAU_LM_OUTMUX_OUT1_Pos 4 /*!< LUT chanel connected to OUT_1 */ +#define LAU_LM_OUTMUX_OUT2_Pos 8 /*!< LUT chanel connected to OUT_2 */ +#define LAU_LM_OUTMUX_OUT3_Pos 12 /*!< LUT chanel connected to OUT_3 */ +#define LAU_LM_OUTMUX_OUT4_Pos 16 /*!< LUT chanel connected to OUT_4 */ +#define LAU_LM_OUTMUX_OUT5_Pos 20 /*!< LUT chanel connected to OUT_5 */ +#define LAU_LM_OUTMUX_OUT6_Pos 24 /*!< LUT chanel connected to OUT_6 */ +#define LAU_LM_OUTMUX_OUT7_Pos 28 /*!< LUT chanel connected to OUT_7 */ + +/* Bit field masks: */ +#define LAU_LM_OUTMUX_OUT0_Msk 0x00000007UL /*!< LUT chanel connected to OUT_0 */ +#define LAU_LM_OUTMUX_OUT1_Msk 0x00000070UL /*!< LUT chanel connected to OUT_1 */ +#define LAU_LM_OUTMUX_OUT2_Msk 0x00000700UL /*!< LUT chanel connected to OUT_2 */ +#define LAU_LM_OUTMUX_OUT3_Msk 0x00007000UL /*!< LUT chanel connected to OUT_3 */ +#define LAU_LM_OUTMUX_OUT4_Msk 0x00070000UL /*!< LUT chanel connected to OUT_4 */ +#define LAU_LM_OUTMUX_OUT5_Msk 0x00700000UL /*!< LUT chanel connected to OUT_5 */ +#define LAU_LM_OUTMUX_OUT6_Msk 0x07000000UL /*!< LUT chanel connected to OUT_6 */ +#define LAU_LM_OUTMUX_OUT7_Msk 0x70000000UL /*!< LUT chanel connected to OUT_7 */ + +/*-- LM: OEMUX: LM_OE Selection Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t OE0 :3; /*!< LUT chanel connected to OE_0 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE1 :3; /*!< LUT chanel connected to OE_1 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE2 :3; /*!< LUT chanel connected to OE_2 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE3 :3; /*!< LUT chanel connected to OE_3 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE4 :3; /*!< LUT chanel connected to OE_4 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE5 :3; /*!< LUT chanel connected to OE_5 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE6 :3; /*!< LUT chanel connected to OE_6 */ + uint32_t :1; /*!< RESERVED */ + uint32_t OE7 :3; /*!< LUT chanel connected to OE_7 */ +} _LAU_LM_OEMUX_bits; + +/* Bit field positions: */ +#define LAU_LM_OEMUX_OE0_Pos 0 /*!< LUT chanel connected to OE_0 */ +#define LAU_LM_OEMUX_OE1_Pos 4 /*!< LUT chanel connected to OE_1 */ +#define LAU_LM_OEMUX_OE2_Pos 8 /*!< LUT chanel connected to OE_2 */ +#define LAU_LM_OEMUX_OE3_Pos 12 /*!< LUT chanel connected to OE_3 */ +#define LAU_LM_OEMUX_OE4_Pos 16 /*!< LUT chanel connected to OE_4 */ +#define LAU_LM_OEMUX_OE5_Pos 20 /*!< LUT chanel connected to OE_5 */ +#define LAU_LM_OEMUX_OE6_Pos 24 /*!< LUT chanel connected to OE_6 */ +#define LAU_LM_OEMUX_OE7_Pos 28 /*!< LUT chanel connected to OE_7 */ + +/* Bit field masks: */ +#define LAU_LM_OEMUX_OE0_Msk 0x00000007UL /*!< LUT chanel connected to OE_0 */ +#define LAU_LM_OEMUX_OE1_Msk 0x00000070UL /*!< LUT chanel connected to OE_1 */ +#define LAU_LM_OEMUX_OE2_Msk 0x00000700UL /*!< LUT chanel connected to OE_2 */ +#define LAU_LM_OEMUX_OE3_Msk 0x00007000UL /*!< LUT chanel connected to OE_3 */ +#define LAU_LM_OEMUX_OE4_Msk 0x00070000UL /*!< LUT chanel connected to OE_4 */ +#define LAU_LM_OEMUX_OE5_Msk 0x00700000UL /*!< LUT chanel connected to OE_5 */ +#define LAU_LM_OEMUX_OE6_Msk 0x07000000UL /*!< LUT chanel connected to OE_6 */ +#define LAU_LM_OEMUX_OE7_Msk 0x70000000UL /*!< LUT chanel connected to OE_7 */ + +/*-- LM: OECTL: LM_OE Control Register ------------------------------------------------------------------------*/ +typedef struct { + uint32_t OE0 :2; /*!< Type of OE0 */ + uint32_t OE1 :2; /*!< Type of OE1 */ + uint32_t OE2 :2; /*!< Type of OE2 */ + uint32_t OE3 :2; /*!< Type of OE3 */ + uint32_t OE4 :2; /*!< Type of OE4 */ + uint32_t OE5 :2; /*!< Type of OE5 */ + uint32_t OE6 :2; /*!< Type of OE6 */ + uint32_t OE7 :2; /*!< Type of OE7 */ +} _LAU_LM_OECTL_bits; + +/* Bit field positions: */ +#define LAU_LM_OECTL_OE0_Pos 0 /*!< Type of OE0 */ +#define LAU_LM_OECTL_OE1_Pos 2 /*!< Type of OE1 */ +#define LAU_LM_OECTL_OE2_Pos 4 /*!< Type of OE2 */ +#define LAU_LM_OECTL_OE3_Pos 6 /*!< Type of OE3 */ +#define LAU_LM_OECTL_OE4_Pos 8 /*!< Type of OE4 */ +#define LAU_LM_OECTL_OE5_Pos 10 /*!< Type of OE5 */ +#define LAU_LM_OECTL_OE6_Pos 12 /*!< Type of OE6 */ +#define LAU_LM_OECTL_OE7_Pos 14 /*!< Type of OE7 */ + +/* Bit field masks: */ +#define LAU_LM_OECTL_OE0_Msk 0x00000003UL /*!< Type of OE0 */ +#define LAU_LM_OECTL_OE1_Msk 0x0000000CUL /*!< Type of OE1 */ +#define LAU_LM_OECTL_OE2_Msk 0x00000030UL /*!< Type of OE2 */ +#define LAU_LM_OECTL_OE3_Msk 0x000000C0UL /*!< Type of OE3 */ +#define LAU_LM_OECTL_OE4_Msk 0x00000300UL /*!< Type of OE4 */ +#define LAU_LM_OECTL_OE5_Msk 0x00000C00UL /*!< Type of OE5 */ +#define LAU_LM_OECTL_OE6_Msk 0x00003000UL /*!< Type of OE6 */ +#define LAU_LM_OECTL_OE7_Msk 0x0000C000UL /*!< Type of OE7 */ + +/*-- LM: LUTMUX0: LUT0 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX0_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX0_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX0_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX0_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX0_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX0_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX0_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX0_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX0_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE0: LUT0 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE0_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE0_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE0_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE0_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE0_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE0_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE0_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE0_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE0_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE0_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE0_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE0_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE0_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE0_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE0_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE0_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE0_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF0: LUT0 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF0_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF0_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF0_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF0_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF0_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF0_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF0_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF0_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF0_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF0_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX1: LUT1 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX1_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX1_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX1_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX1_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX1_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX1_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX1_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX1_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX1_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE1: LUT1 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE1_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE1_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE1_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE1_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE1_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE1_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE1_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE1_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE1_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE1_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE1_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE1_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE1_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE1_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE1_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE1_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE1_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF1: LUT1 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF1_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF1_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF1_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF1_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF1_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF1_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF1_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF1_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF1_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF1_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX2: LUT2 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX2_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX2_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX2_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX2_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX2_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX2_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX2_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX2_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX2_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE2: LUT2 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE2_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE2_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE2_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE2_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE2_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE2_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE2_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE2_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE2_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE2_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE2_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE2_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE2_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE2_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE2_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE2_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE2_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF2: LUT2 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF2_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF2_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF2_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF2_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF2_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF2_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF2_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF2_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF2_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF2_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX3: LUT3 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX3_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX3_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX3_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX3_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX3_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX3_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX3_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX3_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX3_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE3: LUT3 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE3_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE3_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE3_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE3_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE3_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE3_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE3_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE3_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE3_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE3_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE3_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE3_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE3_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE3_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE3_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE3_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE3_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF3: LUT3 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF3_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF3_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF3_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF3_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF3_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF3_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF3_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF3_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF3_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF3_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX4: LUT4 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX4_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX4_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX4_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX4_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX4_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX4_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX4_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX4_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX4_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE4: LUT4 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE4_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE4_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE4_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE4_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE4_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE4_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE4_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE4_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE4_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE4_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE4_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE4_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE4_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE4_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE4_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE4_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE4_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF4: LUT4 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF4_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF4_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF4_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF4_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF4_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF4_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF4_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF4_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF4_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF4_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX5: LUT5 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX5_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX5_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX5_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX5_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX5_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX5_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX5_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX5_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX5_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE5: LUT5 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE5_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE5_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE5_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE5_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE5_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE5_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE5_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE5_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE5_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE5_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE5_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE5_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE5_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE5_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE5_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE5_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE5_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF5: LUT5 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF5_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF5_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF5_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF5_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF5_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF5_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF5_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF5_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF5_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF5_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX6: LUT6 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX6_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX6_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX6_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX6_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX6_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX6_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX6_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX6_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX6_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE6: LUT6 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE6_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE6_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE6_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE6_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE6_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE6_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE6_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE6_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE6_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE6_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE6_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE6_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE6_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE6_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE6_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE6_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE6_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF6: LUT6 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF6_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF6_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF6_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF6_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF6_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF6_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF6_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF6_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF6_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF6_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +/*-- LM: LUTMUX7: LUT7 Input Multiplexor Register -------------------------------------------------------------*/ +typedef struct { + uint32_t SEL0 :5; /*!< Input select for Gate0 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL1 :5; /*!< Input select for Gate1 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL2 :5; /*!< Input select for Gate2 */ + uint32_t :3; /*!< RESERVED */ + uint32_t SEL3 :5; /*!< Input select for Gate3 */ +} _LAU_LM_LUTMUX7_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTMUX7_SEL0_Pos 0 /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX7_SEL1_Pos 8 /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX7_SEL2_Pos 16 /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX7_SEL3_Pos 24 /*!< Input select for Gate3 */ + +/* Bit field masks: */ +#define LAU_LM_LUTMUX7_SEL0_Msk 0x0000001FUL /*!< Input select for Gate0 */ +#define LAU_LM_LUTMUX7_SEL1_Msk 0x00001F00UL /*!< Input select for Gate1 */ +#define LAU_LM_LUTMUX7_SEL2_Msk 0x001F0000UL /*!< Input select for Gate2 */ +#define LAU_LM_LUTMUX7_SEL3_Msk 0x1F000000UL /*!< Input select for Gate3 */ + +/*-- LM: LUTGATE7: LUT7 Gate Config Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t GP0 :4; /*!< Gate 0 positive signal enable */ + uint32_t GN0 :4; /*!< Gate 0 negative signal enable */ + uint32_t GP1 :4; /*!< Gate 1 positive signal enable */ + uint32_t GN1 :4; /*!< Gate 1 negative signal enable */ + uint32_t GP2 :4; /*!< Gate 2 positive signal enable */ + uint32_t GN2 :4; /*!< Gate 2 negative signal enable */ + uint32_t GP3 :4; /*!< Gate 3 positive signal enable */ + uint32_t GN3 :4; /*!< Gate 3 negative signal enable */ +} _LAU_LM_LUTGATE7_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTGATE7_GP0_Pos 0 /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE7_GN0_Pos 4 /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE7_GP1_Pos 8 /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE7_GN1_Pos 12 /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE7_GP2_Pos 16 /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE7_GN2_Pos 20 /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE7_GP3_Pos 24 /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE7_GN3_Pos 28 /*!< Gate 3 negative signal enable */ + +/* Bit field masks: */ +#define LAU_LM_LUTGATE7_GP0_Msk 0x0000000FUL /*!< Gate 0 positive signal enable */ +#define LAU_LM_LUTGATE7_GN0_Msk 0x000000F0UL /*!< Gate 0 negative signal enable */ +#define LAU_LM_LUTGATE7_GP1_Msk 0x00000F00UL /*!< Gate 1 positive signal enable */ +#define LAU_LM_LUTGATE7_GN1_Msk 0x0000F000UL /*!< Gate 1 negative signal enable */ +#define LAU_LM_LUTGATE7_GP2_Msk 0x000F0000UL /*!< Gate 2 positive signal enable */ +#define LAU_LM_LUTGATE7_GN2_Msk 0x00F00000UL /*!< Gate 2 negative signal enable */ +#define LAU_LM_LUTGATE7_GP3_Msk 0x0F000000UL /*!< Gate 3 positive signal enable */ +#define LAU_LM_LUTGATE7_GN3_Msk 0xF0000000UL /*!< Gate 3 negative signal enable */ + +/*-- LM: LUTPLF7: LUT7 PLF Config Register --------------------------------------------------------------------*/ +typedef struct { + uint32_t EN :1; /*!< Enable LUT */ + uint32_t MODE :3; /*!< Logical function select */ + uint32_t INPOL0 :1; /*!< Input signal inverce */ + uint32_t INPOL1 :1; /*!< Input signal inverce */ + uint32_t INPOL2 :1; /*!< Input signal inverce */ + uint32_t INPOL3 :1; /*!< Input signal inverce */ + uint32_t LT :16; /*!< Logic Table bit 0 */ + uint32_t OUTPOL :1; /*!< Output signal inverce */ +} _LAU_LM_LUTPLF7_bits; + +/* Bit field positions: */ +#define LAU_LM_LUTPLF7_EN_Pos 0 /*!< Enable LUT */ +#define LAU_LM_LUTPLF7_MODE_Pos 1 /*!< Logical function select */ +#define LAU_LM_LUTPLF7_INPOL0_Pos 4 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_INPOL1_Pos 5 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_INPOL2_Pos 6 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_INPOL3_Pos 7 /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_LT_Pos 8 /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF7_OUTPOL_Pos 24 /*!< Output signal inverce */ + +/* Bit field masks: */ +#define LAU_LM_LUTPLF7_EN_Msk 0x00000001UL /*!< Enable LUT */ +#define LAU_LM_LUTPLF7_MODE_Msk 0x0000000EUL /*!< Logical function select */ +#define LAU_LM_LUTPLF7_INPOL0_Msk 0x00000010UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_INPOL1_Msk 0x00000020UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_INPOL2_Msk 0x00000040UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_INPOL3_Msk 0x00000080UL /*!< Input signal inverce */ +#define LAU_LM_LUTPLF7_LT_Msk 0x00FFFF00UL /*!< Logic Table bit 0 */ +#define LAU_LM_LUTPLF7_OUTPOL_Msk 0x01000000UL /*!< Output signal inverce */ + +//Cluster LM: +typedef struct { + union { + /*!< Clock Control Register */ + __IO uint32_t CLKCTL; /*!< CLKCTL : type used for word access */ + __IO _LAU_LM_CLKCTL_bits CLKCTL_bit; /*!< CLKCTL_bit: structure used for bit access */ + }; + union { + /*!< Interrupt Selection Register */ + __IO uint32_t INTSEL; /*!< INTSEL : type used for word access */ + __IO _LAU_LM_INTSEL_bits INTSEL_bit; /*!< INTSEL_bit: structure used for bit access */ + }; + union { + /*!< LM_BUS Signal Selection Register */ + __IO uint32_t BUSSEL; /*!< BUSSEL : type used for word access */ + __IO _LAU_LM_BUSSEL_bits BUSSEL_bit; /*!< BUSSEL_bit: structure used for bit access */ + }; + union { + /*!< LM_OUT Selection Register */ + __IO uint32_t OUTMUX; /*!< OUTMUX : type used for word access */ + __IO _LAU_LM_OUTMUX_bits OUTMUX_bit; /*!< OUTMUX_bit: structure used for bit access */ + }; + union { + /*!< LM_OE Selection Register */ + __IO uint32_t OEMUX; /*!< OEMUX : type used for word access */ + __IO _LAU_LM_OEMUX_bits OEMUX_bit; /*!< OEMUX_bit: structure used for bit access */ + }; + union { + /*!< LM_OE Control Register */ + __IO uint32_t OECTL; /*!< OECTL : type used for word access */ + __IO _LAU_LM_OECTL_bits OECTL_bit; /*!< OECTL_bit: structure used for bit access */ + }; + union { + /*!< LUT0 Input Multiplexor Register */ + __IO uint32_t LUTMUX0; /*!< LUTMUX0 : type used for word access */ + __IO _LAU_LM_LUTMUX0_bits LUTMUX0_bit; /*!< LUTMUX0_bit: structure used for bit access */ + }; + union { + /*!< LUT0 Gate Config Register */ + __IO uint32_t LUTGATE0; /*!< LUTGATE0 : type used for word access */ + __IO _LAU_LM_LUTGATE0_bits LUTGATE0_bit; /*!< LUTGATE0_bit: structure used for bit access */ + }; + union { + /*!< LUT0 PLF Config Register */ + __IO uint32_t LUTPLF0; /*!< LUTPLF0 : type used for word access */ + __IO _LAU_LM_LUTPLF0_bits LUTPLF0_bit; /*!< LUTPLF0_bit: structure used for bit access */ + }; + union { + /*!< LUT1 Input Multiplexor Register */ + __IO uint32_t LUTMUX1; /*!< LUTMUX1 : type used for word access */ + __IO _LAU_LM_LUTMUX1_bits LUTMUX1_bit; /*!< LUTMUX1_bit: structure used for bit access */ + }; + union { + /*!< LUT1 Gate Config Register */ + __IO uint32_t LUTGATE1; /*!< LUTGATE1 : type used for word access */ + __IO _LAU_LM_LUTGATE1_bits LUTGATE1_bit; /*!< LUTGATE1_bit: structure used for bit access */ + }; + union { + /*!< LUT1 PLF Config Register */ + __IO uint32_t LUTPLF1; /*!< LUTPLF1 : type used for word access */ + __IO _LAU_LM_LUTPLF1_bits LUTPLF1_bit; /*!< LUTPLF1_bit: structure used for bit access */ + }; + union { + /*!< LUT2 Input Multiplexor Register */ + __IO uint32_t LUTMUX2; /*!< LUTMUX2 : type used for word access */ + __IO _LAU_LM_LUTMUX2_bits LUTMUX2_bit; /*!< LUTMUX2_bit: structure used for bit access */ + }; + union { + /*!< LUT2 Gate Config Register */ + __IO uint32_t LUTGATE2; /*!< LUTGATE2 : type used for word access */ + __IO _LAU_LM_LUTGATE2_bits LUTGATE2_bit; /*!< LUTGATE2_bit: structure used for bit access */ + }; + union { + /*!< LUT2 PLF Config Register */ + __IO uint32_t LUTPLF2; /*!< LUTPLF2 : type used for word access */ + __IO _LAU_LM_LUTPLF2_bits LUTPLF2_bit; /*!< LUTPLF2_bit: structure used for bit access */ + }; + union { + /*!< LUT3 Input Multiplexor Register */ + __IO uint32_t LUTMUX3; /*!< LUTMUX3 : type used for word access */ + __IO _LAU_LM_LUTMUX3_bits LUTMUX3_bit; /*!< LUTMUX3_bit: structure used for bit access */ + }; + union { + /*!< LUT3 Gate Config Register */ + __IO uint32_t LUTGATE3; /*!< LUTGATE3 : type used for word access */ + __IO _LAU_LM_LUTGATE3_bits LUTGATE3_bit; /*!< LUTGATE3_bit: structure used for bit access */ + }; + union { + /*!< LUT3 PLF Config Register */ + __IO uint32_t LUTPLF3; /*!< LUTPLF3 : type used for word access */ + __IO _LAU_LM_LUTPLF3_bits LUTPLF3_bit; /*!< LUTPLF3_bit: structure used for bit access */ + }; + union { + /*!< LUT4 Input Multiplexor Register */ + __IO uint32_t LUTMUX4; /*!< LUTMUX4 : type used for word access */ + __IO _LAU_LM_LUTMUX4_bits LUTMUX4_bit; /*!< LUTMUX4_bit: structure used for bit access */ + }; + union { + /*!< LUT4 Gate Config Register */ + __IO uint32_t LUTGATE4; /*!< LUTGATE4 : type used for word access */ + __IO _LAU_LM_LUTGATE4_bits LUTGATE4_bit; /*!< LUTGATE4_bit: structure used for bit access */ + }; + union { + /*!< LUT4 PLF Config Register */ + __IO uint32_t LUTPLF4; /*!< LUTPLF4 : type used for word access */ + __IO _LAU_LM_LUTPLF4_bits LUTPLF4_bit; /*!< LUTPLF4_bit: structure used for bit access */ + }; + union { + /*!< LUT5 Input Multiplexor Register */ + __IO uint32_t LUTMUX5; /*!< LUTMUX5 : type used for word access */ + __IO _LAU_LM_LUTMUX5_bits LUTMUX5_bit; /*!< LUTMUX5_bit: structure used for bit access */ + }; + union { + /*!< LUT5 Gate Config Register */ + __IO uint32_t LUTGATE5; /*!< LUTGATE5 : type used for word access */ + __IO _LAU_LM_LUTGATE5_bits LUTGATE5_bit; /*!< LUTGATE5_bit: structure used for bit access */ + }; + union { + /*!< LUT5 PLF Config Register */ + __IO uint32_t LUTPLF5; /*!< LUTPLF5 : type used for word access */ + __IO _LAU_LM_LUTPLF5_bits LUTPLF5_bit; /*!< LUTPLF5_bit: structure used for bit access */ + }; + union { + /*!< LUT6 Input Multiplexor Register */ + __IO uint32_t LUTMUX6; /*!< LUTMUX6 : type used for word access */ + __IO _LAU_LM_LUTMUX6_bits LUTMUX6_bit; /*!< LUTMUX6_bit: structure used for bit access */ + }; + union { + /*!< LUT6 Gate Config Register */ + __IO uint32_t LUTGATE6; /*!< LUTGATE6 : type used for word access */ + __IO _LAU_LM_LUTGATE6_bits LUTGATE6_bit; /*!< LUTGATE6_bit: structure used for bit access */ + }; + union { + /*!< LUT6 PLF Config Register */ + __IO uint32_t LUTPLF6; /*!< LUTPLF6 : type used for word access */ + __IO _LAU_LM_LUTPLF6_bits LUTPLF6_bit; /*!< LUTPLF6_bit: structure used for bit access */ + }; + union { + /*!< LUT7 Input Multiplexor Register */ + __IO uint32_t LUTMUX7; /*!< LUTMUX7 : type used for word access */ + __IO _LAU_LM_LUTMUX7_bits LUTMUX7_bit; /*!< LUTMUX7_bit: structure used for bit access */ + }; + union { + /*!< LUT7 Gate Config Register */ + __IO uint32_t LUTGATE7; /*!< LUTGATE7 : type used for word access */ + __IO _LAU_LM_LUTGATE7_bits LUTGATE7_bit; /*!< LUTGATE7_bit: structure used for bit access */ + }; + union { + /*!< LUT7 PLF Config Register */ + __IO uint32_t LUTPLF7; /*!< LUTPLF7 : type used for word access */ + __IO _LAU_LM_LUTPLF7_bits LUTPLF7_bit; /*!< LUTPLF7_bit: structure used for bit access */ + }; +} _LAU_LM_TypeDef; +typedef struct { + union { /*!< Interrupt control register */ + __IO uint32_t INTCTL; /*!< INTCTL : type used for word access */ + __IO _LAU_INTCTL_bits INTCTL_bit; /*!< INTCTL_bit: structure used for bit access */ + }; + union { /*!< Interrupt Mask Set/Clear Register */ + __IO uint32_t IMSC; /*!< IMSC : type used for word access */ + __IO _LAU_IMSC_bits IMSC_bit; /*!< IMSC_bit: structure used for bit access */ + }; + union { /*!< Raw Interrupt Status Register */ + __I uint32_t RIS; /*!< RIS : type used for word access */ + __I _LAU_RIS_bits RIS_bit; /*!< RIS_bit: structure used for bit access */ + }; + union { /*!< Masked Interrupt Status Register */ + __I uint32_t MIS; /*!< MIS : type used for word access */ + __I _LAU_MIS_bits MIS_bit; /*!< MIS_bit: structure used for bit access */ + }; + union { /*!< Interrupt Clear Register */ + __O uint32_t ICR; /*!< ICR : type used for word access */ + __O _LAU_ICR_bits ICR_bit; /*!< ICR_bit: structure used for bit access */ + }; + __IO uint32_t Reserved0[3]; + _LAU_LM_TypeDef LM[8]; +} LAU_TypeDef; + + +/******************************************************************************/ +/* SDFM registers */ +/******************************************************************************/ + +/*-- IFLG: Interrupt Flag Register ---------------------------------------------------------------------------*/ +typedef struct { + uint32_t IFL0 :1; /*!< Comparator filter 0 output is equal to or below the low level threshold */ + uint32_t IFL1 :1; /*!< Comparator filter 1 output is equal to or below the low level threshold */ + uint32_t IFL2 :1; /*!< Comparator filter 2 output is equal to or below the low level threshold */ + uint32_t IFL3 :1; /*!< Comparator filter 3 output is equal to or below the low level threshold */ + uint32_t IFH0 :1; /*!< Comparator filter 0 output is equal to or above the high level threshold */ + uint32_t IFH1 :1; /*!< Comparator filter 1 output is equal to or above the high level threshold */ + uint32_t IFH2 :1; /*!< Comparator filter 2 output is equal to or above the high level threshold */ + uint32_t IFH3 :1; /*!< Comparator filter 3 output is equal to or above the high level threshold */ + uint32_t IFHZ0 :1; /*!< Comparator filter 0 output is equal to or above the zero level threshold */ + uint32_t IFHZ1 :1; /*!< Comparator filter 1 output is equal to or above the zero level threshold */ + uint32_t IFHZ2 :1; /*!< Comparator filter 2 output is equal to or above the zero level threshold */ + uint32_t IFHZ3 :1; /*!< Comparator filter 3 output is equal to or above the zero level threshold */ + uint32_t MF0 :1; /*!< Modulator failure filter 0 */ + uint32_t MF1 :1; /*!< Modulator failure filter 1 */ + uint32_t MF2 :1; /*!< Modulator failure filter 2 */ + uint32_t MF3 :1; /*!< Modulator failure filter 3 */ + uint32_t AF0 :1; /*!< New data available from filter 0 */ + uint32_t AF1 :1; /*!< New data available from filter 1 */ + uint32_t AF2 :1; /*!< New data available from filter 2 */ + uint32_t AF3 :1; /*!< New data available from filter 3 */ + uint32_t OV0 :1; /*!< Overflow FIFO0 error flag */ + uint32_t OV1 :1; /*!< Overflow FIFO1 error flag */ + uint32_t OV2 :1; /*!< Overflow FIFO2 error flag */ + uint32_t OV3 :1; /*!< Overflow FIFO3 error flag */ + uint32_t FDR0 :1; /*!< FIFO0 data ready flag */ + uint32_t FDR1 :1; /*!< FIFO1 data ready flag */ + uint32_t FDR2 :1; /*!< FIFO2 data ready flag */ + uint32_t FDR3 :1; /*!< FIFO3 data ready flag */ + uint32_t :3; /*!< RESERVED */ + uint32_t MIF :1; /*!< OR'ed flags OVx, MFx, IFHx, IFLx */ +} _SDFM_IFLG_bits; + +/* Bit field positions: */ +#define SDFM_IFLG_IFL0_Pos 0 /*!< Comparator filter 0 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFL1_Pos 1 /*!< Comparator filter 1 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFL2_Pos 2 /*!< Comparator filter 2 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFL3_Pos 3 /*!< Comparator filter 3 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFH0_Pos 4 /*!< Comparator filter 0 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFH1_Pos 5 /*!< Comparator filter 1 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFH2_Pos 6 /*!< Comparator filter 2 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFH3_Pos 7 /*!< Comparator filter 3 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFHZ0_Pos 8 /*!< Comparator filter 0 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_IFHZ1_Pos 9 /*!< Comparator filter 1 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_IFHZ2_Pos 10 /*!< Comparator filter 2 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_IFHZ3_Pos 11 /*!< Comparator filter 3 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_MF0_Pos 12 /*!< Modulator failure filter 0 */ +#define SDFM_IFLG_MF1_Pos 13 /*!< Modulator failure filter 1 */ +#define SDFM_IFLG_MF2_Pos 14 /*!< Modulator failure filter 2 */ +#define SDFM_IFLG_MF3_Pos 15 /*!< Modulator failure filter 3 */ +#define SDFM_IFLG_AF0_Pos 16 /*!< New data available from filter 0 */ +#define SDFM_IFLG_AF1_Pos 17 /*!< New data available from filter 1 */ +#define SDFM_IFLG_AF2_Pos 18 /*!< New data available from filter 2 */ +#define SDFM_IFLG_AF3_Pos 19 /*!< New data available from filter 3 */ +#define SDFM_IFLG_OV0_Pos 20 /*!< Overflow FIFO0 error flag */ +#define SDFM_IFLG_OV1_Pos 21 /*!< Overflow FIFO1 error flag */ +#define SDFM_IFLG_OV2_Pos 22 /*!< Overflow FIFO2 error flag */ +#define SDFM_IFLG_OV3_Pos 23 /*!< Overflow FIFO3 error flag */ +#define SDFM_IFLG_FDR0_Pos 24 /*!< FIFO0 data ready flag */ +#define SDFM_IFLG_FDR1_Pos 25 /*!< FIFO1 data ready flag */ +#define SDFM_IFLG_FDR2_Pos 26 /*!< FIFO2 data ready flag */ +#define SDFM_IFLG_FDR3_Pos 27 /*!< FIFO3 data ready flag */ +#define SDFM_IFLG_MIF_Pos 31 /*!< OR'ed flags OVx, MFx, IFHx, IFLx */ + +/* Bit field masks: */ +#define SDFM_IFLG_IFL0_Msk 0x00000001UL /*!< Comparator filter 0 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFL1_Msk 0x00000002UL /*!< Comparator filter 1 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFL2_Msk 0x00000004UL /*!< Comparator filter 2 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFL3_Msk 0x00000008UL /*!< Comparator filter 3 output is equal to or below the low level threshold */ +#define SDFM_IFLG_IFH0_Msk 0x00000010UL /*!< Comparator filter 0 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFH1_Msk 0x00000020UL /*!< Comparator filter 1 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFH2_Msk 0x00000040UL /*!< Comparator filter 2 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFH3_Msk 0x00000080UL /*!< Comparator filter 3 output is equal to or above the high level threshold */ +#define SDFM_IFLG_IFHZ0_Msk 0x00000100UL /*!< Comparator filter 0 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_IFHZ1_Msk 0x00000200UL /*!< Comparator filter 1 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_IFHZ2_Msk 0x00000400UL /*!< Comparator filter 2 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_IFHZ3_Msk 0x00000800UL /*!< Comparator filter 3 output is equal to or above the zero level threshold */ +#define SDFM_IFLG_MF0_Msk 0x00001000UL /*!< Modulator failure filter 0 */ +#define SDFM_IFLG_MF1_Msk 0x00002000UL /*!< Modulator failure filter 1 */ +#define SDFM_IFLG_MF2_Msk 0x00004000UL /*!< Modulator failure filter 2 */ +#define SDFM_IFLG_MF3_Msk 0x00008000UL /*!< Modulator failure filter 3 */ +#define SDFM_IFLG_AF0_Msk 0x00010000UL /*!< New data available from filter 0 */ +#define SDFM_IFLG_AF1_Msk 0x00020000UL /*!< New data available from filter 1 */ +#define SDFM_IFLG_AF2_Msk 0x00040000UL /*!< New data available from filter 2 */ +#define SDFM_IFLG_AF3_Msk 0x00080000UL /*!< New data available from filter 3 */ +#define SDFM_IFLG_OV0_Msk 0x00100000UL /*!< Overflow FIFO0 error flag */ +#define SDFM_IFLG_OV1_Msk 0x00200000UL /*!< Overflow FIFO1 error flag */ +#define SDFM_IFLG_OV2_Msk 0x00400000UL /*!< Overflow FIFO2 error flag */ +#define SDFM_IFLG_OV3_Msk 0x00800000UL /*!< Overflow FIFO3 error flag */ +#define SDFM_IFLG_FDR0_Msk 0x01000000UL /*!< FIFO0 data ready flag */ +#define SDFM_IFLG_FDR1_Msk 0x02000000UL /*!< FIFO1 data ready flag */ +#define SDFM_IFLG_FDR2_Msk 0x04000000UL /*!< FIFO2 data ready flag */ +#define SDFM_IFLG_FDR3_Msk 0x08000000UL /*!< FIFO3 data ready flag */ +#define SDFM_IFLG_MIF_Msk 0x80000000UL /*!< OR'ed flags OVx, MFx, IFHx, IFLx */ + +/*-- IFLGCLR: Clear Interrupt flag register ------------------------------------------------------------------*/ +typedef struct { + uint32_t IFL0 :1; /*!< Comparator filter 0 output is equal to or below the low level threshold clear bit */ + uint32_t IFL1 :1; /*!< Comparator filter 1 output is equal to or below the low level threshold clear bit */ + uint32_t IFL2 :1; /*!< Comparator filter 2 output is equal to or below the low level threshold clear bit */ + uint32_t IFL3 :1; /*!< Comparator filter 3 output is equal to or below the low level threshold clear bit */ + uint32_t IFH0 :1; /*!< Comparator filter 0 output is equal to or above the high level threshold clear bit */ + uint32_t IFH1 :1; /*!< Comparator filter 1 output is equal to or above the high level threshold clear bit */ + uint32_t IFH2 :1; /*!< Comparator filter 2 output is equal to or above the high level threshold clear bit */ + uint32_t IFH3 :1; /*!< Comparator filter 3 output is equal to or above the high level threshold clear bit */ + uint32_t IFHZ0 :1; /*!< Comparator filter 0 output is equal to or above the zero level threshold clear bit */ + uint32_t IFHZ1 :1; /*!< Comparator filter 1 output is equal to or above the zero level threshold clear bit */ + uint32_t IFHZ2 :1; /*!< Comparator filter 2 output is equal to or above the zero level threshold clear bit */ + uint32_t IFHZ3 :1; /*!< Comparator filter 3 output is equal to or above the zero level threshold clear bit */ + uint32_t MF0 :1; /*!< Modulator failure filter 0 clear bit */ + uint32_t MF1 :1; /*!< Modulator failure filter 1 clear bit */ + uint32_t MF2 :1; /*!< Modulator failure filter 2 clear bit */ + uint32_t MF3 :1; /*!< Modulator failure filter 3 clear bit */ + uint32_t AF0 :1; /*!< New data available from filter 0 clear bit */ + uint32_t AF1 :1; /*!< New data available from filter 1 clear bit */ + uint32_t AF2 :1; /*!< New data available from filter 2 clear bit */ + uint32_t AF3 :1; /*!< New data available from filter 3 clear bit */ + uint32_t OV0 :1; /*!< Overflow FIFO0 error flag clear bit */ + uint32_t OV1 :1; /*!< Overflow FIFO1 error flag clear bit */ + uint32_t OV2 :1; /*!< Overflow FIFO2 error flag clear bit */ + uint32_t OV3 :1; /*!< Overflow FIFO3 error flag clear bit */ + uint32_t FDR0 :1; /*!< FIFO0 data ready flag clear */ + uint32_t FDR1 :1; /*!< FIFO1 data ready flag clear */ + uint32_t FDR2 :1; /*!< FIFO2 data ready flag clear */ + uint32_t FDR3 :1; /*!< FIFO3 data ready flag clear */ + uint32_t :3; /*!< RESERVED */ + uint32_t MIF :1; /*!< MIF flag clear bit */ +} _SDFM_IFLGCLR_bits; + +/* Bit field positions: */ +#define SDFM_IFLGCLR_IFL0_Pos 0 /*!< Comparator filter 0 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFL1_Pos 1 /*!< Comparator filter 1 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFL2_Pos 2 /*!< Comparator filter 2 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFL3_Pos 3 /*!< Comparator filter 3 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFH0_Pos 4 /*!< Comparator filter 0 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFH1_Pos 5 /*!< Comparator filter 1 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFH2_Pos 6 /*!< Comparator filter 2 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFH3_Pos 7 /*!< Comparator filter 3 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ0_Pos 8 /*!< Comparator filter 0 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ1_Pos 9 /*!< Comparator filter 1 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ2_Pos 10 /*!< Comparator filter 2 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ3_Pos 11 /*!< Comparator filter 3 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_MF0_Pos 12 /*!< Modulator failure filter 0 clear bit */ +#define SDFM_IFLGCLR_MF1_Pos 13 /*!< Modulator failure filter 1 clear bit */ +#define SDFM_IFLGCLR_MF2_Pos 14 /*!< Modulator failure filter 2 clear bit */ +#define SDFM_IFLGCLR_MF3_Pos 15 /*!< Modulator failure filter 3 clear bit */ +#define SDFM_IFLGCLR_AF0_Pos 16 /*!< New data available from filter 0 clear bit */ +#define SDFM_IFLGCLR_AF1_Pos 17 /*!< New data available from filter 1 clear bit */ +#define SDFM_IFLGCLR_AF2_Pos 18 /*!< New data available from filter 2 clear bit */ +#define SDFM_IFLGCLR_AF3_Pos 19 /*!< New data available from filter 3 clear bit */ +#define SDFM_IFLGCLR_OV0_Pos 20 /*!< Overflow FIFO0 error flag clear bit */ +#define SDFM_IFLGCLR_OV1_Pos 21 /*!< Overflow FIFO1 error flag clear bit */ +#define SDFM_IFLGCLR_OV2_Pos 22 /*!< Overflow FIFO2 error flag clear bit */ +#define SDFM_IFLGCLR_OV3_Pos 23 /*!< Overflow FIFO3 error flag clear bit */ +#define SDFM_IFLGCLR_FDR0_Pos 24 /*!< FIFO0 data ready flag clear */ +#define SDFM_IFLGCLR_FDR1_Pos 25 /*!< FIFO1 data ready flag clear */ +#define SDFM_IFLGCLR_FDR2_Pos 26 /*!< FIFO2 data ready flag clear */ +#define SDFM_IFLGCLR_FDR3_Pos 27 /*!< FIFO3 data ready flag clear */ +#define SDFM_IFLGCLR_MIF_Pos 31 /*!< MIF flag clear bit */ + +/* Bit field masks: */ +#define SDFM_IFLGCLR_IFL0_Msk 0x00000001UL /*!< Comparator filter 0 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFL1_Msk 0x00000002UL /*!< Comparator filter 1 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFL2_Msk 0x00000004UL /*!< Comparator filter 2 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFL3_Msk 0x00000008UL /*!< Comparator filter 3 output is equal to or below the low level threshold clear bit */ +#define SDFM_IFLGCLR_IFH0_Msk 0x00000010UL /*!< Comparator filter 0 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFH1_Msk 0x00000020UL /*!< Comparator filter 1 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFH2_Msk 0x00000040UL /*!< Comparator filter 2 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFH3_Msk 0x00000080UL /*!< Comparator filter 3 output is equal to or above the high level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ0_Msk 0x00000100UL /*!< Comparator filter 0 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ1_Msk 0x00000200UL /*!< Comparator filter 1 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ2_Msk 0x00000400UL /*!< Comparator filter 2 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_IFHZ3_Msk 0x00000800UL /*!< Comparator filter 3 output is equal to or above the zero level threshold clear bit */ +#define SDFM_IFLGCLR_MF0_Msk 0x00001000UL /*!< Modulator failure filter 0 clear bit */ +#define SDFM_IFLGCLR_MF1_Msk 0x00002000UL /*!< Modulator failure filter 1 clear bit */ +#define SDFM_IFLGCLR_MF2_Msk 0x00004000UL /*!< Modulator failure filter 2 clear bit */ +#define SDFM_IFLGCLR_MF3_Msk 0x00008000UL /*!< Modulator failure filter 3 clear bit */ +#define SDFM_IFLGCLR_AF0_Msk 0x00010000UL /*!< New data available from filter 0 clear bit */ +#define SDFM_IFLGCLR_AF1_Msk 0x00020000UL /*!< New data available from filter 1 clear bit */ +#define SDFM_IFLGCLR_AF2_Msk 0x00040000UL /*!< New data available from filter 2 clear bit */ +#define SDFM_IFLGCLR_AF3_Msk 0x00080000UL /*!< New data available from filter 3 clear bit */ +#define SDFM_IFLGCLR_OV0_Msk 0x00100000UL /*!< Overflow FIFO0 error flag clear bit */ +#define SDFM_IFLGCLR_OV1_Msk 0x00200000UL /*!< Overflow FIFO1 error flag clear bit */ +#define SDFM_IFLGCLR_OV2_Msk 0x00400000UL /*!< Overflow FIFO2 error flag clear bit */ +#define SDFM_IFLGCLR_OV3_Msk 0x00800000UL /*!< Overflow FIFO3 error flag clear bit */ +#define SDFM_IFLGCLR_FDR0_Msk 0x01000000UL /*!< FIFO0 data ready flag clear */ +#define SDFM_IFLGCLR_FDR1_Msk 0x02000000UL /*!< FIFO1 data ready flag clear */ +#define SDFM_IFLGCLR_FDR2_Msk 0x04000000UL /*!< FIFO2 data ready flag clear */ +#define SDFM_IFLGCLR_FDR3_Msk 0x08000000UL /*!< FIFO3 data ready flag clear */ +#define SDFM_IFLGCLR_MIF_Msk 0x80000000UL /*!< MIF flag clear bit */ + +/*-- CFLG: Comparator Flag Register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t CFL0 :1; /*!< */ + uint32_t CFL1 :1; /*!< */ + uint32_t CFL2 :1; /*!< */ + uint32_t CFL3 :1; /*!< */ + uint32_t CFH0 :1; /*!< */ + uint32_t CFH1 :1; /*!< */ + uint32_t CFH2 :1; /*!< */ + uint32_t CFH3 :1; /*!< */ + uint32_t CFHZ0 :1; /*!< */ + uint32_t CFHZ1 :1; /*!< */ + uint32_t CFHZ2 :1; /*!< */ + uint32_t CFHZ3 :1; /*!< */ +} _SDFM_CFLG_bits; + +/* Bit field positions: */ +#define SDFM_CFLG_CFL0_Pos 0 /*!< */ +#define SDFM_CFLG_CFL1_Pos 1 /*!< */ +#define SDFM_CFLG_CFL2_Pos 2 /*!< */ +#define SDFM_CFLG_CFL3_Pos 3 /*!< */ +#define SDFM_CFLG_CFH0_Pos 4 /*!< */ +#define SDFM_CFLG_CFH1_Pos 5 /*!< */ +#define SDFM_CFLG_CFH2_Pos 6 /*!< */ +#define SDFM_CFLG_CFH3_Pos 7 /*!< */ +#define SDFM_CFLG_CFHZ0_Pos 8 /*!< */ +#define SDFM_CFLG_CFHZ1_Pos 9 /*!< */ +#define SDFM_CFLG_CFHZ2_Pos 10 /*!< */ +#define SDFM_CFLG_CFHZ3_Pos 11 /*!< */ + +/* Bit field masks: */ +#define SDFM_CFLG_CFL0_Msk 0x00000001UL /*!< */ +#define SDFM_CFLG_CFL1_Msk 0x00000002UL /*!< */ +#define SDFM_CFLG_CFL2_Msk 0x00000004UL /*!< */ +#define SDFM_CFLG_CFL3_Msk 0x00000008UL /*!< */ +#define SDFM_CFLG_CFH0_Msk 0x00000010UL /*!< */ +#define SDFM_CFLG_CFH1_Msk 0x00000020UL /*!< */ +#define SDFM_CFLG_CFH2_Msk 0x00000040UL /*!< */ +#define SDFM_CFLG_CFH3_Msk 0x00000080UL /*!< */ +#define SDFM_CFLG_CFHZ0_Msk 0x00000100UL /*!< */ +#define SDFM_CFLG_CFHZ1_Msk 0x00000200UL /*!< */ +#define SDFM_CFLG_CFHZ2_Msk 0x00000400UL /*!< */ +#define SDFM_CFLG_CFHZ3_Msk 0x00000800UL /*!< */ + +/*-- CFLGCLR: Comparator Flag Clear Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t CFL0 :1; /*!< */ + uint32_t CFL1 :1; /*!< */ + uint32_t CFL2 :1; /*!< */ + uint32_t CFL3 :1; /*!< */ + uint32_t CFH0 :1; /*!< */ + uint32_t CFH1 :1; /*!< */ + uint32_t CFH2 :1; /*!< */ + uint32_t CFH3 :1; /*!< */ + uint32_t CFHZ0 :1; /*!< */ + uint32_t CFHZ1 :1; /*!< */ + uint32_t CFHZ2 :1; /*!< */ + uint32_t CFHZ3 :1; /*!< */ +} _SDFM_CFLGCLR_bits; + +/* Bit field positions: */ +#define SDFM_CFLGCLR_CFL0_Pos 0 /*!< */ +#define SDFM_CFLGCLR_CFL1_Pos 1 /*!< */ +#define SDFM_CFLGCLR_CFL2_Pos 2 /*!< */ +#define SDFM_CFLGCLR_CFL3_Pos 3 /*!< */ +#define SDFM_CFLGCLR_CFH0_Pos 4 /*!< */ +#define SDFM_CFLGCLR_CFH1_Pos 5 /*!< */ +#define SDFM_CFLGCLR_CFH2_Pos 6 /*!< */ +#define SDFM_CFLGCLR_CFH3_Pos 7 /*!< */ +#define SDFM_CFLGCLR_CFHZ0_Pos 8 /*!< */ +#define SDFM_CFLGCLR_CFHZ1_Pos 9 /*!< */ +#define SDFM_CFLGCLR_CFHZ2_Pos 10 /*!< */ +#define SDFM_CFLGCLR_CFHZ3_Pos 11 /*!< */ + +/* Bit field masks: */ +#define SDFM_CFLGCLR_CFL0_Msk 0x00000001UL /*!< */ +#define SDFM_CFLGCLR_CFL1_Msk 0x00000002UL /*!< */ +#define SDFM_CFLGCLR_CFL2_Msk 0x00000004UL /*!< */ +#define SDFM_CFLGCLR_CFL3_Msk 0x00000008UL /*!< */ +#define SDFM_CFLGCLR_CFH0_Msk 0x00000010UL /*!< */ +#define SDFM_CFLGCLR_CFH1_Msk 0x00000020UL /*!< */ +#define SDFM_CFLGCLR_CFH2_Msk 0x00000040UL /*!< */ +#define SDFM_CFLGCLR_CFH3_Msk 0x00000080UL /*!< */ +#define SDFM_CFLGCLR_CFHZ0_Msk 0x00000100UL /*!< */ +#define SDFM_CFLGCLR_CFHZ1_Msk 0x00000200UL /*!< */ +#define SDFM_CFLGCLR_CFHZ2_Msk 0x00000400UL /*!< */ +#define SDFM_CFLGCLR_CFHZ3_Msk 0x00000800UL /*!< */ + +/*-- CTL: Control Register -----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t MIE :1; /*!< Master interrupt enable */ +} _SDFM_CTL_bits; + +/* Bit field positions: */ +#define SDFM_CTL_MIE_Pos 0 /*!< Master interrupt enable */ + +/* Bit field masks: */ +#define SDFM_CTL_MIE_Msk 0x00000001UL /*!< Master interrupt enable */ + +/*-- MFILEN: Master Filter Enable Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t MFE :1; /*!< Master filter enable */ +} _SDFM_MFILEN_bits; + +/* Bit field positions: */ +#define SDFM_MFILEN_MFE_Pos 0 /*!< Master filter enable */ + +/* Bit field masks: */ +#define SDFM_MFILEN_MFE_Msk 0x00000001UL /*!< Master filter enable */ + +/*-- SD: CTLPARM: Filter Control Register ---------------------------------------------------------------------*/ +typedef struct { + uint32_t MOD :2; /*!< Sigma Delta modulator IO mode */ + uint32_t :2; /*!< RESERVED */ + uint32_t MFIE :1; /*!< Modulator failure interrupt enable */ + uint32_t :11; /*!< RESERVED */ + uint32_t CORM3 :8; /*!< Clock out ratio for mode 3 */ +} _SDFM_SD_CTLPARM_bits; + +/* Bit field positions: */ +#define SDFM_SD_CTLPARM_MOD_Pos 0 /*!< Sigma Delta modulator IO mode */ +#define SDFM_SD_CTLPARM_MFIE_Pos 4 /*!< Modulator failure interrupt enable */ +#define SDFM_SD_CTLPARM_CORM3_Pos 16 /*!< Clock out ratio for mode 3 */ + +/* Bit field masks: */ +#define SDFM_SD_CTLPARM_MOD_Msk 0x00000003UL /*!< Sigma Delta modulator IO mode */ +#define SDFM_SD_CTLPARM_MFIE_Msk 0x00000010UL /*!< Modulator failure interrupt enable */ +#define SDFM_SD_CTLPARM_CORM3_Msk 0x00FF0000UL /*!< Clock out ratio for mode 3 */ + +/* Bit field enums: */ +typedef enum { + SDFM_SD_CTLPARM_MOD_Mode0SDR = 0x0UL, /*!< single data rate */ + SDFM_SD_CTLPARM_MOD_Mode1DDR = 0x1UL, /*!< double data rate */ + SDFM_SD_CTLPARM_MOD_Mode2Manchester = 0x2UL, /*!< manchester coding */ + SDFM_SD_CTLPARM_MOD_Mode3HDR = 0x3UL, /*!< half data rate */ +} SDFM_SD_CTLPARM_MOD_Enum; + +/*-- SD: DFPARM: Data Filter Parameter Register ---------------------------------------------------------------*/ +typedef struct { + uint32_t DOSR :12; /*!< Oversampling ratio */ + uint32_t FEN :1; /*!< Filter enable */ + uint32_t AEN :1; /*!< Acknowledge enable */ + uint32_t :2; /*!< RESERVED */ + uint32_t SST :3; /*!< Data Filter structure */ + uint32_t :5; /*!< RESERVED */ + uint32_t ENSYN :1; /*!< Enable syncronization for filter */ +} _SDFM_SD_DFPARM_bits; + +/* Bit field positions: */ +#define SDFM_SD_DFPARM_DOSR_Pos 0 /*!< Oversampling ratio */ +#define SDFM_SD_DFPARM_FEN_Pos 12 /*!< Filter enable */ +#define SDFM_SD_DFPARM_AEN_Pos 13 /*!< Acknowledge enable */ +#define SDFM_SD_DFPARM_SST_Pos 16 /*!< Data Filter structure */ +#define SDFM_SD_DFPARM_ENSYN_Pos 24 /*!< Enable syncronization for filter */ + +/* Bit field masks: */ +#define SDFM_SD_DFPARM_DOSR_Msk 0x00000FFFUL /*!< Oversampling ratio */ +#define SDFM_SD_DFPARM_FEN_Msk 0x00001000UL /*!< Filter enable */ +#define SDFM_SD_DFPARM_AEN_Msk 0x00002000UL /*!< Acknowledge enable */ +#define SDFM_SD_DFPARM_SST_Msk 0x00070000UL /*!< Data Filter structure */ +#define SDFM_SD_DFPARM_ENSYN_Msk 0x01000000UL /*!< Enable syncronization for filter */ + +/* Bit field enums: */ +typedef enum { + SDFM_SD_DFPARM_SST_FastSinc = 0x0UL, /*!< fastsinc */ + SDFM_SD_DFPARM_SST_Sinc1 = 0x1UL, /*!< sinc 1-st order */ + SDFM_SD_DFPARM_SST_Sinc2 = 0x2UL, /*!< sinc 2-nd order */ + SDFM_SD_DFPARM_SST_Sinc3 = 0x3UL, /*!< sinc 3-rd order */ + SDFM_SD_DFPARM_SST_Sinc4 = 0x4UL, /*!< sinc 4-th order */ + SDFM_SD_DFPARM_SST_Sinc5 = 0x5UL, /*!< sinc 5-th order */ +} SDFM_SD_DFPARM_SST_Enum; + +/*-- SD: DPARM: Shift Data Control Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t SH :5; /*!< Shift control */ +} _SDFM_SD_DPARM_bits; + +/* Bit field positions: */ +#define SDFM_SD_DPARM_SH_Pos 0 /*!< Shift control */ + +/* Bit field masks: */ +#define SDFM_SD_DPARM_SH_Msk 0x0000001FUL /*!< Shift control */ + +/*-- SD: CMPH: High Level Comparator Register -----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Unsigned high-level threshold comparator */ +} _SDFM_SD_CMPH_bits; + +/* Bit field positions: */ +#define SDFM_SD_CMPH_VAL_Pos 0 /*!< Unsigned high-level threshold comparator */ + +/* Bit field masks: */ +#define SDFM_SD_CMPH_VAL_Msk 0xFFFFFFFFUL /*!< Unsigned high-level threshold comparator */ + +/*-- SD: CMPHZ: Zero Level Comparator Register ----------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Unsigned zero-level threshold comparator */ +} _SDFM_SD_CMPHZ_bits; + +/* Bit field positions: */ +#define SDFM_SD_CMPHZ_VAL_Pos 0 /*!< Unsigned zero-level threshold comparator */ + +/* Bit field masks: */ +#define SDFM_SD_CMPHZ_VAL_Msk 0xFFFFFFFFUL /*!< Unsigned zero-level threshold comparator */ + +/*-- SD: CMPL: Low Level Comparator Register ------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Unsigned low-level threshold comparator */ +} _SDFM_SD_CMPL_bits; + +/* Bit field positions: */ +#define SDFM_SD_CMPL_VAL_Pos 0 /*!< Unsigned low-level threshold comparator */ + +/* Bit field masks: */ +#define SDFM_SD_CMPL_VAL_Msk 0xFFFFFFFFUL /*!< Unsigned low-level threshold comparator */ + +/*-- SD: CPARM: Comparator Parameter register -----------------------------------------------------------------*/ +typedef struct { + uint32_t COSR :12; /*!< Oversampling ratio for comparator */ + uint32_t IEH :1; /*!< High-level interrupt enable */ + uint32_t IEL :1; /*!< Low-level interrupt enable */ + uint32_t IEHZ :1; /*!< Zero-level interrupt enable */ + uint32_t :1; /*!< RESERVED */ + uint32_t CS :3; /*!< Comparator filter structure */ + uint32_t CEN :1; /*!< Comparator enable */ + uint32_t HWLCLR :1; /*!< Enable hardware clear low threshold comparator exceed event */ + uint32_t HWHCLR :1; /*!< Enable hardware clear high threshold comparator exceed event */ + uint32_t HWHZCLR :1; /*!< Enable hardware clear zero threshold comparator exceed event */ +} _SDFM_SD_CPARM_bits; + +/* Bit field positions: */ +#define SDFM_SD_CPARM_COSR_Pos 0 /*!< Oversampling ratio for comparator */ +#define SDFM_SD_CPARM_IEH_Pos 12 /*!< High-level interrupt enable */ +#define SDFM_SD_CPARM_IEL_Pos 13 /*!< Low-level interrupt enable */ +#define SDFM_SD_CPARM_IEHZ_Pos 14 /*!< Zero-level interrupt enable */ +#define SDFM_SD_CPARM_CS_Pos 16 /*!< Comparator filter structure */ +#define SDFM_SD_CPARM_CEN_Pos 19 /*!< Comparator enable */ +#define SDFM_SD_CPARM_HWLCLR_Pos 20 /*!< Enable hardware clear low threshold comparator exceed event */ +#define SDFM_SD_CPARM_HWHCLR_Pos 21 /*!< Enable hardware clear high threshold comparator exceed event */ +#define SDFM_SD_CPARM_HWHZCLR_Pos 22 /*!< Enable hardware clear zero threshold comparator exceed event */ + +/* Bit field masks: */ +#define SDFM_SD_CPARM_COSR_Msk 0x00000FFFUL /*!< Oversampling ratio for comparator */ +#define SDFM_SD_CPARM_IEH_Msk 0x00001000UL /*!< High-level interrupt enable */ +#define SDFM_SD_CPARM_IEL_Msk 0x00002000UL /*!< Low-level interrupt enable */ +#define SDFM_SD_CPARM_IEHZ_Msk 0x00004000UL /*!< Zero-level interrupt enable */ +#define SDFM_SD_CPARM_CS_Msk 0x00070000UL /*!< Comparator filter structure */ +#define SDFM_SD_CPARM_CEN_Msk 0x00080000UL /*!< Comparator enable */ +#define SDFM_SD_CPARM_HWLCLR_Msk 0x00100000UL /*!< Enable hardware clear low threshold comparator exceed event */ +#define SDFM_SD_CPARM_HWHCLR_Msk 0x00200000UL /*!< Enable hardware clear high threshold comparator exceed event */ +#define SDFM_SD_CPARM_HWHZCLR_Msk 0x00400000UL /*!< Enable hardware clear zero threshold comparator exceed event */ + +/*-- SD: DATA: Data Register ----------------------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Signed data value */ +} _SDFM_SD_DATA_bits; + +/* Bit field positions: */ +#define SDFM_SD_DATA_VAL_Pos 0 /*!< Signed data value */ + +/* Bit field masks: */ +#define SDFM_SD_DATA_VAL_Msk 0xFFFFFFFFUL /*!< Signed data value */ + +/*-- SD: CDATA: Comparator Data Register ----------------------------------------------------------------------*/ +typedef struct { + uint32_t VAL :32; /*!< Comparator Data Value */ +} _SDFM_SD_CDATA_bits; + +/* Bit field positions: */ +#define SDFM_SD_CDATA_VAL_Pos 0 /*!< Comparator Data Value */ + +/* Bit field masks: */ +#define SDFM_SD_CDATA_VAL_Msk 0xFFFFFFFFUL /*!< Comparator Data Value */ + +/*-- SD: FFCTL: FIFO Configuration Register -------------------------------------------------------------------*/ +typedef struct { + uint32_t IL :4; /*!< Interrupt level FIFO */ + uint32_t :4; /*!< RESERVED */ + uint32_t STAT :4; /*!< Status FIFO level */ + uint32_t :4; /*!< RESERVED */ + uint32_t EN :1; /*!< Enable FIFO */ + uint32_t IEN :1; /*!< Interrupt FIFO enable */ + uint32_t DRISEL :1; /*!< Data Ready Int source */ + uint32_t OVFIEN :1; /*!< Overflow interrupt enable */ +} _SDFM_SD_FFCTL_bits; + +/* Bit field positions: */ +#define SDFM_SD_FFCTL_IL_Pos 0 /*!< Interrupt level FIFO */ +#define SDFM_SD_FFCTL_STAT_Pos 8 /*!< Status FIFO level */ +#define SDFM_SD_FFCTL_EN_Pos 16 /*!< Enable FIFO */ +#define SDFM_SD_FFCTL_IEN_Pos 17 /*!< Interrupt FIFO enable */ +#define SDFM_SD_FFCTL_DRISEL_Pos 18 /*!< Data Ready Int source */ +#define SDFM_SD_FFCTL_OVFIEN_Pos 19 /*!< Overflow interrupt enable */ + +/* Bit field masks: */ +#define SDFM_SD_FFCTL_IL_Msk 0x0000000FUL /*!< Interrupt level FIFO */ +#define SDFM_SD_FFCTL_STAT_Msk 0x00000F00UL /*!< Status FIFO level */ +#define SDFM_SD_FFCTL_EN_Msk 0x00010000UL /*!< Enable FIFO */ +#define SDFM_SD_FFCTL_IEN_Msk 0x00020000UL /*!< Interrupt FIFO enable */ +#define SDFM_SD_FFCTL_DRISEL_Msk 0x00040000UL /*!< Data Ready Int source */ +#define SDFM_SD_FFCTL_OVFIEN_Msk 0x00080000UL /*!< Overflow interrupt enable */ + +/* Bit field enums: */ +typedef enum { + SDFM_SD_FFCTL_DRISEL_AckData = 0x0UL, /*!< acknowledge new data arrived */ + SDFM_SD_FFCTL_DRISEL_FIFOData = 0x1UL, /*!< FIFO data level */ +} SDFM_SD_FFCTL_DRISEL_Enum; + +/*-- SD: SYNC: Sync Control Register --------------------------------------------------------------------------*/ +typedef struct { + uint32_t SRC :3; /*!< Source syncronization selector for filter */ + uint32_t :1; /*!< RESERVED */ + uint32_t WTSEN :1; /*!< wait for sync enable */ + uint32_t WTSCLREN :1; /*!< WTSFLG cleared on FIFO data ready interrupt enable */ + uint32_t FFSCLREN :1; /*!< Clear FIFO on event enable */ + uint32_t WTSFLG :1; /*!< Event flag */ + uint32_t WTSFLGCLR :1; /*!< Clear WTSFLG manually writing 1 */ +} _SDFM_SD_SYNC_bits; + +/* Bit field positions: */ +#define SDFM_SD_SYNC_SRC_Pos 0 /*!< Source syncronization selector for filter */ +#define SDFM_SD_SYNC_WTSEN_Pos 4 /*!< wait for sync enable */ +#define SDFM_SD_SYNC_WTSCLREN_Pos 5 /*!< WTSFLG cleared on FIFO data ready interrupt enable */ +#define SDFM_SD_SYNC_FFSCLREN_Pos 6 /*!< Clear FIFO on event enable */ +#define SDFM_SD_SYNC_WTSFLG_Pos 7 /*!< Event flag */ +#define SDFM_SD_SYNC_WTSFLGCLR_Pos 8 /*!< Clear WTSFLG manually writing 1 */ + +/* Bit field masks: */ +#define SDFM_SD_SYNC_SRC_Msk 0x00000007UL /*!< Source syncronization selector for filter */ +#define SDFM_SD_SYNC_WTSEN_Msk 0x00000010UL /*!< wait for sync enable */ +#define SDFM_SD_SYNC_WTSCLREN_Msk 0x00000020UL /*!< WTSFLG cleared on FIFO data ready interrupt enable */ +#define SDFM_SD_SYNC_FFSCLREN_Msk 0x00000040UL /*!< Clear FIFO on event enable */ +#define SDFM_SD_SYNC_WTSFLG_Msk 0x00000080UL /*!< Event flag */ +#define SDFM_SD_SYNC_WTSFLGCLR_Msk 0x00000100UL /*!< Clear WTSFLG manually writing 1 */ + +/* Bit field enums: */ +typedef enum { + SDFM_SD_SYNC_SRC_PWM012A = 0x0UL, /*!< PWM0,1,2 A channel request */ + SDFM_SD_SYNC_SRC_PWM012B = 0x1UL, /*!< PWM0,1,2 B channel request */ + SDFM_SD_SYNC_SRC_PWM345A = 0x2UL, /*!< PWM3,4,5 A channel request */ + SDFM_SD_SYNC_SRC_PWM345B = 0x3UL, /*!< PWM3,4,5 B channel request */ + SDFM_SD_SYNC_SRC_PWM6789A = 0x4UL, /*!< PWM6,7,8,9 A channel request */ + SDFM_SD_SYNC_SRC_PWM6789B = 0x5UL, /*!< PWM6,7,8,9 B channel request */ + SDFM_SD_SYNC_SRC_TMR0 = 0x6UL, /*!< Timer 0 request */ + SDFM_SD_SYNC_SRC_TMR1 = 0x7UL, /*!< Timer 1 request */ +} SDFM_SD_SYNC_SRC_Enum; + +/*-- SD: DMACTL: DMA Control Register -------------------------------------------------------------------------*/ +typedef struct { + uint32_t LVL :4; /*!< Level FIFO data for DMA */ + uint32_t :27; /*!< RESERVED */ + uint32_t EN :1; /*!< Enable DMA */ +} _SDFM_SD_DMACTL_bits; + +/* Bit field positions: */ +#define SDFM_SD_DMACTL_LVL_Pos 0 /*!< Level FIFO data for DMA */ +#define SDFM_SD_DMACTL_EN_Pos 31 /*!< Enable DMA */ + +/* Bit field masks: */ +#define SDFM_SD_DMACTL_LVL_Msk 0x0000000FUL /*!< Level FIFO data for DMA */ +#define SDFM_SD_DMACTL_EN_Msk 0x80000000UL /*!< Enable DMA */ + +//Cluster SD: +typedef struct { + union { + /*!< Filter Control Register */ + __IO uint32_t CTLPARM; /*!< CTLPARM : type used for word access */ + __IO _SDFM_SD_CTLPARM_bits CTLPARM_bit; /*!< CTLPARM_bit: structure used for bit access */ + }; + union { + /*!< Data Filter Parameter Register */ + __IO uint32_t DFPARM; /*!< DFPARM : type used for word access */ + __IO _SDFM_SD_DFPARM_bits DFPARM_bit; /*!< DFPARM_bit: structure used for bit access */ + }; + union { + /*!< Shift Data Control Register */ + __IO uint32_t DPARM; /*!< DPARM : type used for word access */ + __IO _SDFM_SD_DPARM_bits DPARM_bit; /*!< DPARM_bit: structure used for bit access */ + }; + union { + /*!< High Level Comparator Register */ + __IO uint32_t CMPH; /*!< CMPH : type used for word access */ + __IO _SDFM_SD_CMPH_bits CMPH_bit; /*!< CMPH_bit: structure used for bit access */ + }; + union { + /*!< Zero Level Comparator Register */ + __IO uint32_t CMPHZ; /*!< CMPHZ : type used for word access */ + __IO _SDFM_SD_CMPHZ_bits CMPHZ_bit; /*!< CMPHZ_bit: structure used for bit access */ + }; + union { + /*!< Low Level Comparator Register */ + __IO uint32_t CMPL; /*!< CMPL : type used for word access */ + __IO _SDFM_SD_CMPL_bits CMPL_bit; /*!< CMPL_bit: structure used for bit access */ + }; + union { + /*!< Comparator Parameter register */ + __IO uint32_t CPARM; /*!< CPARM : type used for word access */ + __IO _SDFM_SD_CPARM_bits CPARM_bit; /*!< CPARM_bit: structure used for bit access */ + }; + union { + /*!< Data Register */ + __I uint32_t DATA; /*!< DATA : type used for word access */ + __I _SDFM_SD_DATA_bits DATA_bit; /*!< DATA_bit: structure used for bit access */ + }; + union { + /*!< Comparator Data Register */ + __I uint32_t CDATA; /*!< CDATA : type used for word access */ + __I _SDFM_SD_CDATA_bits CDATA_bit; /*!< CDATA_bit: structure used for bit access */ + }; + union { + /*!< FIFO Configuration Register */ + __IO uint32_t FFCTL; /*!< FFCTL : type used for word access */ + __IO _SDFM_SD_FFCTL_bits FFCTL_bit; /*!< FFCTL_bit: structure used for bit access */ + }; + union { + /*!< Sync Control Register */ + __IO uint32_t SYNC; /*!< SYNC : type used for word access */ + __IO _SDFM_SD_SYNC_bits SYNC_bit; /*!< SYNC_bit: structure used for bit access */ + }; + union { + /*!< DMA Control Register */ + __IO uint32_t DMACTL; /*!< DMACTL : type used for word access */ + __IO _SDFM_SD_DMACTL_bits DMACTL_bit; /*!< DMACTL_bit: structure used for bit access */ + }; +} _SDFM_SD_TypeDef; +typedef struct { + union { /*!< Interrupt Flag Register */ + __I uint32_t IFLG; /*!< IFLG : type used for word access */ + __I _SDFM_IFLG_bits IFLG_bit; /*!< IFLG_bit: structure used for bit access */ + }; + union { /*!< Clear Interrupt flag register */ + __O uint32_t IFLGCLR; /*!< IFLGCLR : type used for word access */ + __O _SDFM_IFLGCLR_bits IFLGCLR_bit; /*!< IFLGCLR_bit: structure used for bit access */ + }; + union { /*!< Comparator Flag Register */ + __I uint32_t CFLG; /*!< CFLG : type used for word access */ + __I _SDFM_CFLG_bits CFLG_bit; /*!< CFLG_bit: structure used for bit access */ + }; + union { /*!< Comparator Flag Clear Register */ + __O uint32_t CFLGCLR; /*!< CFLGCLR : type used for word access */ + __O _SDFM_CFLGCLR_bits CFLGCLR_bit; /*!< CFLGCLR_bit: structure used for bit access */ + }; + union { /*!< Control Register */ + __IO uint32_t CTL; /*!< CTL : type used for word access */ + __IO _SDFM_CTL_bits CTL_bit; /*!< CTL_bit: structure used for bit access */ + }; + union { /*!< Master Filter Enable Register */ + __IO uint32_t MFILEN; /*!< MFILEN : type used for word access */ + __IO _SDFM_MFILEN_bits MFILEN_bit; /*!< MFILEN_bit: structure used for bit access */ + }; + _SDFM_SD_TypeDef SD[4]; +} SDFM_TypeDef; + + + +/* -------------------- End of section using anonymous unions ------------------- */ +#if defined(__CC_ARM) + #pragma pop +#elif defined(__ICCARM__) + /* leave anonymous unions enabled */ +#elif defined(__GNUC__) + /* anonymous unions are enabled by default */ +#elif defined(__TMS470__) + /* anonymous unions are enabled by default */ +#elif defined(__TASKING__) + #pragma warning restore +#elif defined (__CMCPPARM__) + /* anonymous unions are enabled by default */ +#else + #warning Not supported compiler type +#endif + +/******************************************************************************/ +/* Peripheral memory map */ +/******************************************************************************/ +#define GPIOA_BASE (0x40010000UL) +#define GPIOB_BASE (0x40011000UL) +#define GPIOC_BASE (0x40012000UL) +#define GPIOD_BASE (0x40013000UL) +#define GPIOE_BASE (0x40014000UL) +#define GPIOF_BASE (0x40015000UL) +#define GPIOG_BASE (0x40016000UL) +#define GPIOH_BASE (0x40017000UL) +#define GPIOJ_BASE (0x40018000UL) +#define GPIOK_BASE (0x40019000UL) +#define GPIOL_BASE (0x4001A000UL) +#define GPIOM_BASE (0x4001B000UL) +#define CAN_BASE (0x40020000UL) +#define CANMSG_BASE (0x40021000UL) +#define ETH_BASE (0x40030000UL) +#define TMU_BASE (0x40040000UL) +#define MFLASH_BASE (0x40060000UL) +#define BFLASH_BASE (0x40061000UL) +#define EXTMEM_BASE (0x40062000UL) +#define SPWR0_BASE (0x40070000UL) +#define SPWR1_BASE (0x40071000UL) +#define MILSTD0_BASE (0x40072000UL) +#define MILSTD1_BASE (0x40073000UL) +#define SPWRTMR_BASE (0x40074000UL) +#define SDFM_BASE (0x40075000UL) +#define SIU_BASE (0x40080000UL) +#define RCU_BASE (0x40081000UL) +#define PMU_BASE (0x40082000UL) +#define WDT_BASE (0x40083000UL) +#define DMA_BASE (0x40084000UL) +#define UART0_BASE (0x40085000UL) +#define UART1_BASE (0x40086000UL) +#define UART2_BASE (0x40087000UL) +#define UART3_BASE (0x40088000UL) +#define TUART0_BASE (0x40089000UL) +#define TUART1_BASE (0x4008A000UL) +#define I2C0_BASE (0x4008B000UL) +#define I2C1_BASE (0x4008C000UL) +#define SPI0_BASE (0x4008D000UL) +#define SPI1_BASE (0x4008E000UL) +#define SPI2_BASE (0x4008F000UL) +#define SPI3_BASE (0x40090000UL) +#define TMR0_BASE (0x40091000UL) +#define TMR1_BASE (0x40092000UL) +#define TMR2_BASE (0x40093000UL) +#define TMR3_BASE (0x40094000UL) +#define ETMR0_BASE (0x40095000UL) +#define ETMR1_BASE (0x40096000UL) +#define ETMR2_BASE (0x40097000UL) +#define ETMR3_BASE (0x40098000UL) +#define RTC_BASE (0x40099000UL) +#define ECAP0_BASE (0x4009A000UL) +#define ECAP1_BASE (0x4009B000UL) +#define ECAP2_BASE (0x4009C000UL) +#define ECAP3_BASE (0x4009D000UL) +#define ECAP4_BASE (0x4009E000UL) +#define ECAP5_BASE (0x4009F000UL) +#define PWM0_BASE (0x400A0000UL) +#define PWM1_BASE (0x400A1000UL) +#define PWM2_BASE (0x400A2000UL) +#define PWM3_BASE (0x400A3000UL) +#define PWM4_BASE (0x400A4000UL) +#define PWM5_BASE (0x400A5000UL) +#define PWM6_BASE (0x400A6000UL) +#define PWM7_BASE (0x400A7000UL) +#define PWM8_BASE (0x400A8000UL) +#define PWM9_BASE (0x400A9000UL) +#define QEP0_BASE (0x400AA000UL) +#define QEP1_BASE (0x400AB000UL) +#define QEP2_BASE (0x400AC000UL) +#define QEP3_BASE (0x400AD000UL) +#define LAU_BASE (0x400AE000UL) +#define OWI0_BASE (0x400AF000UL) +#define OWI1_BASE (0x400B0000UL) +#define ADC_BASE (0x400B1000UL) + +/******************************************************************************/ +/* Peripheral declaration */ +/******************************************************************************/ +#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE) +#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE) +#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE) +#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE) +#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE) +#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE) +#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE) +#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE) +#define GPIOJ ((GPIO_TypeDef *) GPIOJ_BASE) +#define GPIOK ((GPIO_TypeDef *) GPIOK_BASE) +#define GPIOL ((GPIO_TypeDef *) GPIOL_BASE) +#define GPIOM ((GPIO_TypeDef *) GPIOM_BASE) +#define CAN ((CAN_TypeDef *) CAN_BASE) +#define CANMSG ((CANMSG_TypeDef *) CANMSG_BASE) +#define ETH ((ETH_TypeDef *) ETH_BASE) +#define TMU ((TMU_TypeDef *) TMU_BASE) +#define MFLASH ((MFLASH_TypeDef *) MFLASH_BASE) +#define BFLASH ((BFLASH_TypeDef *) BFLASH_BASE) +#define EXTMEM ((EXTMEM_TypeDef *) EXTMEM_BASE) +#define SPWR0 ((SPWR_TypeDef *) SPWR0_BASE) +#define SPWR1 ((SPWR_TypeDef *) SPWR1_BASE) +#define MILSTD0 ((MILSTD_TypeDef *) MILSTD0_BASE) +#define MILSTD1 ((MILSTD_TypeDef *) MILSTD1_BASE) +#define SPWRTMR ((SPWRTMR_TypeDef *) SPWRTMR_BASE) +#define SDFM ((SDFM_TypeDef *) SDFM_BASE) +#define SIU ((SIU_TypeDef *) SIU_BASE) +#define RCU ((RCU_TypeDef *) RCU_BASE) +#define PMU ((PMU_TypeDef *) PMU_BASE) +#define WDT ((WDT_TypeDef *) WDT_BASE) +#define DMA ((DMA_TypeDef *) DMA_BASE) +#define UART0 ((UART_TypeDef *) UART0_BASE) +#define UART1 ((UART_TypeDef *) UART1_BASE) +#define UART2 ((UART_TypeDef *) UART2_BASE) +#define UART3 ((UART_TypeDef *) UART3_BASE) +#define TUART0 ((TUART_TypeDef *) TUART0_BASE) +#define TUART1 ((TUART_TypeDef *) TUART1_BASE) +#define I2C0 ((I2C_TypeDef *) I2C0_BASE) +#define I2C1 ((I2C_TypeDef *) I2C1_BASE) +#define SPI0 ((SPI_TypeDef *) SPI0_BASE) +#define SPI1 ((SPI_TypeDef *) SPI1_BASE) +#define SPI2 ((SPI_TypeDef *) SPI2_BASE) +#define SPI3 ((SPI_TypeDef *) SPI3_BASE) +#define TMR0 ((TMR_TypeDef *) TMR0_BASE) +#define TMR1 ((TMR_TypeDef *) TMR1_BASE) +#define TMR2 ((TMR_TypeDef *) TMR2_BASE) +#define TMR3 ((TMR_TypeDef *) TMR3_BASE) +#define ETMR0 ((ETMR_TypeDef *) ETMR0_BASE) +#define ETMR1 ((ETMR_TypeDef *) ETMR1_BASE) +#define ETMR2 ((ETMR_TypeDef *) ETMR2_BASE) +#define ETMR3 ((ETMR_TypeDef *) ETMR3_BASE) +#define RTC ((RTC_TypeDef *) RTC_BASE) +#define ECAP0 ((ECAP_TypeDef *) ECAP0_BASE) +#define ECAP1 ((ECAP_TypeDef *) ECAP1_BASE) +#define ECAP2 ((ECAP_TypeDef *) ECAP2_BASE) +#define ECAP3 ((ECAP_TypeDef *) ECAP3_BASE) +#define ECAP4 ((ECAP_TypeDef *) ECAP4_BASE) +#define ECAP5 ((ECAP_TypeDef *) ECAP5_BASE) +#define PWM0 ((PWM_TypeDef *) PWM0_BASE) +#define PWM1 ((PWM_TypeDef *) PWM1_BASE) +#define PWM2 ((PWM_TypeDef *) PWM2_BASE) +#define PWM3 ((PWM_TypeDef *) PWM3_BASE) +#define PWM4 ((PWM_TypeDef *) PWM4_BASE) +#define PWM5 ((PWM_TypeDef *) PWM5_BASE) +#define PWM6 ((PWM_TypeDef *) PWM6_BASE) +#define PWM7 ((PWM_TypeDef *) PWM7_BASE) +#define PWM8 ((PWM_TypeDef *) PWM8_BASE) +#define PWM9 ((PWM_TypeDef *) PWM9_BASE) +#define QEP0 ((QEP_TypeDef *) QEP0_BASE) +#define QEP1 ((QEP_TypeDef *) QEP1_BASE) +#define QEP2 ((QEP_TypeDef *) QEP2_BASE) +#define QEP3 ((QEP_TypeDef *) QEP3_BASE) +#define LAU ((LAU_TypeDef *) LAU_BASE) +#define OWI0 ((OWI_TypeDef *) OWI0_BASE) +#define OWI1 ((OWI_TypeDef *) OWI1_BASE) +#define ADC ((ADC_TypeDef *) ADC_BASE) + +/******************************************************************************/ +/* Peripheral capabilities */ +/******************************************************************************/ +#define GPIO_PRESENT +#define GPIO_TOTAL 12 +typedef enum { + GPIOA_Num, + GPIOB_Num, + GPIOC_Num, + GPIOD_Num, + GPIOE_Num, + GPIOF_Num, + GPIOG_Num, + GPIOH_Num, + GPIOJ_Num, + GPIOK_Num, + GPIOL_Num, + GPIOM_Num +} GPIO_Num_TypeDef; + +#define CAN_PRESENT +#define CAN_TOTAL 1 +typedef enum { + CAN_Num +} CAN_Num_TypeDef; + +#define CANMSG_PRESENT +#define CANMSG_TOTAL 1 +typedef enum { + CANMSG_Num +} CANMSG_Num_TypeDef; + +#define ETH_PRESENT +#define ETH_TOTAL 1 +typedef enum { + ETH_Num +} ETH_Num_TypeDef; + +#define TMU_PRESENT +#define TMU_TOTAL 1 +typedef enum { + TMU_Num +} TMU_Num_TypeDef; + +#define MFLASH_PRESENT +#define MFLASH_TOTAL 1 +typedef enum { + MFLASH_Num +} MFLASH_Num_TypeDef; + +#define BFLASH_PRESENT +#define BFLASH_TOTAL 1 +typedef enum { + BFLASH_Num +} BFLASH_Num_TypeDef; + +#define EXTMEM_PRESENT +#define EXTMEM_TOTAL 1 +typedef enum { + EXTMEM_Num +} EXTMEM_Num_TypeDef; + +#define SPWR_PRESENT +#define SPWR_TOTAL 2 +typedef enum { + SPWR0_Num, + SPWR1_Num +} SPWR_Num_TypeDef; + +#define MILSTD_PRESENT +#define MILSTD_TOTAL 2 +typedef enum { + MILSTD0_Num, + MILSTD1_Num +} MILSTD_Num_TypeDef; + +#define SPWRTMR_PRESENT +#define SPWRTMR_TOTAL 1 +typedef enum { + SPWRTMR_Num +} SPWRTMR_Num_TypeDef; + +#define SDFM_PRESENT +#define SDFM_TOTAL 1 +typedef enum { + SDFM_Num +} SDFM_Num_TypeDef; + +#define SIU_PRESENT +#define SIU_TOTAL 1 +typedef enum { + SIU_Num +} SIU_Num_TypeDef; + +#define RCU_PRESENT +#define RCU_TOTAL 1 +typedef enum { + RCU_Num +} RCU_Num_TypeDef; + +#define PMU_PRESENT +#define PMU_TOTAL 1 +typedef enum { + PMU_Num +} PMU_Num_TypeDef; + +#define WDT_PRESENT +#define WDT_TOTAL 1 +typedef enum { + WDT_Num +} WDT_Num_TypeDef; + +#define DMA_PRESENT +#define DMA_TOTAL 1 +typedef enum { + DMA_Num +} DMA_Num_TypeDef; + +#define UART_PRESENT +#define UART_TOTAL 4 +typedef enum { + UART0_Num, + UART1_Num, + UART2_Num, + UART3_Num +} UART_Num_TypeDef; + +#define TUART_PRESENT +#define TUART_TOTAL 2 +typedef enum { + TUART0_Num, + TUART1_Num +} TUART_Num_TypeDef; + +#define I2C_PRESENT +#define I2C_TOTAL 2 +typedef enum { + I2C0_Num, + I2C1_Num +} I2C_Num_TypeDef; + +#define SPI_PRESENT +#define SPI_TOTAL 4 +typedef enum { + SPI0_Num, + SPI1_Num, + SPI2_Num, + SPI3_Num +} SPI_Num_TypeDef; + +#define TMR_PRESENT +#define TMR_TOTAL 4 +typedef enum { + TMR0_Num, + TMR1_Num, + TMR2_Num, + TMR3_Num +} TMR_Num_TypeDef; + +#define ETMR_PRESENT +#define ETMR_TOTAL 4 +typedef enum { + ETMR0_Num, + ETMR1_Num, + ETMR2_Num, + ETMR3_Num +} ETMR_Num_TypeDef; + +#define RTC_PRESENT +#define RTC_TOTAL 1 +typedef enum { + RTC_Num +} RTC_Num_TypeDef; + +#define ECAP_PRESENT +#define ECAP_TOTAL 6 +typedef enum { + ECAP0_Num, + ECAP1_Num, + ECAP2_Num, + ECAP3_Num, + ECAP4_Num, + ECAP5_Num +} ECAP_Num_TypeDef; + +#define PWM_PRESENT +#define PWM_TOTAL 10 +typedef enum { + PWM0_Num, + PWM1_Num, + PWM2_Num, + PWM3_Num, + PWM4_Num, + PWM5_Num, + PWM6_Num, + PWM7_Num, + PWM8_Num, + PWM9_Num +} PWM_Num_TypeDef; + +#define QEP_PRESENT +#define QEP_TOTAL 4 +typedef enum { + QEP0_Num, + QEP1_Num, + QEP2_Num, + QEP3_Num +} QEP_Num_TypeDef; + +#define LAU_PRESENT +#define LAU_TOTAL 1 +typedef enum { + LAU_Num +} LAU_Num_TypeDef; + +#define OWI_PRESENT +#define OWI_TOTAL 2 +typedef enum { + OWI0_Num, + OWI1_Num +} OWI_Num_TypeDef; + +#define ADC_PRESENT +#define ADC_TOTAL 1 +typedef enum { + ADC_Num +} ADC_Num_TypeDef; + +/******************************************************************************/ +/* Peripheral assertions */ +/******************************************************************************/ +#define IS_GPIO_PERIPH(PERIPH) (((PERIPH) == GPIOA) || \ + ((PERIPH) == GPIOB) || \ + ((PERIPH) == GPIOC) || \ + ((PERIPH) == GPIOD) || \ + ((PERIPH) == GPIOE) || \ + ((PERIPH) == GPIOF) || \ + ((PERIPH) == GPIOG) || \ + ((PERIPH) == GPIOH) || \ + ((PERIPH) == GPIOJ) || \ + ((PERIPH) == GPIOK) || \ + ((PERIPH) == GPIOL) || \ + ((PERIPH) == GPIOM)) +#define IS_CAN_PERIPH(PERIPH) (((PERIPH) == CAN)) +#define IS_CANMSG_PERIPH(PERIPH) (((PERIPH) == CANMSG)) +#define IS_ETH_PERIPH(PERIPH) (((PERIPH) == ETH)) +#define IS_TMU_PERIPH(PERIPH) (((PERIPH) == TMU)) +#define IS_MFLASH_PERIPH(PERIPH) (((PERIPH) == MFLASH)) +#define IS_BFLASH_PERIPH(PERIPH) (((PERIPH) == BFLASH)) +#define IS_EXTMEM_PERIPH(PERIPH) (((PERIPH) == EXTMEM)) +#define IS_SPWR_PERIPH(PERIPH) (((PERIPH) == SPWR0) || \ + ((PERIPH) == SPWR1)) +#define IS_MILSTD_PERIPH(PERIPH) (((PERIPH) == MILSTD0) || \ + ((PERIPH) == MILSTD1)) +#define IS_SPWRTMR_PERIPH(PERIPH) (((PERIPH) == SPWRTMR)) +#define IS_SDFM_PERIPH(PERIPH) (((PERIPH) == SDFM)) +#define IS_SIU_PERIPH(PERIPH) (((PERIPH) == SIU)) +#define IS_RCU_PERIPH(PERIPH) (((PERIPH) == RCU)) +#define IS_PMU_PERIPH(PERIPH) (((PERIPH) == PMU)) +#define IS_WDT_PERIPH(PERIPH) (((PERIPH) == WDT)) +#define IS_DMA_PERIPH(PERIPH) (((PERIPH) == DMA)) +#define IS_UART_PERIPH(PERIPH) (((PERIPH) == UART0) || \ + ((PERIPH) == UART1) || \ + ((PERIPH) == UART2) || \ + ((PERIPH) == UART3)) +#define IS_TUART_PERIPH(PERIPH) (((PERIPH) == TUART0) || \ + ((PERIPH) == TUART1)) +#define IS_I2C_PERIPH(PERIPH) (((PERIPH) == I2C0) || \ + ((PERIPH) == I2C1)) +#define IS_SPI_PERIPH(PERIPH) (((PERIPH) == SPI0) || \ + ((PERIPH) == SPI1) || \ + ((PERIPH) == SPI2) || \ + ((PERIPH) == SPI3)) +#define IS_TMR_PERIPH(PERIPH) (((PERIPH) == TMR0) || \ + ((PERIPH) == TMR1) || \ + ((PERIPH) == TMR2) || \ + ((PERIPH) == TMR3)) +#define IS_ETMR_PERIPH(PERIPH) (((PERIPH) == ETMR0) || \ + ((PERIPH) == ETMR1) || \ + ((PERIPH) == ETMR2) || \ + ((PERIPH) == ETMR3)) +#define IS_RTC_PERIPH(PERIPH) (((PERIPH) == RTC)) +#define IS_ECAP_PERIPH(PERIPH) (((PERIPH) == ECAP0) || \ + ((PERIPH) == ECAP1) || \ + ((PERIPH) == ECAP2) || \ + ((PERIPH) == ECAP3) || \ + ((PERIPH) == ECAP4) || \ + ((PERIPH) == ECAP5)) +#define IS_PWM_PERIPH(PERIPH) (((PERIPH) == PWM0) || \ + ((PERIPH) == PWM1) || \ + ((PERIPH) == PWM2) || \ + ((PERIPH) == PWM3) || \ + ((PERIPH) == PWM4) || \ + ((PERIPH) == PWM5) || \ + ((PERIPH) == PWM6) || \ + ((PERIPH) == PWM7) || \ + ((PERIPH) == PWM8) || \ + ((PERIPH) == PWM9)) +#define IS_QEP_PERIPH(PERIPH) (((PERIPH) == QEP0) || \ + ((PERIPH) == QEP1) || \ + ((PERIPH) == QEP2) || \ + ((PERIPH) == QEP3)) +#define IS_LAU_PERIPH(PERIPH) (((PERIPH) == LAU)) +#define IS_OWI_PERIPH(PERIPH) (((PERIPH) == OWI0) || \ + ((PERIPH) == OWI1)) +#define IS_ADC_PERIPH(PERIPH) (((PERIPH) == ADC)) + +#ifdef __cplusplus +} +#endif + +#endif /* __K1921VK028_H */ + +/************************** (C) COPYRIGHT 2019 NIIET *************************** +* +* END OF FILE K1921VK028.h */ diff --git a/include/cmsis_armcc.h b/include/cmsis_armcc.h new file mode 100644 index 0000000..b127d2f --- /dev/null +++ b/include/cmsis_armcc.h @@ -0,0 +1,867 @@ +/**************************************************************************//** + * @file cmsis_armcc.h + * @brief CMSIS compiler ARMCC (ARM compiler V5) header file + * @version V5.0.2 + * @date 13. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#ifndef __CMSIS_ARMCC_H +#define __CMSIS_ARMCC_H + + +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 400677) + #error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* CMSIS compiler control architecture macros */ +#if ((defined (__TARGET_ARCH_6_M ) && (__TARGET_ARCH_6_M == 1)) || \ + (defined (__TARGET_ARCH_6S_M ) && (__TARGET_ARCH_6S_M == 1)) ) + #define __ARM_ARCH_6M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7_M ) && (__TARGET_ARCH_7_M == 1)) + #define __ARM_ARCH_7M__ 1 +#endif + +#if (defined (__TARGET_ARCH_7E_M) && (__TARGET_ARCH_7E_M == 1)) + #define __ARM_ARCH_7EM__ 1 +#endif + + /* __ARM_ARCH_8M_BASE__ not applicable */ + /* __ARM_ARCH_8M_MAIN__ not applicable */ + + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __declspec(noreturn) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed)) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #define __UNALIGNED_UINT32(x) (*((__packed uint32_t *)(x))) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #define __UNALIGNED_UINT16_WRITE(addr, val) ((*((__packed uint16_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #define __UNALIGNED_UINT16_READ(addr) (*((const __packed uint16_t *)(addr))) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #define __UNALIGNED_UINT32_WRITE(addr, val) ((*((__packed uint32_t *)(addr))) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #define __UNALIGNED_UINT32_READ(addr) (*((const __packed uint32_t *)(addr))) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); */ + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xFFU); +} + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + register uint32_t __regBasePriMax __ASM("basepri_max"); + __regBasePriMax = (basePri & 0xFFU); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1U); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() do {\ + __schedule_barrier();\ + __isb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() do {\ + __schedule_barrier();\ + __dsb(0xF);\ + __schedule_barrier();\ + } while (0U) + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() do {\ + __schedule_barrier();\ + __dmb(0xF);\ + __schedule_barrier();\ + } while (0U) + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} +#endif + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int16_t __REVSH(int16_t value) +{ + revsh r0, r0 + bx lr +} +#endif + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __breakpoint(value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + #define __RBIT __rbit +#else +__attribute__((always_inline)) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ + return result; +} +#endif + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) +#else + #define __LDREXB(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint8_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) +#else + #define __LDREXH(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint16_t) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) +#else + #define __LDREXW(ptr) _Pragma("push") _Pragma("diag_suppress 3731") ((uint32_t ) __ldrex(ptr)) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXB(value, ptr) __strex(value, ptr) +#else + #define __STREXB(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXH(value, ptr) __strex(value, ptr) +#else + #define __STREXH(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION < 5060020) + #define __STREXW(value, ptr) __strex(value, ptr) +#else + #define __STREXW(value, ptr) _Pragma("push") _Pragma("diag_suppress 3731") __strex(value, ptr) _Pragma("pop") +#endif + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __clrex + + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +#ifndef __NO_EMBEDDED_ASM +__attribute__((section(".rrx_text"))) __STATIC_INLINE __ASM uint32_t __RRX(uint32_t value) +{ + rrx r0, r0 + bx lr +} +#endif + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDRBT(ptr) ((uint8_t ) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDRHT(ptr) ((uint16_t) __ldrt(ptr)) + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDRT(ptr) ((uint32_t ) __ldrt(ptr)) + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRBT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRHT(value, ptr) __strt(value, ptr) + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +#define __STRT(value, ptr) __strt(value, ptr) + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__attribute__((always_inline)) __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) + +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +#define __SMMLA(ARG1,ARG2,ARG3) ( (int32_t)((((int64_t)(ARG1) * (ARG2)) + \ + ((int64_t)(ARG3) << 32U) ) >> 32U)) + +#endif /* ((defined (__ARM_ARCH_7EM__) && (__ARM_ARCH_7EM__ == 1)) ) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCC_H */ diff --git a/include/cmsis_armclang.h b/include/cmsis_armclang.h new file mode 100644 index 0000000..50b839d --- /dev/null +++ b/include/cmsis_armclang.h @@ -0,0 +1,1815 @@ +/**************************************************************************//** + * @file cmsis_armclang.h + * @brief CMSIS compiler ARMCLANG (ARM compiler V6) header file + * @version V5.0.3 + * @date 27. March 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ + +#ifndef __CMSIS_ARMCLANG_H +#define __CMSIS_ARMCLANG_H + +#pragma clang system_header /* treat file as system include file */ + +#ifndef __ARM_COMPAT_H +#include /* Compatibility header for ARM Compiler 5 intrinsics */ +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE __inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static __inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-Wpacked" +/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma clang diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __enable_irq(); see arm_compat.h */ + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +/* intrinsic void __disable_irq(); see arm_compat.h */ + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Process Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Main Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Main Stack Pointer Limit (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr +#else +#define __get_FPSCR() ((uint32_t)0U) +#endif + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#define __set_FPSCR __builtin_arm_set_fpscr +#else +#define __set_FPSCR(x) ((void)(x)) +#endif + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __builtin_arm_nop + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI __builtin_arm_wfi + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __builtin_arm_wfe + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __builtin_arm_sev + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +#define __ISB() __builtin_arm_isb(0xF); + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __builtin_arm_dsb(0xF); + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __builtin_arm_dmb(0xF); + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV(value) __builtin_bswap32(value) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV16(value) __ROR(__REV(value), 16) + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +#define __REVSH(value) (int16_t)__builtin_bswap16(value) + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __builtin_arm_rbit + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ (uint8_t)__builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB (uint8_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH (uint16_t)__builtin_arm_ldrex + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW (uint32_t)__builtin_arm_ldrex + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH (uint32_t)__builtin_arm_strex + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW (uint32_t)__builtin_arm_strex + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +#define __CLREX __builtin_arm_clrex + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __builtin_arm_ssat + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __builtin_arm_usat + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDAEXB (uint8_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDAEXH (uint16_t)__builtin_arm_ldaex + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDAEX (uint32_t)__builtin_arm_ldaex + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXB (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEXH (uint32_t)__builtin_arm_stlex + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STLEX (uint32_t)__builtin_arm_stlex + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CMSIS_ARMCLANG_H */ diff --git a/include/cmsis_cmcpp.h b/include/cmsis_cmcpp.h new file mode 100644 index 0000000..bf67a89 --- /dev/null +++ b/include/cmsis_cmcpp.h @@ -0,0 +1,127 @@ +/**************************************************************************//** + * @file cmsis_cmcpp.h + * @brief CMSIS compiler CMCPP_ARM header file + * @version V5.0.2 + * @date 13. February 2018 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#ifndef __CMSIS_CMCPP_H +#define __CMSIS_CMCPP_H + +/* ignore some GCC warnings */ +/*#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" */ + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE static inline /*__attribute__((always_inline)) static inline*/ +#endif +#ifndef __NO_RETURN + #define __NO_RETURN /*__attribute__((__noreturn__))*/ +#endif +#ifndef __USED + #define __USED /*__attribute__((used))*/ +#endif +#ifndef __WEAK + #define __WEAK /*__attribute__((weak))*/ +#endif +#ifndef __PACKED + #define __PACKED __packed +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT __packed struct +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION __packed union +#endif + +//#ifndef __UNALIGNED_UINT32 /* deprecated */ +/* #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif */ +#ifndef __ALIGNED + #define __ALIGNED(x) /*__attribute__((aligned(x)))*/ +#endif +#ifndef __RESTRICT + #define __RESTRICT /*__restrict*/ +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + + +#endif /* __CMSISG_CMCPP_H */ + diff --git a/include/cmsis_compiler.h b/include/cmsis_compiler.h new file mode 100644 index 0000000..2613c28 --- /dev/null +++ b/include/cmsis_compiler.h @@ -0,0 +1,264 @@ +/**************************************************************************//** + * @file cmsis_compiler.h + * @brief CMSIS compiler generic header file + * @version V5.0.2 + * @date 13. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#ifndef __CMSIS_COMPILER_H +#define __CMSIS_COMPILER_H + +#include + +/* + * ARM Compiler 4/5 + */ +#if defined ( __CC_ARM ) + #include "cmsis_armcc.h" + + +/* + * ARM Compiler 6 (armclang) + */ +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #include "cmsis_armclang.h" + + +/* + * GNU Compiler + */ +#elif defined ( __GNUC__ ) + #include "cmsis_gcc.h" + + +/* + * CMCPP-ARM Compiler + */ +#elif defined ( __CMCPPARM__ ) + #include "cmsis_cmcpp.h" + + +/* + * IAR Compiler + */ +#elif defined ( __ICCARM__ ) + #include + + +/* + * TI ARM Compiler + */ +#elif defined ( __TI_ARM__ ) + #include + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __attribute__((packed)) + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed)) + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed)) + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * TASKING Compiler + */ +#elif defined ( __TASKING__ ) + /* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + + #ifndef __ASM + #define __ASM __asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + #define __NO_RETURN __attribute__((noreturn)) + #endif + #ifndef __USED + #define __USED __attribute__((used)) + #endif + #ifndef __WEAK + #define __WEAK __attribute__((weak)) + #endif + #ifndef __PACKED + #define __PACKED __packed__ + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __packed__ + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION union __packed__ + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + struct __packed__ T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #define __ALIGNED(x) __align(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +/* + * COSMIC Compiler + */ +#elif defined ( __CSMC__ ) + #include + + #ifndef __ASM + #define __ASM _asm + #endif + #ifndef __INLINE + #define __INLINE inline + #endif + #ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline + #endif + #ifndef __NO_RETURN + // NO RETURN is automatically detected hence no warning here + #define __NO_RETURN + #endif + #ifndef __USED + #warning No compiler specific solution for __USED. __USED is ignored. + #define __USED + #endif + #ifndef __WEAK + #define __WEAK __weak + #endif + #ifndef __PACKED + #define __PACKED @packed + #endif + #ifndef __PACKED_STRUCT + #define __PACKED_STRUCT @packed struct + #endif + #ifndef __PACKED_UNION + #define __PACKED_UNION @packed union + #endif + #ifndef __UNALIGNED_UINT32 /* deprecated */ + @packed struct T_UINT32 { uint32_t v; }; + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) + #endif + #ifndef __UNALIGNED_UINT16_WRITE + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT16_READ + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) + #endif + #ifndef __UNALIGNED_UINT32_WRITE + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) + #endif + #ifndef __UNALIGNED_UINT32_READ + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) + #endif + #ifndef __ALIGNED + #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. + #define __ALIGNED(x) + #endif + #ifndef __RESTRICT + #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. + #define __RESTRICT + #endif + + +#else + #error Unknown compiler. +#endif + + +#endif /* __CMSIS_COMPILER_H */ + diff --git a/include/cmsis_gcc.h b/include/cmsis_gcc.h new file mode 100644 index 0000000..8401734 --- /dev/null +++ b/include/cmsis_gcc.h @@ -0,0 +1,2026 @@ +/**************************************************************************//** + * @file cmsis_gcc.h + * @brief CMSIS compiler GCC header file + * @version V5.0.2 + * @date 13. February 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#ifndef __CMSIS_GCC_H +#define __CMSIS_GCC_H + +/* ignore some GCC warnings */ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wsign-conversion" +#pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic ignored "-Wunused-parameter" + +/* Fallback for __has_builtin */ +#ifndef __has_builtin + #define __has_builtin(x) (0) +#endif + +/* CMSIS compiler specific defines */ +#ifndef __ASM + #define __ASM __asm +#endif +#ifndef __INLINE + #define __INLINE inline +#endif +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif +#ifndef __STATIC_FORCEINLINE + #define __STATIC_FORCEINLINE __attribute__((always_inline)) static inline +#endif +#ifndef __NO_RETURN + #define __NO_RETURN __attribute__((__noreturn__)) +#endif +#ifndef __USED + #define __USED __attribute__((used)) +#endif +#ifndef __WEAK + #define __WEAK __attribute__((weak)) +#endif +#ifndef __PACKED + #define __PACKED __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_STRUCT + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) +#endif +#ifndef __PACKED_UNION + #define __PACKED_UNION union __attribute__((packed, aligned(1))) +#endif +#ifndef __UNALIGNED_UINT32 /* deprecated */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + struct __attribute__((packed)) T_UINT32 { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) +#endif +#ifndef __UNALIGNED_UINT16_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT16_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) +#endif +#ifndef __UNALIGNED_UINT32_WRITE + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) +#endif +#ifndef __UNALIGNED_UINT32_READ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wpacked" + #pragma GCC diagnostic ignored "-Wattributes" + __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; + #pragma GCC diagnostic pop + #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) +#endif +#ifndef __ALIGNED + #define __ALIGNED(x) __attribute__((aligned(x))) +#endif +#ifndef __RESTRICT + #define __RESTRICT __restrict +#endif + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +/** + \brief Enable IRQ Interrupts + \details Enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i" : : : "memory"); +} + + +/** + \brief Disable IRQ Interrupts + \details Disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i" : : : "memory"); +} + + +/** + \brief Get Control Register + \details Returns the content of the Control Register. + \return Control Register value + */ +__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Control Register (non-secure) + \details Returns the content of the non-secure Control Register when in secure mode. + \return non-secure Control Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Control Register + \details Writes the given value to the Control Register. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Control Register (non-secure) + \details Writes the given value to the non-secure Control Register when in secure state. + \param [in] control Control Register value to set + */ +__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) +{ + __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); +} +#endif + + +/** + \brief Get IPSR Register + \details Returns the content of the IPSR Register. + \return IPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get APSR Register + \details Returns the content of the APSR Register. + \return APSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get xPSR Register + \details Returns the content of the xPSR Register. + \return xPSR Register value + */ +__STATIC_FORCEINLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** + \brief Get Process Stack Pointer + \details Returns the current value of the Process Stack Pointer (PSP). + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Process Stack Pointer (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. + \return PSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer + \details Assigns the given value to the Process Stack Pointer (PSP). + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); +} +#endif + + +/** + \brief Get Main Stack Pointer + \details Returns the current value of the Main Stack Pointer (MSP). + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Main Stack Pointer (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. + \return MSP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer + \details Assigns the given value to the Main Stack Pointer (MSP). + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Main Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); +} +#endif + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Stack Pointer (non-secure) + \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. + \return SP Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); + return(result); +} + + +/** + \brief Set Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. + \param [in] topOfStack Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) +{ + __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); +} +#endif + + +/** + \brief Get Priority Mask + \details Returns the current state of the priority mask bit from the Priority Mask Register. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) :: "memory"); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Priority Mask (non-secure) + \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. + \return Priority Mask value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask_ns" : "=r" (result) :: "memory"); + return(result); +} +#endif + + +/** + \brief Set Priority Mask + \details Assigns the given value to the Priority Mask Register. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Priority Mask (non-secure) + \details Assigns the given value to the non-secure Priority Mask Register when in secure state. + \param [in] priMask Priority Mask + */ +__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) +{ + __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); +} +#endif + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Enable FIQ + \details Enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f" : : : "memory"); +} + + +/** + \brief Disable FIQ + \details Disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__STATIC_FORCEINLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f" : : : "memory"); +} + + +/** + \brief Get Base Priority + \details Returns the current value of the Base Priority register. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Base Priority (non-secure) + \details Returns the current value of the non-secure Base Priority register when in secure state. + \return Base Priority register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Base Priority + \details Assigns the given value to the Base Priority register. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Base Priority (non-secure) + \details Assigns the given value to the non-secure Base Priority register when in secure state. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); +} +#endif + + +/** + \brief Set Base Priority with condition + \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, + or the new value increases the BASEPRI priority level. + \param [in] basePri Base Priority value to set + */ +__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) +{ + __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); +} + + +/** + \brief Get Fault Mask + \details Returns the current value of the Fault Mask register. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Get Fault Mask (non-secure) + \details Returns the current value of the non-secure Fault Mask register when in secure state. + \return Fault Mask register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Fault Mask + \details Assigns the given value to the Fault Mask register. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); +} + + +#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) +/** + \brief Set Fault Mask (non-secure) + \details Assigns the given value to the non-secure Fault Mask register when in secure state. + \param [in] faultMask Fault Mask value to set + */ +__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); +} +#endif + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + +/** + \brief Get Process Stack Pointer Limit + \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim" : "=r" (result) ); + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Process Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \return PSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Process Stack Pointer Limit + \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Process Stack Pointer (non-secure) + \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. + \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) +{ + __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); +} +#endif + + +/** + \brief Get Main Stack Pointer Limit + \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim" : "=r" (result) ); + + return(result); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Get Main Stack Pointer Limit (non-secure) + \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. + \return MSPLIM Register value + */ +__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); + return(result); +} +#endif + + +/** + \brief Set Main Stack Pointer Limit + \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). + \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set + */ +__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); +} + + +#if ((defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) && \ + (defined (__ARM_ARCH_8M_MAIN__) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Set Main Stack Pointer Limit (non-secure) + \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. + \param [in] MainStackPtrLimit Main Stack Pointer value to set + */ +__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) +{ + __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); +} +#endif + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + +/** + \brief Get FPSCR + \details Returns the current value of the Floating Point Status/Control register. + \return Floating Point Status/Control register value + */ +__STATIC_FORCEINLINE uint32_t __get_FPSCR(void) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_get_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + return __builtin_arm_get_fpscr(); +#else + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#endif +#else + return(0U); +#endif +} + + +/** + \brief Set FPSCR + \details Assigns the given value to the Floating Point Status/Control register. + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_FORCEINLINE void __set_FPSCR(uint32_t fpscr) +{ +#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) +#if __has_builtin(__builtin_arm_set_fpscr) || (__GNUC__ > 7) || (__GNUC__ == 7 && __GNUC_MINOR__ >= 2) + /* see https://gcc.gnu.org/ml/gcc-patches/2017-04/msg00443.html */ + __builtin_arm_set_fpscr(fpscr); +#else + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc", "memory"); +#endif +#else + (void)fpscr; +#endif +} + +#endif /* ((defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +/* Define macros for porting to both thumb1 and thumb2. + * For thumb1, use low register (r0-r7), specified by constraint "l" + * Otherwise, use general registers, specified by constraint "r" */ +#if defined (__thumb__) && !defined (__thumb2__) +#define __CMSIS_GCC_OUT_REG(r) "=l" (r) +#define __CMSIS_GCC_RW_REG(r) "+l" (r) +#define __CMSIS_GCC_USE_REG(r) "l" (r) +#else +#define __CMSIS_GCC_OUT_REG(r) "=r" (r) +#define __CMSIS_GCC_RW_REG(r) "+r" (r) +#define __CMSIS_GCC_USE_REG(r) "r" (r) +#endif + +/** + \brief No Operation + \details No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP() __ASM volatile ("nop") + +/** + \brief Wait For Interrupt + \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. + */ +#define __WFI() __ASM volatile ("wfi") + + +/** + \brief Wait For Event + \details Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE() __ASM volatile ("wfe") + + +/** + \brief Send Event + \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV() __ASM volatile ("sev") + + +/** + \brief Instruction Synchronization Barrier + \details Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or memory, + after the instruction has been completed. + */ +__STATIC_FORCEINLINE void __ISB(void) +{ + __ASM volatile ("isb 0xF":::"memory"); +} + + +/** + \brief Data Synchronization Barrier + \details Acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__STATIC_FORCEINLINE void __DSB(void) +{ + __ASM volatile ("dsb 0xF":::"memory"); +} + + +/** + \brief Data Memory Barrier + \details Ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__STATIC_FORCEINLINE void __DMB(void) +{ + __ASM volatile ("dmb 0xF":::"memory"); +} + + +/** + \brief Reverse byte order (32 bit) + \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV(uint32_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) + return __builtin_bswap32(value); +#else + uint32_t result; + + __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +} + + +/** + \brief Reverse byte order (16 bit) + \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE int16_t __REVSH(int16_t value) +{ +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + return (int16_t)__builtin_bswap16(value); +#else + int16_t result; + + __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return result; +#endif +} + + +/** + \brief Rotate Right in unsigned value (32 bit) + \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + \param [in] op1 Value to rotate + \param [in] op2 Number of Bits to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + op2 %= 32U; + if (op2 == 0U) + { + return op1; + } + return (op1 >> op2) | (op1 << (32U - op2)); +} + + +/** + \brief Breakpoint + \details Causes the processor to enter Debug state. + Debug tools can use this to investigate system state when the instruction at a particular address is reached. + \param [in] value is ignored by the processor. + If required, a debugger can use it to store additional information about the breakpoint. + */ +#define __BKPT(value) __ASM volatile ("bkpt "#value) + + +/** + \brief Reverse bit order of value + \details Reverses the bit order of the given value. + \param [in] value Value to reverse + \return Reversed value + */ +__STATIC_FORCEINLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); +#else + uint32_t s = (4U /*sizeof(v)*/ * 8U) - 1U; /* extra shift needed at end */ + + result = value; /* r will be reversed bits of v; first get LSB of v */ + for (value >>= 1U; value != 0U; value >>= 1U) + { + result <<= 1U; + result |= value & 1U; + s--; + } + result <<= s; /* shift when v's highest bits are zero */ +#endif + return result; +} + + +/** + \brief Count leading zeros + \details Counts the number of leading zeros of a data value. + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __builtin_clz + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief LDR Exclusive (8 bit) + \details Executes a exclusive LDR instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (16 bit) + \details Executes a exclusive LDR instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDR Exclusive (32 bit) + \details Executes a exclusive LDR instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) ); + return(result); +} + + +/** + \brief STR Exclusive (8 bit) + \details Executes a exclusive STR instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (16 bit) + \details Executes a exclusive STR instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief STR Exclusive (32 bit) + \details Executes a exclusive STR instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) ); + return(result); +} + + +/** + \brief Remove the exclusive lock + \details Removes the exclusive lock which is created by LDREX. + */ +__STATIC_FORCEINLINE void __CLREX(void) +{ + __ASM volatile ("clrex" ::: "memory"); +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ +__extension__ \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] ARG1 Value to be saturated + \param [in] ARG2 Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + __extension__ \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** + \brief Rotate Right with Extend (32 bit) + \details Moves each bit of a bitstring right by one bit. + The carry input is shifted in at the left end of the bitstring. + \param [in] value Value to rotate + \return Rotated value + */ +__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); + return(result); +} + + +/** + \brief LDRT Unprivileged (8 bit) + \details Executes a Unprivileged LDRT instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrbt %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint8_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (16 bit) + \details Executes a Unprivileged LDRT instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) +{ + uint32_t result; + +#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8) + __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); +#else + /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not + accepted by assembler. So has to use following less efficient pattern. + */ + __ASM volatile ("ldrht %0, [%1]" : "=r" (result) : "r" (ptr) : "memory" ); +#endif + return ((uint16_t) result); /* Add explicit type cast here */ +} + + +/** + \brief LDRT Unprivileged (32 bit) + \details Executes a Unprivileged LDRT instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief STRT Unprivileged (8 bit) + \details Executes a Unprivileged STRT instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (16 bit) + \details Executes a Unprivileged STRT instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief STRT Unprivileged (32 bit) + \details Executes a Unprivileged STRT instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); +} + +#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + +/** + \brief Signed Saturate + \details Saturates a signed value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) +{ + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; +} + +/** + \brief Unsigned Saturate + \details Saturates an unsigned value. + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) +{ + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; +} + +#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ + (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ + (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) ) */ + + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) +/** + \brief Load-Acquire (8 bit) + \details Executes a LDAB instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire (16 bit) + \details Executes a LDAH instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire (32 bit) + \details Executes a LDA instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release (8 bit) + \details Executes a STLB instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) +{ + __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (16 bit) + \details Executes a STLH instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) +{ + __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Store-Release (32 bit) + \details Executes a STL instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + */ +__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) +{ + __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); +} + + +/** + \brief Load-Acquire Exclusive (8 bit) + \details Executes a LDAB exclusive instruction for 8 bit value. + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__STATIC_FORCEINLINE uint8_t __LDAEXB(volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexb %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint8_t) result); +} + + +/** + \brief Load-Acquire Exclusive (16 bit) + \details Executes a LDAH exclusive instruction for 16 bit values. + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__STATIC_FORCEINLINE uint16_t __LDAEXH(volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaexh %0, %1" : "=r" (result) : "Q" (*ptr) ); + return ((uint16_t) result); +} + + +/** + \brief Load-Acquire Exclusive (32 bit) + \details Executes a LDA exclusive instruction for 32 bit values. + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__STATIC_FORCEINLINE uint32_t __LDAEX(volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("ldaex %0, %1" : "=r" (result) : "Q" (*ptr) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (8 bit) + \details Executes a STLB exclusive instruction for 8 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexb %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (16 bit) + \details Executes a STLH exclusive instruction for 16 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlexh %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + + +/** + \brief Store-Release Exclusive (32 bit) + \details Executes a STL exclusive instruction for 32 bit values. + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__STATIC_FORCEINLINE uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) +{ + uint32_t result; + + __ASM volatile ("stlex %0, %2, %1" : "=&r" (result), "=Q" (*ptr) : "r" ((uint32_t)value) ); + return(result); +} + +#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) */ + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if (__ARM_FEATURE_DSP == 1) /* ToDo ARMCLANG: This should be ARCH >= ARMv7-M + SIMD */ + +__STATIC_FORCEINLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__STATIC_FORCEINLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ +({ \ + int32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +#define __USAT16(ARG1,ARG2) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + +__STATIC_FORCEINLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLALD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLALDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLD (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint64_t __SMLSLDX (uint32_t op1, uint32_t op2, uint64_t acc) +{ + union llreg_u{ + uint32_t w32[2]; + uint64_t w64; + } llr; + llr.w64 = acc; + +#ifndef __ARMEB__ /* Little endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[0]), "=r" (llr.w32[1]): "r" (op1), "r" (op2) , "0" (llr.w32[0]), "1" (llr.w32[1]) ); +#else /* Big endian */ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (llr.w32[1]), "=r" (llr.w32[0]): "r" (op1), "r" (op2) , "0" (llr.w32[1]), "1" (llr.w32[0]) ); +#endif + + return(llr.w64); +} + +__STATIC_FORCEINLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QADD( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__STATIC_FORCEINLINE int32_t __QSUB( int32_t op1, int32_t op2) +{ + int32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#if 0 +#define __PKHBT(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) + +#define __PKHTB(ARG1,ARG2,ARG3) \ +({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ + }) +#endif + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + +__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) +{ + int32_t result; + + __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#endif /* (__ARM_FEATURE_DSP == 1) */ +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#pragma GCC diagnostic pop + +#endif /* __CMSIS_GCC_H */ diff --git a/include/cmsis_iccarm.h b/include/cmsis_iccarm.h new file mode 100644 index 0000000..b45b89b --- /dev/null +++ b/include/cmsis_iccarm.h @@ -0,0 +1,906 @@ +/**************************************************************************//** + * @file cmsis_iccarm.h + * @brief CMSIS compiler ICCARM (IAR compiler) header file + * @version V5.0.3 + * @date 29. August 2017 + ******************************************************************************/ + +//------------------------------------------------------------------------------ +// +// Copyright (c) 2017 IAR Systems +// +// Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 +// +// 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. +// +//------------------------------------------------------------------------------ + + +#ifndef __CMSIS_ICCARM_H__ +#define __CMSIS_ICCARM_H__ + +#ifndef __ICCARM__ + #error This file should only be compiled by ICCARM +#endif + +#pragma system_include + +#define __IAR_FT _Pragma("inline=forced") __intrinsic + +#if (__VER__ >= 8000000) + #define __ICCARM_V8 1 +#else + #define __ICCARM_V8 0 +#endif + +#ifndef __ALIGNED + #if __ICCARM_V8 + #define __ALIGNED(x) __attribute__((aligned(x))) + #elif (__VER__ >= 7080000) + /* Needs IAR language extensions */ + #define __ALIGNED(x) __attribute__((aligned(x))) + #else + #warning No compiler specific solution for __ALIGNED.__ALIGNED is ignored. + #define __ALIGNED(x) + #endif +#endif + + +/* Define compiler macros for CPU architecture, used in CMSIS 5. + */ +#if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ || __ARM_ARCH_8M_BASE__ || __ARM_ARCH_8M_MAIN__ +/* Macros already defined */ +#else + #if defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM_ARCH_PROFILE) && __ARM_ARCH_PROFILE == 'M' + #if __ARM_ARCH == 6 + #define __ARM_ARCH_6M__ 1 + #elif __ARM_ARCH == 7 + #if __ARM_FEATURE_DSP + #define __ARM_ARCH_7EM__ 1 + #else + #define __ARM_ARCH_7M__ 1 + #endif + #endif /* __ARM_ARCH */ + #endif /* __ARM_ARCH_PROFILE == 'M' */ +#endif + +/* Alternativ core deduction for older ICCARM's */ +#if !defined(__ARM_ARCH_6M__) && !defined(__ARM_ARCH_7M__) && !defined(__ARM_ARCH_7EM__) && \ + !defined(__ARM_ARCH_8M_BASE__) && !defined(__ARM_ARCH_8M_MAIN__) + #if defined(__ARM6M__) && (__CORE__ == __ARM6M__) + #define __ARM_ARCH_6M__ 1 + #elif defined(__ARM7M__) && (__CORE__ == __ARM7M__) + #define __ARM_ARCH_7M__ 1 + #elif defined(__ARM7EM__) && (__CORE__ == __ARM7EM__) + #define __ARM_ARCH_7EM__ 1 + #elif defined(__ARM8M_BASELINE__) && (__CORE == __ARM8M_BASELINE__) + #define __ARM_ARCH_8M_BASE__ 1 + #elif defined(__ARM8M_MAINLINE__) && (__CORE == __ARM8M_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #elif defined(__ARM8EM_MAINLINE__) && (__CORE == __ARM8EM_MAINLINE__) + #define __ARM_ARCH_8M_MAIN__ 1 + #else + #error "Unknown target." + #endif +#endif + + + +#if defined(__ARM_ARCH_6M__) && __ARM_ARCH_6M__==1 + #define __IAR_M0_FAMILY 1 +#elif defined(__ARM_ARCH_8M_BASE__) && __ARM_ARCH_8M_BASE__==1 + #define __IAR_M0_FAMILY 1 +#else + #define __IAR_M0_FAMILY 0 +#endif + + +#ifndef __ASM + #define __ASM __asm +#endif + +#ifndef __INLINE + #define __INLINE inline +#endif + +#ifndef __NO_RETURN + #if __ICCARM_V8 + #define __NO_RETURN __attribute__((__noreturn__)) + #else + #define __NO_RETURN _Pragma("object_attribute=__noreturn") + #endif +#endif + +#ifndef __PACKED + #if __ICCARM_V8 + #define __PACKED __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED __packed + #endif +#endif + +#ifndef __PACKED_STRUCT + #if __ICCARM_V8 + #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_STRUCT __packed struct + #endif +#endif + +#ifndef __PACKED_UNION + #if __ICCARM_V8 + #define __PACKED_UNION union __attribute__((packed, aligned(1))) + #else + /* Needs IAR language extensions */ + #define __PACKED_UNION __packed union + #endif +#endif + +#ifndef __RESTRICT + #define __RESTRICT restrict +#endif + + +#ifndef __STATIC_INLINE + #define __STATIC_INLINE static inline +#endif + +#ifndef __UNALIGNED_UINT16_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint16_t __iar_uint16_read(void const *ptr) +{ + return *(__packed uint16_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT16_READ(PTR) __iar_uint16_read(PTR) +#endif + + +#ifndef __UNALIGNED_UINT16_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint16_write(void const *ptr, uint16_t val) +{ + *(__packed uint16_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT16_WRITE(PTR,VAL) __iar_uint16_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32_READ +#pragma language=save +#pragma language=extended +__IAR_FT uint32_t __iar_uint32_read(void const *ptr) +{ + return *(__packed uint32_t*)(ptr); +} +#pragma language=restore +#define __UNALIGNED_UINT32_READ(PTR) __iar_uint32_read(PTR) +#endif + +#ifndef __UNALIGNED_UINT32_WRITE +#pragma language=save +#pragma language=extended +__IAR_FT void __iar_uint32_write(void const *ptr, uint32_t val) +{ + *(__packed uint32_t*)(ptr) = val;; +} +#pragma language=restore +#define __UNALIGNED_UINT32_WRITE(PTR,VAL) __iar_uint32_write(PTR,VAL) +#endif + +#ifndef __UNALIGNED_UINT32 /* deprecated */ +#pragma language=save +#pragma language=extended +__packed struct __iar_u32 { uint32_t v; }; +#pragma language=restore +#define __UNALIGNED_UINT32(PTR) (((struct __iar_u32 *)(PTR))->v) +#endif + +#ifndef __USED + #if __ICCARM_V8 + #define __USED __attribute__((used)) + #else + #define __USED _Pragma("__root") + #endif +#endif + +#ifndef __WEAK + #if __ICCARM_V8 + #define __WEAK __attribute__((weak)) + #else + #define __WEAK _Pragma("__weak") + #endif +#endif + + +#ifndef __ICCARM_INTRINSICS_VERSION__ + #define __ICCARM_INTRINSICS_VERSION__ 0 +#endif + +#if __ICCARM_INTRINSICS_VERSION__ == 2 + + #if defined(__CLZ) + #undef __CLZ + #endif + #if defined(__REVSH) + #undef __REVSH + #endif + #if defined(__RBIT) + #undef __RBIT + #endif + #if defined(__SSAT) + #undef __SSAT + #endif + #if defined(__USAT) + #undef __USAT + #endif + + #include "iccarm_builtin.h" + + #define __disable_fault_irq __iar_builtin_disable_fiq + #define __disable_irq __iar_builtin_disable_interrupt + #define __enable_fault_irq __iar_builtin_enable_fiq + #define __enable_irq __iar_builtin_enable_interrupt + #define __arm_rsr __iar_builtin_rsr + #define __arm_wsr __iar_builtin_wsr + + + #define __get_APSR() (__arm_rsr("APSR")) + #define __get_BASEPRI() (__arm_rsr("BASEPRI")) + #define __get_CONTROL() (__arm_rsr("CONTROL")) + #define __get_FAULTMASK() (__arm_rsr("FAULTMASK")) + + #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) + #define __get_FPSCR() (__arm_rsr("FPSCR")) + #define __set_FPSCR(VALUE) (__arm_wsr("FPSCR", (VALUE))) + #else + #define __get_FPSCR() ( 0 ) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #define __get_IPSR() (__arm_rsr("IPSR")) + #define __get_MSP() (__arm_rsr("MSP")) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __get_MSPLIM() (0U) + #else + #define __get_MSPLIM() (__arm_rsr("MSPLIM")) + #endif + #define __get_PRIMASK() (__arm_rsr("PRIMASK")) + #define __get_PSP() (__arm_rsr("PSP")) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __get_PSPLIM() (0U) + #else + #define __get_PSPLIM() (__arm_rsr("PSPLIM")) + #endif + + #define __get_xPSR() (__arm_rsr("xPSR")) + + #define __set_BASEPRI(VALUE) (__arm_wsr("BASEPRI", (VALUE))) + #define __set_BASEPRI_MAX(VALUE) (__arm_wsr("BASEPRI_MAX", (VALUE))) + #define __set_CONTROL(VALUE) (__arm_wsr("CONTROL", (VALUE))) + #define __set_FAULTMASK(VALUE) (__arm_wsr("FAULTMASK", (VALUE))) + #define __set_MSP(VALUE) (__arm_wsr("MSP", (VALUE))) + + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + #define __set_MSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_MSPLIM(VALUE) (__arm_wsr("MSPLIM", (VALUE))) + #endif + #define __set_PRIMASK(VALUE) (__arm_wsr("PRIMASK", (VALUE))) + #define __set_PSP(VALUE) (__arm_wsr("PSP", (VALUE))) + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + #define __set_PSPLIM(VALUE) ((void)(VALUE)) + #else + #define __set_PSPLIM(VALUE) (__arm_wsr("PSPLIM", (VALUE))) + #endif + + #define __TZ_get_CONTROL_NS() (__arm_rsr("CONTROL_NS")) + #define __TZ_set_CONTROL_NS(VALUE) (__arm_wsr("CONTROL_NS", (VALUE))) + #define __TZ_get_PSP_NS() (__arm_rsr("PSP_NS")) + #define __TZ_set_PSP_NS(VALUE) (__arm_wsr("PSP_NS", (VALUE))) + #define __TZ_get_MSP_NS() (__arm_rsr("MSP_NS")) + #define __TZ_set_MSP_NS(VALUE) (__arm_wsr("MSP_NS", (VALUE))) + #define __TZ_get_SP_NS() (__arm_rsr("SP_NS")) + #define __TZ_set_SP_NS(VALUE) (__arm_wsr("SP_NS", (VALUE))) + #define __TZ_get_PRIMASK_NS() (__arm_rsr("PRIMASK_NS")) + #define __TZ_set_PRIMASK_NS(VALUE) (__arm_wsr("PRIMASK_NS", (VALUE))) + #define __TZ_get_BASEPRI_NS() (__arm_rsr("BASEPRI_NS")) + #define __TZ_set_BASEPRI_NS(VALUE) (__arm_wsr("BASEPRI_NS", (VALUE))) + #define __TZ_get_FAULTMASK_NS() (__arm_rsr("FAULTMASK_NS")) + #define __TZ_set_FAULTMASK_NS(VALUE)(__arm_wsr("FAULTMASK_NS", (VALUE))) + #define __TZ_get_PSPLIM_NS() (__arm_rsr("PSPLIM_NS")) + #define __TZ_set_PSPLIM_NS(VALUE) (__arm_wsr("PSPLIM_NS", (VALUE))) + #define __TZ_get_MSPLIM_NS() (__arm_rsr("MSPLIM_NS")) + #define __TZ_set_MSPLIM_NS(VALUE) (__arm_wsr("MSPLIM_NS", (VALUE))) + + #define __NOP __iar_builtin_no_operation + + #define __CLZ __iar_builtin_CLZ + #define __CLREX __iar_builtin_CLREX + + #define __DMB __iar_builtin_DMB + #define __DSB __iar_builtin_DSB + #define __ISB __iar_builtin_ISB + + #define __LDREXB __iar_builtin_LDREXB + #define __LDREXH __iar_builtin_LDREXH + #define __LDREXW __iar_builtin_LDREX + + #define __RBIT __iar_builtin_RBIT + #define __REV __iar_builtin_REV + #define __REV16 __iar_builtin_REV16 + + __IAR_FT int16_t __REVSH(int16_t val) + { + return (int16_t) __iar_builtin_REVSH(val); + } + + #define __ROR __iar_builtin_ROR + #define __RRX __iar_builtin_RRX + + #define __SEV __iar_builtin_SEV + + #if !__IAR_M0_FAMILY + #define __SSAT __iar_builtin_SSAT + #endif + + #define __STREXB __iar_builtin_STREXB + #define __STREXH __iar_builtin_STREXH + #define __STREXW __iar_builtin_STREX + + #if !__IAR_M0_FAMILY + #define __USAT __iar_builtin_USAT + #endif + + #define __WFE __iar_builtin_WFE + #define __WFI __iar_builtin_WFI + + #if __ARM_MEDIA__ + #define __SADD8 __iar_builtin_SADD8 + #define __QADD8 __iar_builtin_QADD8 + #define __SHADD8 __iar_builtin_SHADD8 + #define __UADD8 __iar_builtin_UADD8 + #define __UQADD8 __iar_builtin_UQADD8 + #define __UHADD8 __iar_builtin_UHADD8 + #define __SSUB8 __iar_builtin_SSUB8 + #define __QSUB8 __iar_builtin_QSUB8 + #define __SHSUB8 __iar_builtin_SHSUB8 + #define __USUB8 __iar_builtin_USUB8 + #define __UQSUB8 __iar_builtin_UQSUB8 + #define __UHSUB8 __iar_builtin_UHSUB8 + #define __SADD16 __iar_builtin_SADD16 + #define __QADD16 __iar_builtin_QADD16 + #define __SHADD16 __iar_builtin_SHADD16 + #define __UADD16 __iar_builtin_UADD16 + #define __UQADD16 __iar_builtin_UQADD16 + #define __UHADD16 __iar_builtin_UHADD16 + #define __SSUB16 __iar_builtin_SSUB16 + #define __QSUB16 __iar_builtin_QSUB16 + #define __SHSUB16 __iar_builtin_SHSUB16 + #define __USUB16 __iar_builtin_USUB16 + #define __UQSUB16 __iar_builtin_UQSUB16 + #define __UHSUB16 __iar_builtin_UHSUB16 + #define __SASX __iar_builtin_SASX + #define __QASX __iar_builtin_QASX + #define __SHASX __iar_builtin_SHASX + #define __UASX __iar_builtin_UASX + #define __UQASX __iar_builtin_UQASX + #define __UHASX __iar_builtin_UHASX + #define __SSAX __iar_builtin_SSAX + #define __QSAX __iar_builtin_QSAX + #define __SHSAX __iar_builtin_SHSAX + #define __USAX __iar_builtin_USAX + #define __UQSAX __iar_builtin_UQSAX + #define __UHSAX __iar_builtin_UHSAX + #define __USAD8 __iar_builtin_USAD8 + #define __USADA8 __iar_builtin_USADA8 + #define __SSAT16 __iar_builtin_SSAT16 + #define __USAT16 __iar_builtin_USAT16 + #define __UXTB16 __iar_builtin_UXTB16 + #define __UXTAB16 __iar_builtin_UXTAB16 + #define __SXTB16 __iar_builtin_SXTB16 + #define __SXTAB16 __iar_builtin_SXTAB16 + #define __SMUAD __iar_builtin_SMUAD + #define __SMUADX __iar_builtin_SMUADX + #define __SMMLA __iar_builtin_SMMLA + #define __SMLAD __iar_builtin_SMLAD + #define __SMLADX __iar_builtin_SMLADX + #define __SMLALD __iar_builtin_SMLALD + #define __SMLALDX __iar_builtin_SMLALDX + #define __SMUSD __iar_builtin_SMUSD + #define __SMUSDX __iar_builtin_SMUSDX + #define __SMLSD __iar_builtin_SMLSD + #define __SMLSDX __iar_builtin_SMLSDX + #define __SMLSLD __iar_builtin_SMLSLD + #define __SMLSLDX __iar_builtin_SMLSLDX + #define __SEL __iar_builtin_SEL + #define __QADD __iar_builtin_QADD + #define __QSUB __iar_builtin_QSUB + #define __PKHBT __iar_builtin_PKHBT + #define __PKHTB __iar_builtin_PKHTB + #endif + +#else /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #define __CLZ __cmsis_iar_clz_not_active + #define __SSAT __cmsis_iar_ssat_not_active + #define __USAT __cmsis_iar_usat_not_active + #define __RBIT __cmsis_iar_rbit_not_active + #define __get_APSR __cmsis_iar_get_APSR_not_active + #endif + + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #define __get_FPSCR __cmsis_iar_get_FPSR_not_active + #define __set_FPSCR __cmsis_iar_set_FPSR_not_active + #endif + + #ifdef __INTRINSICS_INCLUDED + #error intrinsics.h is already included previously! + #endif + + #include + + #if __IAR_M0_FAMILY + /* Avoid clash between intrinsics.h and arm_math.h when compiling for Cortex-M0. */ + #undef __CLZ + #undef __SSAT + #undef __USAT + #undef __RBIT + #undef __get_APSR + + __STATIC_INLINE uint8_t __CLZ(uint32_t data) + { + if (data == 0U) { return 32U; } + + uint32_t count = 0U; + uint32_t mask = 0x80000000U; + + while ((data & mask) == 0U) + { + count += 1U; + mask = mask >> 1U; + } + return count; + } + + __STATIC_INLINE uint32_t __RBIT(uint32_t v) + { + uint8_t sc = 31U; + uint32_t r = v; + for (v >>= 1U; v; v >>= 1U) + { + r <<= 1U; + r |= v & 1U; + sc--; + } + return (r << sc); + } + + __STATIC_INLINE uint32_t __get_APSR(void) + { + uint32_t res; + __asm("MRS %0,APSR" : "=r" (res)); + return res; + } + + #endif + + #if (!((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ + (defined (__FPU_USED ) && (__FPU_USED == 1U)) )) + #undef __get_FPSCR + #undef __set_FPSCR + #define __get_FPSCR() (0) + #define __set_FPSCR(VALUE) ((void)VALUE) + #endif + + #pragma diag_suppress=Pe940 + #pragma diag_suppress=Pe177 + + #define __enable_irq __enable_interrupt + #define __disable_irq __disable_interrupt + #define __NOP __no_operation + + #define __get_xPSR __get_PSR + + #if (!defined(__ARM_ARCH_6M__) || __ARM_ARCH_6M__==0) + + __IAR_FT uint32_t __LDREXW(uint32_t volatile *ptr) + { + return __LDREX((unsigned long *)ptr); + } + + __IAR_FT uint32_t __STREXW(uint32_t value, uint32_t volatile *ptr) + { + return __STREX(value, (unsigned long *)ptr); + } + #endif + + + /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + #if (__CORTEX_M >= 0x03) + + __IAR_FT uint32_t __RRX(uint32_t value) + { + uint32_t result; + __ASM("RRX %0, %1" : "=r"(result) : "r" (value) : "cc"); + return(result); + } + + __IAR_FT void __set_BASEPRI_MAX(uint32_t value) + { + __asm volatile("MSR BASEPRI_MAX,%0"::"r" (value)); + } + + + #define __enable_fault_irq __enable_fiq + #define __disable_fault_irq __disable_fiq + + + #endif /* (__CORTEX_M >= 0x03) */ + + __IAR_FT uint32_t __ROR(uint32_t op1, uint32_t op2) + { + return (op1 >> op2) | (op1 << ((sizeof(op1)*8)-op2)); + } + + #if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + __IAR_FT uint32_t __get_MSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,MSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_MSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure MSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR MSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __get_PSPLIM(void) + { + uint32_t res; + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + res = 0U; + #else + __asm volatile("MRS %0,PSPLIM" : "=r" (res)); + #endif + return res; + } + + __IAR_FT void __set_PSPLIM(uint32_t value) + { + #if (!(defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) && \ + (!defined (__ARM_FEATURE_CMSE ) || (__ARM_FEATURE_CMSE < 3))) + // without main extensions, the non-secure PSPLIM is RAZ/WI + (void)value; + #else + __asm volatile("MSR PSPLIM,%0" :: "r" (value)); + #endif + } + + __IAR_FT uint32_t __TZ_get_CONTROL_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,CONTROL_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_CONTROL_NS(uint32_t value) + { + __asm volatile("MSR CONTROL_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PSP_NS(uint32_t value) + { + __asm volatile("MSR PSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSP_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSP_NS(uint32_t value) + { + __asm volatile("MSR MSP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_SP_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,SP_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_SP_NS(uint32_t value) + { + __asm volatile("MSR SP_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PRIMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PRIMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_PRIMASK_NS(uint32_t value) + { + __asm volatile("MSR PRIMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_BASEPRI_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,BASEPRI_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_BASEPRI_NS(uint32_t value) + { + __asm volatile("MSR BASEPRI_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_FAULTMASK_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,FAULTMASK_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_FAULTMASK_NS(uint32_t value) + { + __asm volatile("MSR FAULTMASK_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_PSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,PSPLIM_NS" : "=r" (res)); + return res; + } + __IAR_FT void __TZ_set_PSPLIM_NS(uint32_t value) + { + __asm volatile("MSR PSPLIM_NS,%0" :: "r" (value)); + } + + __IAR_FT uint32_t __TZ_get_MSPLIM_NS(void) + { + uint32_t res; + __asm volatile("MRS %0,MSPLIM_NS" : "=r" (res)); + return res; + } + + __IAR_FT void __TZ_set_MSPLIM_NS(uint32_t value) + { + __asm volatile("MSR MSPLIM_NS,%0" :: "r" (value)); + } + + #endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#endif /* __ICCARM_INTRINSICS_VERSION__ == 2 */ + +#define __BKPT(value) __asm volatile ("BKPT %0" : : "i"(value)) + +#if __IAR_M0_FAMILY + __STATIC_INLINE int32_t __SSAT(int32_t val, uint32_t sat) + { + if ((sat >= 1U) && (sat <= 32U)) + { + const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); + const int32_t min = -1 - max ; + if (val > max) + { + return max; + } + else if (val < min) + { + return min; + } + } + return val; + } + + __STATIC_INLINE uint32_t __USAT(int32_t val, uint32_t sat) + { + if (sat <= 31U) + { + const uint32_t max = ((1U << sat) - 1U); + if (val > (int32_t)max) + { + return max; + } + else if (val < 0) + { + return 0U; + } + } + return (uint32_t)val; + } +#endif + +#if (__CORTEX_M >= 0x03) /* __CORTEX_M is defined in core_cm0.h, core_cm3.h and core_cm4.h. */ + + __IAR_FT uint8_t __LDRBT(volatile uint8_t *addr) + { + uint32_t res; + __ASM("LDRBT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDRHT(volatile uint16_t *addr) + { + uint32_t res; + __ASM("LDRHT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDRT(volatile uint32_t *addr) + { + uint32_t res; + __ASM("LDRT %0, [%1]" : "=r" (res) : "r" (addr) : "memory"); + return res; + } + + __IAR_FT void __STRBT(uint8_t value, volatile uint8_t *addr) + { + __ASM("STRBT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRHT(uint16_t value, volatile uint16_t *addr) + { + __ASM("STRHT %1, [%0]" : : "r" (addr), "r" ((uint32_t)value) : "memory"); + } + + __IAR_FT void __STRT(uint32_t value, volatile uint32_t *addr) + { + __ASM("STRT %1, [%0]" : : "r" (addr), "r" (value) : "memory"); + } + +#endif /* (__CORTEX_M >= 0x03) */ + +#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ + (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) ) + + + __IAR_FT uint8_t __LDAB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAB %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAH %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDA(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDA %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return res; + } + + __IAR_FT void __STLB(uint8_t value, volatile uint8_t *ptr) + { + __ASM volatile ("STLB %1, [%0]" :: "r" (*ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STLH(uint16_t value, volatile uint16_t *ptr) + { + __ASM volatile ("STLH %1, [%0]" :: "r" (*ptr), "r" (value) : "memory"); + } + + __IAR_FT void __STL(uint32_t value, volatile uint32_t *ptr) + { + __ASM volatile ("STL %1, [%0]" :: "r" (*ptr), "r" (value) : "memory"); + } + + __IAR_FT uint8_t __LDAEXB(volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXB %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint8_t)res); + } + + __IAR_FT uint16_t __LDAEXH(volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEXH %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return ((uint16_t)res); + } + + __IAR_FT uint32_t __LDAEX(volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("LDAEX %0, [%1]" : "=r" (res) : "r" (*ptr) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXB(uint8_t value, volatile uint8_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXB %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEXH(uint16_t value, volatile uint16_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEXH %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory"); + return res; + } + + __IAR_FT uint32_t __STLEX(uint32_t value, volatile uint32_t *ptr) + { + uint32_t res; + __ASM volatile ("STLEX %0, %2, [%1]" : "=r" (res) : "r" (*ptr), "r" (value) : "memory"); + return res; + } + +#endif /* __ARM_ARCH_8M_MAIN__ or __ARM_ARCH_8M_BASE__ */ + +#undef __IAR_FT +#undef __IAR_M0_FAMILY +#undef __ICCARM_V8 + +#pragma diag_default=Pe940 +#pragma diag_default=Pe177 + +#endif /* __CMSIS_ICCARM_H__ */ diff --git a/include/cmsis_version.h b/include/cmsis_version.h new file mode 100644 index 0000000..660f612 --- /dev/null +++ b/include/cmsis_version.h @@ -0,0 +1,39 @@ +/**************************************************************************//** + * @file cmsis_version.h + * @brief CMSIS Core(M) Version definitions + * @version V5.0.2 + * @date 19. April 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CMSIS_VERSION_H +#define __CMSIS_VERSION_H + +/* CMSIS Version definitions */ +#define __CM_CMSIS_VERSION_MAIN ( 5U) /*!< [31:16] CMSIS Core(M) main version */ +#define __CM_CMSIS_VERSION_SUB ( 1U) /*!< [15:0] CMSIS Core(M) sub version */ +#define __CM_CMSIS_VERSION ((__CM_CMSIS_VERSION_MAIN << 16U) | \ + __CM_CMSIS_VERSION_SUB ) /*!< CMSIS Core(M) version number */ +#endif diff --git a/include/core_cm4.h b/include/core_cm4.h new file mode 100644 index 0000000..dc71a8f --- /dev/null +++ b/include/core_cm4.h @@ -0,0 +1,2115 @@ +/**************************************************************************//** + * @file core_cm4.h + * @brief CMSIS Cortex-M4 Core Peripheral Access Layer Header File + * @version V5.0.3 + * @date 09. August 2017 + ******************************************************************************/ +/* + * Copyright (c) 2009-2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef __CORE_CM4_H_GENERIC +#define __CORE_CM4_H_GENERIC + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/** + \page CMSIS_MISRA_Exceptions MISRA-C:2004 Compliance Exceptions + CMSIS violates the following MISRA-C:2004 rules: + + \li Required Rule 8.5, object/function definition in header file.
+ Function definitions in header files are used to allow 'inlining'. + + \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.
+ Unions are used for effective representation of core registers. + + \li Advisory Rule 19.7, Function-like macro defined.
+ Function-like macros are used to allow more efficient code. + */ + + +/******************************************************************************* + * CMSIS definitions + ******************************************************************************/ +/** + \ingroup Cortex_M4 + @{ + */ + +#include "cmsis_version.h" + +/* CMSIS CM4 definitions */ +#define __CM4_CMSIS_VERSION_MAIN (__CM_CMSIS_VERSION_MAIN) /*!< \deprecated [31:16] CMSIS HAL main version */ +#define __CM4_CMSIS_VERSION_SUB (__CM_CMSIS_VERSION_SUB) /*!< \deprecated [15:0] CMSIS HAL sub version */ +#define __CM4_CMSIS_VERSION ((__CM4_CMSIS_VERSION_MAIN << 16U) | \ + __CM4_CMSIS_VERSION_SUB ) /*!< \deprecated CMSIS HAL version number */ + +#define __CORTEX_M (4U) /*!< Cortex-M Core */ + +/** __FPU_USED indicates whether an FPU is used or not. + For this, __FPU_PRESENT has to be checked prior to making use of FPU specific registers and functions. +*/ +#if defined ( __CC_ARM ) + #if defined __TARGET_FPU_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) + #if defined __ARM_PCS_VFP + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __GNUC__ ) + #if defined (__VFP_FP__) && !defined(__SOFTFP__) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __ICCARM__ ) + #if defined __ARMVFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TI_ARM__ ) + #if defined __TI_VFP_SUPPORT__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __TASKING__ ) + #if defined __FPU_VFP__ + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#elif defined ( __CSMC__ ) + #if ( __CSMC__ & 0x400U) + #if defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U) + #define __FPU_USED 1U + #else + #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)" + #define __FPU_USED 0U + #endif + #else + #define __FPU_USED 0U + #endif + +#endif + +#include "cmsis_compiler.h" /* CMSIS compiler specific defines */ + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_GENERIC */ + +#ifndef __CMSIS_GENERIC + +#ifndef __CORE_CM4_H_DEPENDANT +#define __CORE_CM4_H_DEPENDANT + +#ifdef __cplusplus + extern "C" { +#endif + +/* check device defines and use defaults */ +#if defined __CHECK_DEVICE_DEFINES + #ifndef __CM4_REV + #define __CM4_REV 0x0000U + #warning "__CM4_REV not defined in device header file; using default!" + #endif + + #ifndef __FPU_PRESENT + #define __FPU_PRESENT 0U + #warning "__FPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __MPU_PRESENT + #define __MPU_PRESENT 0U + #warning "__MPU_PRESENT not defined in device header file; using default!" + #endif + + #ifndef __NVIC_PRIO_BITS + #define __NVIC_PRIO_BITS 3U + #warning "__NVIC_PRIO_BITS not defined in device header file; using default!" + #endif + + #ifndef __Vendor_SysTickConfig + #define __Vendor_SysTickConfig 0U + #warning "__Vendor_SysTickConfig not defined in device header file; using default!" + #endif +#endif + +/* IO definitions (access restrictions to peripheral registers) */ +/** + \defgroup CMSIS_glob_defs CMSIS Global Defines + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. +*/ +#ifdef __cplusplus + #define __I volatile /*!< Defines 'read only' permissions */ +#else + #define __I volatile const /*!< Defines 'read only' permissions */ +#endif +#define __O volatile /*!< Defines 'write only' permissions */ +#define __IO volatile /*!< Defines 'read / write' permissions */ + +/* following defines should be used for structure members */ +#define __IM volatile const /*! Defines 'read only' structure member permissions */ +#define __OM volatile /*! Defines 'write only' structure member permissions */ +#define __IOM volatile /*! Defines 'read / write' structure member permissions */ + +/*@} end of group Cortex_M4 */ + + + +/******************************************************************************* + * Register Abstraction + Core Register contain: + - Core Register + - Core NVIC Register + - Core SCB Register + - Core SysTick Register + - Core Debug Register + - Core MPU Register + - Core FPU Register + ******************************************************************************/ +/** + \defgroup CMSIS_core_register Defines and Type Definitions + \brief Type definitions and defines for Cortex-M processor based devices. +*/ + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CORE Status and Control Registers + \brief Core Register type definitions. + @{ + */ + +/** + \brief Union type to access the Application Program Status Register (APSR). + */ +typedef union +{ + struct + { + uint32_t _reserved0:16; /*!< bit: 0..15 Reserved */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:7; /*!< bit: 20..26 Reserved */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} APSR_Type; + +/* APSR Register Definitions */ +#define APSR_N_Pos 31U /*!< APSR: N Position */ +#define APSR_N_Msk (1UL << APSR_N_Pos) /*!< APSR: N Mask */ + +#define APSR_Z_Pos 30U /*!< APSR: Z Position */ +#define APSR_Z_Msk (1UL << APSR_Z_Pos) /*!< APSR: Z Mask */ + +#define APSR_C_Pos 29U /*!< APSR: C Position */ +#define APSR_C_Msk (1UL << APSR_C_Pos) /*!< APSR: C Mask */ + +#define APSR_V_Pos 28U /*!< APSR: V Position */ +#define APSR_V_Msk (1UL << APSR_V_Pos) /*!< APSR: V Mask */ + +#define APSR_Q_Pos 27U /*!< APSR: Q Position */ +#define APSR_Q_Msk (1UL << APSR_Q_Pos) /*!< APSR: Q Mask */ + +#define APSR_GE_Pos 16U /*!< APSR: GE Position */ +#define APSR_GE_Msk (0xFUL << APSR_GE_Pos) /*!< APSR: GE Mask */ + + +/** + \brief Union type to access the Interrupt Program Status Register (IPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:23; /*!< bit: 9..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} IPSR_Type; + +/* IPSR Register Definitions */ +#define IPSR_ISR_Pos 0U /*!< IPSR: ISR Position */ +#define IPSR_ISR_Msk (0x1FFUL /*<< IPSR_ISR_Pos*/) /*!< IPSR: ISR Mask */ + + +/** + \brief Union type to access the Special-Purpose Program Status Registers (xPSR). + */ +typedef union +{ + struct + { + uint32_t ISR:9; /*!< bit: 0.. 8 Exception number */ + uint32_t _reserved0:1; /*!< bit: 9 Reserved */ + uint32_t ICI_IT_1:6; /*!< bit: 10..15 ICI/IT part 1 */ + uint32_t GE:4; /*!< bit: 16..19 Greater than or Equal flags */ + uint32_t _reserved1:4; /*!< bit: 20..23 Reserved */ + uint32_t T:1; /*!< bit: 24 Thumb bit */ + uint32_t ICI_IT_2:2; /*!< bit: 25..26 ICI/IT part 2 */ + uint32_t Q:1; /*!< bit: 27 Saturation condition flag */ + uint32_t V:1; /*!< bit: 28 Overflow condition code flag */ + uint32_t C:1; /*!< bit: 29 Carry condition code flag */ + uint32_t Z:1; /*!< bit: 30 Zero condition code flag */ + uint32_t N:1; /*!< bit: 31 Negative condition code flag */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} xPSR_Type; + +/* xPSR Register Definitions */ +#define xPSR_N_Pos 31U /*!< xPSR: N Position */ +#define xPSR_N_Msk (1UL << xPSR_N_Pos) /*!< xPSR: N Mask */ + +#define xPSR_Z_Pos 30U /*!< xPSR: Z Position */ +#define xPSR_Z_Msk (1UL << xPSR_Z_Pos) /*!< xPSR: Z Mask */ + +#define xPSR_C_Pos 29U /*!< xPSR: C Position */ +#define xPSR_C_Msk (1UL << xPSR_C_Pos) /*!< xPSR: C Mask */ + +#define xPSR_V_Pos 28U /*!< xPSR: V Position */ +#define xPSR_V_Msk (1UL << xPSR_V_Pos) /*!< xPSR: V Mask */ + +#define xPSR_Q_Pos 27U /*!< xPSR: Q Position */ +#define xPSR_Q_Msk (1UL << xPSR_Q_Pos) /*!< xPSR: Q Mask */ + +#define xPSR_ICI_IT_2_Pos 25U /*!< xPSR: ICI/IT part 2 Position */ +#define xPSR_ICI_IT_2_Msk (3UL << xPSR_ICI_IT_2_Pos) /*!< xPSR: ICI/IT part 2 Mask */ + +#define xPSR_T_Pos 24U /*!< xPSR: T Position */ +#define xPSR_T_Msk (1UL << xPSR_T_Pos) /*!< xPSR: T Mask */ + +#define xPSR_GE_Pos 16U /*!< xPSR: GE Position */ +#define xPSR_GE_Msk (0xFUL << xPSR_GE_Pos) /*!< xPSR: GE Mask */ + +#define xPSR_ICI_IT_1_Pos 10U /*!< xPSR: ICI/IT part 1 Position */ +#define xPSR_ICI_IT_1_Msk (0x3FUL << xPSR_ICI_IT_1_Pos) /*!< xPSR: ICI/IT part 1 Mask */ + +#define xPSR_ISR_Pos 0U /*!< xPSR: ISR Position */ +#define xPSR_ISR_Msk (0x1FFUL /*<< xPSR_ISR_Pos*/) /*!< xPSR: ISR Mask */ + + +/** + \brief Union type to access the Control Registers (CONTROL). + */ +typedef union +{ + struct + { + uint32_t nPRIV:1; /*!< bit: 0 Execution privilege in Thread mode */ + uint32_t SPSEL:1; /*!< bit: 1 Stack to be used */ + uint32_t FPCA:1; /*!< bit: 2 FP extension active flag */ + uint32_t _reserved0:29; /*!< bit: 3..31 Reserved */ + } b; /*!< Structure used for bit access */ + uint32_t w; /*!< Type used for word access */ +} CONTROL_Type; + +/* CONTROL Register Definitions */ +#define CONTROL_FPCA_Pos 2U /*!< CONTROL: FPCA Position */ +#define CONTROL_FPCA_Msk (1UL << CONTROL_FPCA_Pos) /*!< CONTROL: FPCA Mask */ + +#define CONTROL_SPSEL_Pos 1U /*!< CONTROL: SPSEL Position */ +#define CONTROL_SPSEL_Msk (1UL << CONTROL_SPSEL_Pos) /*!< CONTROL: SPSEL Mask */ + +#define CONTROL_nPRIV_Pos 0U /*!< CONTROL: nPRIV Position */ +#define CONTROL_nPRIV_Msk (1UL /*<< CONTROL_nPRIV_Pos*/) /*!< CONTROL: nPRIV Mask */ + +/*@} end of group CMSIS_CORE */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_NVIC Nested Vectored Interrupt Controller (NVIC) + \brief Type definitions for the NVIC Registers + @{ + */ + +/** + \brief Structure type to access the Nested Vectored Interrupt Controller (NVIC). + */ +typedef struct +{ + __IOM uint32_t ISER[8U]; /*!< Offset: 0x000 (R/W) Interrupt Set Enable Register */ + uint32_t RESERVED0[24U]; + __IOM uint32_t ICER[8U]; /*!< Offset: 0x080 (R/W) Interrupt Clear Enable Register */ + uint32_t RSERVED1[24U]; + __IOM uint32_t ISPR[8U]; /*!< Offset: 0x100 (R/W) Interrupt Set Pending Register */ + uint32_t RESERVED2[24U]; + __IOM uint32_t ICPR[8U]; /*!< Offset: 0x180 (R/W) Interrupt Clear Pending Register */ + uint32_t RESERVED3[24U]; + __IOM uint32_t IABR[8U]; /*!< Offset: 0x200 (R/W) Interrupt Active bit Register */ + uint32_t RESERVED4[56U]; + __IOM uint8_t IP[240U]; /*!< Offset: 0x300 (R/W) Interrupt Priority Register (8Bit wide) */ + uint32_t RESERVED5[644U]; + __OM uint32_t STIR; /*!< Offset: 0xE00 ( /W) Software Trigger Interrupt Register */ +} NVIC_Type; + +/* Software Triggered Interrupt Register Definitions */ +#define NVIC_STIR_INTID_Pos 0U /*!< STIR: INTLINESNUM Position */ +#define NVIC_STIR_INTID_Msk (0x1FFUL /*<< NVIC_STIR_INTID_Pos*/) /*!< STIR: INTLINESNUM Mask */ + +/*@} end of group CMSIS_NVIC */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCB System Control Block (SCB) + \brief Type definitions for the System Control Block Registers + @{ + */ + +/** + \brief Structure type to access the System Control Block (SCB). + */ +typedef struct +{ + __IM uint32_t CPUID; /*!< Offset: 0x000 (R/ ) CPUID Base Register */ + __IOM uint32_t ICSR; /*!< Offset: 0x004 (R/W) Interrupt Control and State Register */ + __IOM uint32_t VTOR; /*!< Offset: 0x008 (R/W) Vector Table Offset Register */ + __IOM uint32_t AIRCR; /*!< Offset: 0x00C (R/W) Application Interrupt and Reset Control Register */ + __IOM uint32_t SCR; /*!< Offset: 0x010 (R/W) System Control Register */ + __IOM uint32_t CCR; /*!< Offset: 0x014 (R/W) Configuration Control Register */ + __IOM uint8_t SHP[12U]; /*!< Offset: 0x018 (R/W) System Handlers Priority Registers (4-7, 8-11, 12-15) */ + __IOM uint32_t SHCSR; /*!< Offset: 0x024 (R/W) System Handler Control and State Register */ + __IOM uint32_t CFSR; /*!< Offset: 0x028 (R/W) Configurable Fault Status Register */ + __IOM uint32_t HFSR; /*!< Offset: 0x02C (R/W) HardFault Status Register */ + __IOM uint32_t DFSR; /*!< Offset: 0x030 (R/W) Debug Fault Status Register */ + __IOM uint32_t MMFAR; /*!< Offset: 0x034 (R/W) MemManage Fault Address Register */ + __IOM uint32_t BFAR; /*!< Offset: 0x038 (R/W) BusFault Address Register */ + __IOM uint32_t AFSR; /*!< Offset: 0x03C (R/W) Auxiliary Fault Status Register */ + __IM uint32_t PFR[2U]; /*!< Offset: 0x040 (R/ ) Processor Feature Register */ + __IM uint32_t DFR; /*!< Offset: 0x048 (R/ ) Debug Feature Register */ + __IM uint32_t ADR; /*!< Offset: 0x04C (R/ ) Auxiliary Feature Register */ + __IM uint32_t MMFR[4U]; /*!< Offset: 0x050 (R/ ) Memory Model Feature Register */ + __IM uint32_t ISAR[5U]; /*!< Offset: 0x060 (R/ ) Instruction Set Attributes Register */ + uint32_t RESERVED0[5U]; + __IOM uint32_t CPACR; /*!< Offset: 0x088 (R/W) Coprocessor Access Control Register */ +} SCB_Type; + +/* SCB CPUID Register Definitions */ +#define SCB_CPUID_IMPLEMENTER_Pos 24U /*!< SCB CPUID: IMPLEMENTER Position */ +#define SCB_CPUID_IMPLEMENTER_Msk (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos) /*!< SCB CPUID: IMPLEMENTER Mask */ + +#define SCB_CPUID_VARIANT_Pos 20U /*!< SCB CPUID: VARIANT Position */ +#define SCB_CPUID_VARIANT_Msk (0xFUL << SCB_CPUID_VARIANT_Pos) /*!< SCB CPUID: VARIANT Mask */ + +#define SCB_CPUID_ARCHITECTURE_Pos 16U /*!< SCB CPUID: ARCHITECTURE Position */ +#define SCB_CPUID_ARCHITECTURE_Msk (0xFUL << SCB_CPUID_ARCHITECTURE_Pos) /*!< SCB CPUID: ARCHITECTURE Mask */ + +#define SCB_CPUID_PARTNO_Pos 4U /*!< SCB CPUID: PARTNO Position */ +#define SCB_CPUID_PARTNO_Msk (0xFFFUL << SCB_CPUID_PARTNO_Pos) /*!< SCB CPUID: PARTNO Mask */ + +#define SCB_CPUID_REVISION_Pos 0U /*!< SCB CPUID: REVISION Position */ +#define SCB_CPUID_REVISION_Msk (0xFUL /*<< SCB_CPUID_REVISION_Pos*/) /*!< SCB CPUID: REVISION Mask */ + +/* SCB Interrupt Control State Register Definitions */ +#define SCB_ICSR_NMIPENDSET_Pos 31U /*!< SCB ICSR: NMIPENDSET Position */ +#define SCB_ICSR_NMIPENDSET_Msk (1UL << SCB_ICSR_NMIPENDSET_Pos) /*!< SCB ICSR: NMIPENDSET Mask */ + +#define SCB_ICSR_PENDSVSET_Pos 28U /*!< SCB ICSR: PENDSVSET Position */ +#define SCB_ICSR_PENDSVSET_Msk (1UL << SCB_ICSR_PENDSVSET_Pos) /*!< SCB ICSR: PENDSVSET Mask */ + +#define SCB_ICSR_PENDSVCLR_Pos 27U /*!< SCB ICSR: PENDSVCLR Position */ +#define SCB_ICSR_PENDSVCLR_Msk (1UL << SCB_ICSR_PENDSVCLR_Pos) /*!< SCB ICSR: PENDSVCLR Mask */ + +#define SCB_ICSR_PENDSTSET_Pos 26U /*!< SCB ICSR: PENDSTSET Position */ +#define SCB_ICSR_PENDSTSET_Msk (1UL << SCB_ICSR_PENDSTSET_Pos) /*!< SCB ICSR: PENDSTSET Mask */ + +#define SCB_ICSR_PENDSTCLR_Pos 25U /*!< SCB ICSR: PENDSTCLR Position */ +#define SCB_ICSR_PENDSTCLR_Msk (1UL << SCB_ICSR_PENDSTCLR_Pos) /*!< SCB ICSR: PENDSTCLR Mask */ + +#define SCB_ICSR_ISRPREEMPT_Pos 23U /*!< SCB ICSR: ISRPREEMPT Position */ +#define SCB_ICSR_ISRPREEMPT_Msk (1UL << SCB_ICSR_ISRPREEMPT_Pos) /*!< SCB ICSR: ISRPREEMPT Mask */ + +#define SCB_ICSR_ISRPENDING_Pos 22U /*!< SCB ICSR: ISRPENDING Position */ +#define SCB_ICSR_ISRPENDING_Msk (1UL << SCB_ICSR_ISRPENDING_Pos) /*!< SCB ICSR: ISRPENDING Mask */ + +#define SCB_ICSR_VECTPENDING_Pos 12U /*!< SCB ICSR: VECTPENDING Position */ +#define SCB_ICSR_VECTPENDING_Msk (0x1FFUL << SCB_ICSR_VECTPENDING_Pos) /*!< SCB ICSR: VECTPENDING Mask */ + +#define SCB_ICSR_RETTOBASE_Pos 11U /*!< SCB ICSR: RETTOBASE Position */ +#define SCB_ICSR_RETTOBASE_Msk (1UL << SCB_ICSR_RETTOBASE_Pos) /*!< SCB ICSR: RETTOBASE Mask */ + +#define SCB_ICSR_VECTACTIVE_Pos 0U /*!< SCB ICSR: VECTACTIVE Position */ +#define SCB_ICSR_VECTACTIVE_Msk (0x1FFUL /*<< SCB_ICSR_VECTACTIVE_Pos*/) /*!< SCB ICSR: VECTACTIVE Mask */ + +/* SCB Vector Table Offset Register Definitions */ +#define SCB_VTOR_TBLOFF_Pos 7U /*!< SCB VTOR: TBLOFF Position */ +#define SCB_VTOR_TBLOFF_Msk (0x1FFFFFFUL << SCB_VTOR_TBLOFF_Pos) /*!< SCB VTOR: TBLOFF Mask */ + +/* SCB Application Interrupt and Reset Control Register Definitions */ +#define SCB_AIRCR_VECTKEY_Pos 16U /*!< SCB AIRCR: VECTKEY Position */ +#define SCB_AIRCR_VECTKEY_Msk (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos) /*!< SCB AIRCR: VECTKEY Mask */ + +#define SCB_AIRCR_VECTKEYSTAT_Pos 16U /*!< SCB AIRCR: VECTKEYSTAT Position */ +#define SCB_AIRCR_VECTKEYSTAT_Msk (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos) /*!< SCB AIRCR: VECTKEYSTAT Mask */ + +#define SCB_AIRCR_ENDIANESS_Pos 15U /*!< SCB AIRCR: ENDIANESS Position */ +#define SCB_AIRCR_ENDIANESS_Msk (1UL << SCB_AIRCR_ENDIANESS_Pos) /*!< SCB AIRCR: ENDIANESS Mask */ + +#define SCB_AIRCR_PRIGROUP_Pos 8U /*!< SCB AIRCR: PRIGROUP Position */ +#define SCB_AIRCR_PRIGROUP_Msk (7UL << SCB_AIRCR_PRIGROUP_Pos) /*!< SCB AIRCR: PRIGROUP Mask */ + +#define SCB_AIRCR_SYSRESETREQ_Pos 2U /*!< SCB AIRCR: SYSRESETREQ Position */ +#define SCB_AIRCR_SYSRESETREQ_Msk (1UL << SCB_AIRCR_SYSRESETREQ_Pos) /*!< SCB AIRCR: SYSRESETREQ Mask */ + +#define SCB_AIRCR_VECTCLRACTIVE_Pos 1U /*!< SCB AIRCR: VECTCLRACTIVE Position */ +#define SCB_AIRCR_VECTCLRACTIVE_Msk (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos) /*!< SCB AIRCR: VECTCLRACTIVE Mask */ + +#define SCB_AIRCR_VECTRESET_Pos 0U /*!< SCB AIRCR: VECTRESET Position */ +#define SCB_AIRCR_VECTRESET_Msk (1UL /*<< SCB_AIRCR_VECTRESET_Pos*/) /*!< SCB AIRCR: VECTRESET Mask */ + +/* SCB System Control Register Definitions */ +#define SCB_SCR_SEVONPEND_Pos 4U /*!< SCB SCR: SEVONPEND Position */ +#define SCB_SCR_SEVONPEND_Msk (1UL << SCB_SCR_SEVONPEND_Pos) /*!< SCB SCR: SEVONPEND Mask */ + +#define SCB_SCR_SLEEPDEEP_Pos 2U /*!< SCB SCR: SLEEPDEEP Position */ +#define SCB_SCR_SLEEPDEEP_Msk (1UL << SCB_SCR_SLEEPDEEP_Pos) /*!< SCB SCR: SLEEPDEEP Mask */ + +#define SCB_SCR_SLEEPONEXIT_Pos 1U /*!< SCB SCR: SLEEPONEXIT Position */ +#define SCB_SCR_SLEEPONEXIT_Msk (1UL << SCB_SCR_SLEEPONEXIT_Pos) /*!< SCB SCR: SLEEPONEXIT Mask */ + +/* SCB Configuration Control Register Definitions */ +#define SCB_CCR_STKALIGN_Pos 9U /*!< SCB CCR: STKALIGN Position */ +#define SCB_CCR_STKALIGN_Msk (1UL << SCB_CCR_STKALIGN_Pos) /*!< SCB CCR: STKALIGN Mask */ + +#define SCB_CCR_BFHFNMIGN_Pos 8U /*!< SCB CCR: BFHFNMIGN Position */ +#define SCB_CCR_BFHFNMIGN_Msk (1UL << SCB_CCR_BFHFNMIGN_Pos) /*!< SCB CCR: BFHFNMIGN Mask */ + +#define SCB_CCR_DIV_0_TRP_Pos 4U /*!< SCB CCR: DIV_0_TRP Position */ +#define SCB_CCR_DIV_0_TRP_Msk (1UL << SCB_CCR_DIV_0_TRP_Pos) /*!< SCB CCR: DIV_0_TRP Mask */ + +#define SCB_CCR_UNALIGN_TRP_Pos 3U /*!< SCB CCR: UNALIGN_TRP Position */ +#define SCB_CCR_UNALIGN_TRP_Msk (1UL << SCB_CCR_UNALIGN_TRP_Pos) /*!< SCB CCR: UNALIGN_TRP Mask */ + +#define SCB_CCR_USERSETMPEND_Pos 1U /*!< SCB CCR: USERSETMPEND Position */ +#define SCB_CCR_USERSETMPEND_Msk (1UL << SCB_CCR_USERSETMPEND_Pos) /*!< SCB CCR: USERSETMPEND Mask */ + +#define SCB_CCR_NONBASETHRDENA_Pos 0U /*!< SCB CCR: NONBASETHRDENA Position */ +#define SCB_CCR_NONBASETHRDENA_Msk (1UL /*<< SCB_CCR_NONBASETHRDENA_Pos*/) /*!< SCB CCR: NONBASETHRDENA Mask */ + +/* SCB System Handler Control and State Register Definitions */ +#define SCB_SHCSR_USGFAULTENA_Pos 18U /*!< SCB SHCSR: USGFAULTENA Position */ +#define SCB_SHCSR_USGFAULTENA_Msk (1UL << SCB_SHCSR_USGFAULTENA_Pos) /*!< SCB SHCSR: USGFAULTENA Mask */ + +#define SCB_SHCSR_BUSFAULTENA_Pos 17U /*!< SCB SHCSR: BUSFAULTENA Position */ +#define SCB_SHCSR_BUSFAULTENA_Msk (1UL << SCB_SHCSR_BUSFAULTENA_Pos) /*!< SCB SHCSR: BUSFAULTENA Mask */ + +#define SCB_SHCSR_MEMFAULTENA_Pos 16U /*!< SCB SHCSR: MEMFAULTENA Position */ +#define SCB_SHCSR_MEMFAULTENA_Msk (1UL << SCB_SHCSR_MEMFAULTENA_Pos) /*!< SCB SHCSR: MEMFAULTENA Mask */ + +#define SCB_SHCSR_SVCALLPENDED_Pos 15U /*!< SCB SHCSR: SVCALLPENDED Position */ +#define SCB_SHCSR_SVCALLPENDED_Msk (1UL << SCB_SHCSR_SVCALLPENDED_Pos) /*!< SCB SHCSR: SVCALLPENDED Mask */ + +#define SCB_SHCSR_BUSFAULTPENDED_Pos 14U /*!< SCB SHCSR: BUSFAULTPENDED Position */ +#define SCB_SHCSR_BUSFAULTPENDED_Msk (1UL << SCB_SHCSR_BUSFAULTPENDED_Pos) /*!< SCB SHCSR: BUSFAULTPENDED Mask */ + +#define SCB_SHCSR_MEMFAULTPENDED_Pos 13U /*!< SCB SHCSR: MEMFAULTPENDED Position */ +#define SCB_SHCSR_MEMFAULTPENDED_Msk (1UL << SCB_SHCSR_MEMFAULTPENDED_Pos) /*!< SCB SHCSR: MEMFAULTPENDED Mask */ + +#define SCB_SHCSR_USGFAULTPENDED_Pos 12U /*!< SCB SHCSR: USGFAULTPENDED Position */ +#define SCB_SHCSR_USGFAULTPENDED_Msk (1UL << SCB_SHCSR_USGFAULTPENDED_Pos) /*!< SCB SHCSR: USGFAULTPENDED Mask */ + +#define SCB_SHCSR_SYSTICKACT_Pos 11U /*!< SCB SHCSR: SYSTICKACT Position */ +#define SCB_SHCSR_SYSTICKACT_Msk (1UL << SCB_SHCSR_SYSTICKACT_Pos) /*!< SCB SHCSR: SYSTICKACT Mask */ + +#define SCB_SHCSR_PENDSVACT_Pos 10U /*!< SCB SHCSR: PENDSVACT Position */ +#define SCB_SHCSR_PENDSVACT_Msk (1UL << SCB_SHCSR_PENDSVACT_Pos) /*!< SCB SHCSR: PENDSVACT Mask */ + +#define SCB_SHCSR_MONITORACT_Pos 8U /*!< SCB SHCSR: MONITORACT Position */ +#define SCB_SHCSR_MONITORACT_Msk (1UL << SCB_SHCSR_MONITORACT_Pos) /*!< SCB SHCSR: MONITORACT Mask */ + +#define SCB_SHCSR_SVCALLACT_Pos 7U /*!< SCB SHCSR: SVCALLACT Position */ +#define SCB_SHCSR_SVCALLACT_Msk (1UL << SCB_SHCSR_SVCALLACT_Pos) /*!< SCB SHCSR: SVCALLACT Mask */ + +#define SCB_SHCSR_USGFAULTACT_Pos 3U /*!< SCB SHCSR: USGFAULTACT Position */ +#define SCB_SHCSR_USGFAULTACT_Msk (1UL << SCB_SHCSR_USGFAULTACT_Pos) /*!< SCB SHCSR: USGFAULTACT Mask */ + +#define SCB_SHCSR_BUSFAULTACT_Pos 1U /*!< SCB SHCSR: BUSFAULTACT Position */ +#define SCB_SHCSR_BUSFAULTACT_Msk (1UL << SCB_SHCSR_BUSFAULTACT_Pos) /*!< SCB SHCSR: BUSFAULTACT Mask */ + +#define SCB_SHCSR_MEMFAULTACT_Pos 0U /*!< SCB SHCSR: MEMFAULTACT Position */ +#define SCB_SHCSR_MEMFAULTACT_Msk (1UL /*<< SCB_SHCSR_MEMFAULTACT_Pos*/) /*!< SCB SHCSR: MEMFAULTACT Mask */ + +/* SCB Configurable Fault Status Register Definitions */ +#define SCB_CFSR_USGFAULTSR_Pos 16U /*!< SCB CFSR: Usage Fault Status Register Position */ +#define SCB_CFSR_USGFAULTSR_Msk (0xFFFFUL << SCB_CFSR_USGFAULTSR_Pos) /*!< SCB CFSR: Usage Fault Status Register Mask */ + +#define SCB_CFSR_BUSFAULTSR_Pos 8U /*!< SCB CFSR: Bus Fault Status Register Position */ +#define SCB_CFSR_BUSFAULTSR_Msk (0xFFUL << SCB_CFSR_BUSFAULTSR_Pos) /*!< SCB CFSR: Bus Fault Status Register Mask */ + +#define SCB_CFSR_MEMFAULTSR_Pos 0U /*!< SCB CFSR: Memory Manage Fault Status Register Position */ +#define SCB_CFSR_MEMFAULTSR_Msk (0xFFUL /*<< SCB_CFSR_MEMFAULTSR_Pos*/) /*!< SCB CFSR: Memory Manage Fault Status Register Mask */ + +/* MemManage Fault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_MMARVALID_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 7U) /*!< SCB CFSR (MMFSR): MMARVALID Position */ +#define SCB_CFSR_MMARVALID_Msk (1UL << SCB_CFSR_MMARVALID_Pos) /*!< SCB CFSR (MMFSR): MMARVALID Mask */ + +#define SCB_CFSR_MLSPERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 5U) /*!< SCB CFSR (MMFSR): MLSPERR Position */ +#define SCB_CFSR_MLSPERR_Msk (1UL << SCB_CFSR_MLSPERR_Pos) /*!< SCB CFSR (MMFSR): MLSPERR Mask */ + +#define SCB_CFSR_MSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 4U) /*!< SCB CFSR (MMFSR): MSTKERR Position */ +#define SCB_CFSR_MSTKERR_Msk (1UL << SCB_CFSR_MSTKERR_Pos) /*!< SCB CFSR (MMFSR): MSTKERR Mask */ + +#define SCB_CFSR_MUNSTKERR_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 3U) /*!< SCB CFSR (MMFSR): MUNSTKERR Position */ +#define SCB_CFSR_MUNSTKERR_Msk (1UL << SCB_CFSR_MUNSTKERR_Pos) /*!< SCB CFSR (MMFSR): MUNSTKERR Mask */ + +#define SCB_CFSR_DACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 1U) /*!< SCB CFSR (MMFSR): DACCVIOL Position */ +#define SCB_CFSR_DACCVIOL_Msk (1UL << SCB_CFSR_DACCVIOL_Pos) /*!< SCB CFSR (MMFSR): DACCVIOL Mask */ + +#define SCB_CFSR_IACCVIOL_Pos (SCB_SHCSR_MEMFAULTACT_Pos + 0U) /*!< SCB CFSR (MMFSR): IACCVIOL Position */ +#define SCB_CFSR_IACCVIOL_Msk (1UL /*<< SCB_CFSR_IACCVIOL_Pos*/) /*!< SCB CFSR (MMFSR): IACCVIOL Mask */ + +/* BusFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_BFARVALID_Pos (SCB_CFSR_BUSFAULTSR_Pos + 7U) /*!< SCB CFSR (BFSR): BFARVALID Position */ +#define SCB_CFSR_BFARVALID_Msk (1UL << SCB_CFSR_BFARVALID_Pos) /*!< SCB CFSR (BFSR): BFARVALID Mask */ + +#define SCB_CFSR_LSPERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 5U) /*!< SCB CFSR (BFSR): LSPERR Position */ +#define SCB_CFSR_LSPERR_Msk (1UL << SCB_CFSR_LSPERR_Pos) /*!< SCB CFSR (BFSR): LSPERR Mask */ + +#define SCB_CFSR_STKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 4U) /*!< SCB CFSR (BFSR): STKERR Position */ +#define SCB_CFSR_STKERR_Msk (1UL << SCB_CFSR_STKERR_Pos) /*!< SCB CFSR (BFSR): STKERR Mask */ + +#define SCB_CFSR_UNSTKERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 3U) /*!< SCB CFSR (BFSR): UNSTKERR Position */ +#define SCB_CFSR_UNSTKERR_Msk (1UL << SCB_CFSR_UNSTKERR_Pos) /*!< SCB CFSR (BFSR): UNSTKERR Mask */ + +#define SCB_CFSR_IMPRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 2U) /*!< SCB CFSR (BFSR): IMPRECISERR Position */ +#define SCB_CFSR_IMPRECISERR_Msk (1UL << SCB_CFSR_IMPRECISERR_Pos) /*!< SCB CFSR (BFSR): IMPRECISERR Mask */ + +#define SCB_CFSR_PRECISERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 1U) /*!< SCB CFSR (BFSR): PRECISERR Position */ +#define SCB_CFSR_PRECISERR_Msk (1UL << SCB_CFSR_PRECISERR_Pos) /*!< SCB CFSR (BFSR): PRECISERR Mask */ + +#define SCB_CFSR_IBUSERR_Pos (SCB_CFSR_BUSFAULTSR_Pos + 0U) /*!< SCB CFSR (BFSR): IBUSERR Position */ +#define SCB_CFSR_IBUSERR_Msk (1UL << SCB_CFSR_IBUSERR_Pos) /*!< SCB CFSR (BFSR): IBUSERR Mask */ + +/* UsageFault Status Register (part of SCB Configurable Fault Status Register) */ +#define SCB_CFSR_DIVBYZERO_Pos (SCB_CFSR_USGFAULTSR_Pos + 9U) /*!< SCB CFSR (UFSR): DIVBYZERO Position */ +#define SCB_CFSR_DIVBYZERO_Msk (1UL << SCB_CFSR_DIVBYZERO_Pos) /*!< SCB CFSR (UFSR): DIVBYZERO Mask */ + +#define SCB_CFSR_UNALIGNED_Pos (SCB_CFSR_USGFAULTSR_Pos + 8U) /*!< SCB CFSR (UFSR): UNALIGNED Position */ +#define SCB_CFSR_UNALIGNED_Msk (1UL << SCB_CFSR_UNALIGNED_Pos) /*!< SCB CFSR (UFSR): UNALIGNED Mask */ + +#define SCB_CFSR_NOCP_Pos (SCB_CFSR_USGFAULTSR_Pos + 3U) /*!< SCB CFSR (UFSR): NOCP Position */ +#define SCB_CFSR_NOCP_Msk (1UL << SCB_CFSR_NOCP_Pos) /*!< SCB CFSR (UFSR): NOCP Mask */ + +#define SCB_CFSR_INVPC_Pos (SCB_CFSR_USGFAULTSR_Pos + 2U) /*!< SCB CFSR (UFSR): INVPC Position */ +#define SCB_CFSR_INVPC_Msk (1UL << SCB_CFSR_INVPC_Pos) /*!< SCB CFSR (UFSR): INVPC Mask */ + +#define SCB_CFSR_INVSTATE_Pos (SCB_CFSR_USGFAULTSR_Pos + 1U) /*!< SCB CFSR (UFSR): INVSTATE Position */ +#define SCB_CFSR_INVSTATE_Msk (1UL << SCB_CFSR_INVSTATE_Pos) /*!< SCB CFSR (UFSR): INVSTATE Mask */ + +#define SCB_CFSR_UNDEFINSTR_Pos (SCB_CFSR_USGFAULTSR_Pos + 0U) /*!< SCB CFSR (UFSR): UNDEFINSTR Position */ +#define SCB_CFSR_UNDEFINSTR_Msk (1UL << SCB_CFSR_UNDEFINSTR_Pos) /*!< SCB CFSR (UFSR): UNDEFINSTR Mask */ + +/* SCB Hard Fault Status Register Definitions */ +#define SCB_HFSR_DEBUGEVT_Pos 31U /*!< SCB HFSR: DEBUGEVT Position */ +#define SCB_HFSR_DEBUGEVT_Msk (1UL << SCB_HFSR_DEBUGEVT_Pos) /*!< SCB HFSR: DEBUGEVT Mask */ + +#define SCB_HFSR_FORCED_Pos 30U /*!< SCB HFSR: FORCED Position */ +#define SCB_HFSR_FORCED_Msk (1UL << SCB_HFSR_FORCED_Pos) /*!< SCB HFSR: FORCED Mask */ + +#define SCB_HFSR_VECTTBL_Pos 1U /*!< SCB HFSR: VECTTBL Position */ +#define SCB_HFSR_VECTTBL_Msk (1UL << SCB_HFSR_VECTTBL_Pos) /*!< SCB HFSR: VECTTBL Mask */ + +/* SCB Debug Fault Status Register Definitions */ +#define SCB_DFSR_EXTERNAL_Pos 4U /*!< SCB DFSR: EXTERNAL Position */ +#define SCB_DFSR_EXTERNAL_Msk (1UL << SCB_DFSR_EXTERNAL_Pos) /*!< SCB DFSR: EXTERNAL Mask */ + +#define SCB_DFSR_VCATCH_Pos 3U /*!< SCB DFSR: VCATCH Position */ +#define SCB_DFSR_VCATCH_Msk (1UL << SCB_DFSR_VCATCH_Pos) /*!< SCB DFSR: VCATCH Mask */ + +#define SCB_DFSR_DWTTRAP_Pos 2U /*!< SCB DFSR: DWTTRAP Position */ +#define SCB_DFSR_DWTTRAP_Msk (1UL << SCB_DFSR_DWTTRAP_Pos) /*!< SCB DFSR: DWTTRAP Mask */ + +#define SCB_DFSR_BKPT_Pos 1U /*!< SCB DFSR: BKPT Position */ +#define SCB_DFSR_BKPT_Msk (1UL << SCB_DFSR_BKPT_Pos) /*!< SCB DFSR: BKPT Mask */ + +#define SCB_DFSR_HALTED_Pos 0U /*!< SCB DFSR: HALTED Position */ +#define SCB_DFSR_HALTED_Msk (1UL /*<< SCB_DFSR_HALTED_Pos*/) /*!< SCB DFSR: HALTED Mask */ + +/*@} end of group CMSIS_SCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SCnSCB System Controls not in SCB (SCnSCB) + \brief Type definitions for the System Control and ID Register not in the SCB + @{ + */ + +/** + \brief Structure type to access the System Control and ID Register not in the SCB. + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IM uint32_t ICTR; /*!< Offset: 0x004 (R/ ) Interrupt Controller Type Register */ + __IOM uint32_t ACTLR; /*!< Offset: 0x008 (R/W) Auxiliary Control Register */ +} SCnSCB_Type; + +/* Interrupt Controller Type Register Definitions */ +#define SCnSCB_ICTR_INTLINESNUM_Pos 0U /*!< ICTR: INTLINESNUM Position */ +#define SCnSCB_ICTR_INTLINESNUM_Msk (0xFUL /*<< SCnSCB_ICTR_INTLINESNUM_Pos*/) /*!< ICTR: INTLINESNUM Mask */ + +/* Auxiliary Control Register Definitions */ +#define SCnSCB_ACTLR_DISOOFP_Pos 9U /*!< ACTLR: DISOOFP Position */ +#define SCnSCB_ACTLR_DISOOFP_Msk (1UL << SCnSCB_ACTLR_DISOOFP_Pos) /*!< ACTLR: DISOOFP Mask */ + +#define SCnSCB_ACTLR_DISFPCA_Pos 8U /*!< ACTLR: DISFPCA Position */ +#define SCnSCB_ACTLR_DISFPCA_Msk (1UL << SCnSCB_ACTLR_DISFPCA_Pos) /*!< ACTLR: DISFPCA Mask */ + +#define SCnSCB_ACTLR_DISFOLD_Pos 2U /*!< ACTLR: DISFOLD Position */ +#define SCnSCB_ACTLR_DISFOLD_Msk (1UL << SCnSCB_ACTLR_DISFOLD_Pos) /*!< ACTLR: DISFOLD Mask */ + +#define SCnSCB_ACTLR_DISDEFWBUF_Pos 1U /*!< ACTLR: DISDEFWBUF Position */ +#define SCnSCB_ACTLR_DISDEFWBUF_Msk (1UL << SCnSCB_ACTLR_DISDEFWBUF_Pos) /*!< ACTLR: DISDEFWBUF Mask */ + +#define SCnSCB_ACTLR_DISMCYCINT_Pos 0U /*!< ACTLR: DISMCYCINT Position */ +#define SCnSCB_ACTLR_DISMCYCINT_Msk (1UL /*<< SCnSCB_ACTLR_DISMCYCINT_Pos*/) /*!< ACTLR: DISMCYCINT Mask */ + +/*@} end of group CMSIS_SCnotSCB */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_SysTick System Tick Timer (SysTick) + \brief Type definitions for the System Timer Registers. + @{ + */ + +/** + \brief Structure type to access the System Timer (SysTick). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) SysTick Control and Status Register */ + __IOM uint32_t LOAD; /*!< Offset: 0x004 (R/W) SysTick Reload Value Register */ + __IOM uint32_t VAL; /*!< Offset: 0x008 (R/W) SysTick Current Value Register */ + __IM uint32_t CALIB; /*!< Offset: 0x00C (R/ ) SysTick Calibration Register */ +} SysTick_Type; + +/* SysTick Control / Status Register Definitions */ +#define SysTick_CTRL_COUNTFLAG_Pos 16U /*!< SysTick CTRL: COUNTFLAG Position */ +#define SysTick_CTRL_COUNTFLAG_Msk (1UL << SysTick_CTRL_COUNTFLAG_Pos) /*!< SysTick CTRL: COUNTFLAG Mask */ + +#define SysTick_CTRL_CLKSOURCE_Pos 2U /*!< SysTick CTRL: CLKSOURCE Position */ +#define SysTick_CTRL_CLKSOURCE_Msk (1UL << SysTick_CTRL_CLKSOURCE_Pos) /*!< SysTick CTRL: CLKSOURCE Mask */ + +#define SysTick_CTRL_TICKINT_Pos 1U /*!< SysTick CTRL: TICKINT Position */ +#define SysTick_CTRL_TICKINT_Msk (1UL << SysTick_CTRL_TICKINT_Pos) /*!< SysTick CTRL: TICKINT Mask */ + +#define SysTick_CTRL_ENABLE_Pos 0U /*!< SysTick CTRL: ENABLE Position */ +#define SysTick_CTRL_ENABLE_Msk (1UL /*<< SysTick_CTRL_ENABLE_Pos*/) /*!< SysTick CTRL: ENABLE Mask */ + +/* SysTick Reload Register Definitions */ +#define SysTick_LOAD_RELOAD_Pos 0U /*!< SysTick LOAD: RELOAD Position */ +#define SysTick_LOAD_RELOAD_Msk (0xFFFFFFUL /*<< SysTick_LOAD_RELOAD_Pos*/) /*!< SysTick LOAD: RELOAD Mask */ + +/* SysTick Current Register Definitions */ +#define SysTick_VAL_CURRENT_Pos 0U /*!< SysTick VAL: CURRENT Position */ +#define SysTick_VAL_CURRENT_Msk (0xFFFFFFUL /*<< SysTick_VAL_CURRENT_Pos*/) /*!< SysTick VAL: CURRENT Mask */ + +/* SysTick Calibration Register Definitions */ +#define SysTick_CALIB_NOREF_Pos 31U /*!< SysTick CALIB: NOREF Position */ +#define SysTick_CALIB_NOREF_Msk (1UL << SysTick_CALIB_NOREF_Pos) /*!< SysTick CALIB: NOREF Mask */ + +#define SysTick_CALIB_SKEW_Pos 30U /*!< SysTick CALIB: SKEW Position */ +#define SysTick_CALIB_SKEW_Msk (1UL << SysTick_CALIB_SKEW_Pos) /*!< SysTick CALIB: SKEW Mask */ + +#define SysTick_CALIB_TENMS_Pos 0U /*!< SysTick CALIB: TENMS Position */ +#define SysTick_CALIB_TENMS_Msk (0xFFFFFFUL /*<< SysTick_CALIB_TENMS_Pos*/) /*!< SysTick CALIB: TENMS Mask */ + +/*@} end of group CMSIS_SysTick */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_ITM Instrumentation Trace Macrocell (ITM) + \brief Type definitions for the Instrumentation Trace Macrocell (ITM) + @{ + */ + +/** + \brief Structure type to access the Instrumentation Trace Macrocell Register (ITM). + */ +typedef struct +{ + __OM union + { + __OM uint8_t u8; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 8-bit */ + __OM uint16_t u16; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 16-bit */ + __OM uint32_t u32; /*!< Offset: 0x000 ( /W) ITM Stimulus Port 32-bit */ + } PORT [32U]; /*!< Offset: 0x000 ( /W) ITM Stimulus Port Registers */ + uint32_t RESERVED0[864U]; + __IOM uint32_t TER; /*!< Offset: 0xE00 (R/W) ITM Trace Enable Register */ + uint32_t RESERVED1[15U]; + __IOM uint32_t TPR; /*!< Offset: 0xE40 (R/W) ITM Trace Privilege Register */ + uint32_t RESERVED2[15U]; + __IOM uint32_t TCR; /*!< Offset: 0xE80 (R/W) ITM Trace Control Register */ + uint32_t RESERVED3[29U]; + __OM uint32_t IWR; /*!< Offset: 0xEF8 ( /W) ITM Integration Write Register */ + __IM uint32_t IRR; /*!< Offset: 0xEFC (R/ ) ITM Integration Read Register */ + __IOM uint32_t IMCR; /*!< Offset: 0xF00 (R/W) ITM Integration Mode Control Register */ + uint32_t RESERVED4[43U]; + __OM uint32_t LAR; /*!< Offset: 0xFB0 ( /W) ITM Lock Access Register */ + __IM uint32_t LSR; /*!< Offset: 0xFB4 (R/ ) ITM Lock Status Register */ + uint32_t RESERVED5[6U]; + __IM uint32_t PID4; /*!< Offset: 0xFD0 (R/ ) ITM Peripheral Identification Register #4 */ + __IM uint32_t PID5; /*!< Offset: 0xFD4 (R/ ) ITM Peripheral Identification Register #5 */ + __IM uint32_t PID6; /*!< Offset: 0xFD8 (R/ ) ITM Peripheral Identification Register #6 */ + __IM uint32_t PID7; /*!< Offset: 0xFDC (R/ ) ITM Peripheral Identification Register #7 */ + __IM uint32_t PID0; /*!< Offset: 0xFE0 (R/ ) ITM Peripheral Identification Register #0 */ + __IM uint32_t PID1; /*!< Offset: 0xFE4 (R/ ) ITM Peripheral Identification Register #1 */ + __IM uint32_t PID2; /*!< Offset: 0xFE8 (R/ ) ITM Peripheral Identification Register #2 */ + __IM uint32_t PID3; /*!< Offset: 0xFEC (R/ ) ITM Peripheral Identification Register #3 */ + __IM uint32_t CID0; /*!< Offset: 0xFF0 (R/ ) ITM Component Identification Register #0 */ + __IM uint32_t CID1; /*!< Offset: 0xFF4 (R/ ) ITM Component Identification Register #1 */ + __IM uint32_t CID2; /*!< Offset: 0xFF8 (R/ ) ITM Component Identification Register #2 */ + __IM uint32_t CID3; /*!< Offset: 0xFFC (R/ ) ITM Component Identification Register #3 */ +} ITM_Type; + +/* ITM Trace Privilege Register Definitions */ +#define ITM_TPR_PRIVMASK_Pos 0U /*!< ITM TPR: PRIVMASK Position */ +#define ITM_TPR_PRIVMASK_Msk (0xFUL /*<< ITM_TPR_PRIVMASK_Pos*/) /*!< ITM TPR: PRIVMASK Mask */ + +/* ITM Trace Control Register Definitions */ +#define ITM_TCR_BUSY_Pos 23U /*!< ITM TCR: BUSY Position */ +#define ITM_TCR_BUSY_Msk (1UL << ITM_TCR_BUSY_Pos) /*!< ITM TCR: BUSY Mask */ + +#define ITM_TCR_TraceBusID_Pos 16U /*!< ITM TCR: ATBID Position */ +#define ITM_TCR_TraceBusID_Msk (0x7FUL << ITM_TCR_TraceBusID_Pos) /*!< ITM TCR: ATBID Mask */ + +#define ITM_TCR_GTSFREQ_Pos 10U /*!< ITM TCR: Global timestamp frequency Position */ +#define ITM_TCR_GTSFREQ_Msk (3UL << ITM_TCR_GTSFREQ_Pos) /*!< ITM TCR: Global timestamp frequency Mask */ + +#define ITM_TCR_TSPrescale_Pos 8U /*!< ITM TCR: TSPrescale Position */ +#define ITM_TCR_TSPrescale_Msk (3UL << ITM_TCR_TSPrescale_Pos) /*!< ITM TCR: TSPrescale Mask */ + +#define ITM_TCR_SWOENA_Pos 4U /*!< ITM TCR: SWOENA Position */ +#define ITM_TCR_SWOENA_Msk (1UL << ITM_TCR_SWOENA_Pos) /*!< ITM TCR: SWOENA Mask */ + +#define ITM_TCR_DWTENA_Pos 3U /*!< ITM TCR: DWTENA Position */ +#define ITM_TCR_DWTENA_Msk (1UL << ITM_TCR_DWTENA_Pos) /*!< ITM TCR: DWTENA Mask */ + +#define ITM_TCR_SYNCENA_Pos 2U /*!< ITM TCR: SYNCENA Position */ +#define ITM_TCR_SYNCENA_Msk (1UL << ITM_TCR_SYNCENA_Pos) /*!< ITM TCR: SYNCENA Mask */ + +#define ITM_TCR_TSENA_Pos 1U /*!< ITM TCR: TSENA Position */ +#define ITM_TCR_TSENA_Msk (1UL << ITM_TCR_TSENA_Pos) /*!< ITM TCR: TSENA Mask */ + +#define ITM_TCR_ITMENA_Pos 0U /*!< ITM TCR: ITM Enable bit Position */ +#define ITM_TCR_ITMENA_Msk (1UL /*<< ITM_TCR_ITMENA_Pos*/) /*!< ITM TCR: ITM Enable bit Mask */ + +/* ITM Integration Write Register Definitions */ +#define ITM_IWR_ATVALIDM_Pos 0U /*!< ITM IWR: ATVALIDM Position */ +#define ITM_IWR_ATVALIDM_Msk (1UL /*<< ITM_IWR_ATVALIDM_Pos*/) /*!< ITM IWR: ATVALIDM Mask */ + +/* ITM Integration Read Register Definitions */ +#define ITM_IRR_ATREADYM_Pos 0U /*!< ITM IRR: ATREADYM Position */ +#define ITM_IRR_ATREADYM_Msk (1UL /*<< ITM_IRR_ATREADYM_Pos*/) /*!< ITM IRR: ATREADYM Mask */ + +/* ITM Integration Mode Control Register Definitions */ +#define ITM_IMCR_INTEGRATION_Pos 0U /*!< ITM IMCR: INTEGRATION Position */ +#define ITM_IMCR_INTEGRATION_Msk (1UL /*<< ITM_IMCR_INTEGRATION_Pos*/) /*!< ITM IMCR: INTEGRATION Mask */ + +/* ITM Lock Status Register Definitions */ +#define ITM_LSR_ByteAcc_Pos 2U /*!< ITM LSR: ByteAcc Position */ +#define ITM_LSR_ByteAcc_Msk (1UL << ITM_LSR_ByteAcc_Pos) /*!< ITM LSR: ByteAcc Mask */ + +#define ITM_LSR_Access_Pos 1U /*!< ITM LSR: Access Position */ +#define ITM_LSR_Access_Msk (1UL << ITM_LSR_Access_Pos) /*!< ITM LSR: Access Mask */ + +#define ITM_LSR_Present_Pos 0U /*!< ITM LSR: Present Position */ +#define ITM_LSR_Present_Msk (1UL /*<< ITM_LSR_Present_Pos*/) /*!< ITM LSR: Present Mask */ + +/*@}*/ /* end of group CMSIS_ITM */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_DWT Data Watchpoint and Trace (DWT) + \brief Type definitions for the Data Watchpoint and Trace (DWT) + @{ + */ + +/** + \brief Structure type to access the Data Watchpoint and Trace Register (DWT). + */ +typedef struct +{ + __IOM uint32_t CTRL; /*!< Offset: 0x000 (R/W) Control Register */ + __IOM uint32_t CYCCNT; /*!< Offset: 0x004 (R/W) Cycle Count Register */ + __IOM uint32_t CPICNT; /*!< Offset: 0x008 (R/W) CPI Count Register */ + __IOM uint32_t EXCCNT; /*!< Offset: 0x00C (R/W) Exception Overhead Count Register */ + __IOM uint32_t SLEEPCNT; /*!< Offset: 0x010 (R/W) Sleep Count Register */ + __IOM uint32_t LSUCNT; /*!< Offset: 0x014 (R/W) LSU Count Register */ + __IOM uint32_t FOLDCNT; /*!< Offset: 0x018 (R/W) Folded-instruction Count Register */ + __IM uint32_t PCSR; /*!< Offset: 0x01C (R/ ) Program Counter Sample Register */ + __IOM uint32_t COMP0; /*!< Offset: 0x020 (R/W) Comparator Register 0 */ + __IOM uint32_t MASK0; /*!< Offset: 0x024 (R/W) Mask Register 0 */ + __IOM uint32_t FUNCTION0; /*!< Offset: 0x028 (R/W) Function Register 0 */ + uint32_t RESERVED0[1U]; + __IOM uint32_t COMP1; /*!< Offset: 0x030 (R/W) Comparator Register 1 */ + __IOM uint32_t MASK1; /*!< Offset: 0x034 (R/W) Mask Register 1 */ + __IOM uint32_t FUNCTION1; /*!< Offset: 0x038 (R/W) Function Register 1 */ + uint32_t RESERVED1[1U]; + __IOM uint32_t COMP2; /*!< Offset: 0x040 (R/W) Comparator Register 2 */ + __IOM uint32_t MASK2; /*!< Offset: 0x044 (R/W) Mask Register 2 */ + __IOM uint32_t FUNCTION2; /*!< Offset: 0x048 (R/W) Function Register 2 */ + uint32_t RESERVED2[1U]; + __IOM uint32_t COMP3; /*!< Offset: 0x050 (R/W) Comparator Register 3 */ + __IOM uint32_t MASK3; /*!< Offset: 0x054 (R/W) Mask Register 3 */ + __IOM uint32_t FUNCTION3; /*!< Offset: 0x058 (R/W) Function Register 3 */ +} DWT_Type; + +/* DWT Control Register Definitions */ +#define DWT_CTRL_NUMCOMP_Pos 28U /*!< DWT CTRL: NUMCOMP Position */ +#define DWT_CTRL_NUMCOMP_Msk (0xFUL << DWT_CTRL_NUMCOMP_Pos) /*!< DWT CTRL: NUMCOMP Mask */ + +#define DWT_CTRL_NOTRCPKT_Pos 27U /*!< DWT CTRL: NOTRCPKT Position */ +#define DWT_CTRL_NOTRCPKT_Msk (0x1UL << DWT_CTRL_NOTRCPKT_Pos) /*!< DWT CTRL: NOTRCPKT Mask */ + +#define DWT_CTRL_NOEXTTRIG_Pos 26U /*!< DWT CTRL: NOEXTTRIG Position */ +#define DWT_CTRL_NOEXTTRIG_Msk (0x1UL << DWT_CTRL_NOEXTTRIG_Pos) /*!< DWT CTRL: NOEXTTRIG Mask */ + +#define DWT_CTRL_NOCYCCNT_Pos 25U /*!< DWT CTRL: NOCYCCNT Position */ +#define DWT_CTRL_NOCYCCNT_Msk (0x1UL << DWT_CTRL_NOCYCCNT_Pos) /*!< DWT CTRL: NOCYCCNT Mask */ + +#define DWT_CTRL_NOPRFCNT_Pos 24U /*!< DWT CTRL: NOPRFCNT Position */ +#define DWT_CTRL_NOPRFCNT_Msk (0x1UL << DWT_CTRL_NOPRFCNT_Pos) /*!< DWT CTRL: NOPRFCNT Mask */ + +#define DWT_CTRL_CYCEVTENA_Pos 22U /*!< DWT CTRL: CYCEVTENA Position */ +#define DWT_CTRL_CYCEVTENA_Msk (0x1UL << DWT_CTRL_CYCEVTENA_Pos) /*!< DWT CTRL: CYCEVTENA Mask */ + +#define DWT_CTRL_FOLDEVTENA_Pos 21U /*!< DWT CTRL: FOLDEVTENA Position */ +#define DWT_CTRL_FOLDEVTENA_Msk (0x1UL << DWT_CTRL_FOLDEVTENA_Pos) /*!< DWT CTRL: FOLDEVTENA Mask */ + +#define DWT_CTRL_LSUEVTENA_Pos 20U /*!< DWT CTRL: LSUEVTENA Position */ +#define DWT_CTRL_LSUEVTENA_Msk (0x1UL << DWT_CTRL_LSUEVTENA_Pos) /*!< DWT CTRL: LSUEVTENA Mask */ + +#define DWT_CTRL_SLEEPEVTENA_Pos 19U /*!< DWT CTRL: SLEEPEVTENA Position */ +#define DWT_CTRL_SLEEPEVTENA_Msk (0x1UL << DWT_CTRL_SLEEPEVTENA_Pos) /*!< DWT CTRL: SLEEPEVTENA Mask */ + +#define DWT_CTRL_EXCEVTENA_Pos 18U /*!< DWT CTRL: EXCEVTENA Position */ +#define DWT_CTRL_EXCEVTENA_Msk (0x1UL << DWT_CTRL_EXCEVTENA_Pos) /*!< DWT CTRL: EXCEVTENA Mask */ + +#define DWT_CTRL_CPIEVTENA_Pos 17U /*!< DWT CTRL: CPIEVTENA Position */ +#define DWT_CTRL_CPIEVTENA_Msk (0x1UL << DWT_CTRL_CPIEVTENA_Pos) /*!< DWT CTRL: CPIEVTENA Mask */ + +#define DWT_CTRL_EXCTRCENA_Pos 16U /*!< DWT CTRL: EXCTRCENA Position */ +#define DWT_CTRL_EXCTRCENA_Msk (0x1UL << DWT_CTRL_EXCTRCENA_Pos) /*!< DWT CTRL: EXCTRCENA Mask */ + +#define DWT_CTRL_PCSAMPLENA_Pos 12U /*!< DWT CTRL: PCSAMPLENA Position */ +#define DWT_CTRL_PCSAMPLENA_Msk (0x1UL << DWT_CTRL_PCSAMPLENA_Pos) /*!< DWT CTRL: PCSAMPLENA Mask */ + +#define DWT_CTRL_SYNCTAP_Pos 10U /*!< DWT CTRL: SYNCTAP Position */ +#define DWT_CTRL_SYNCTAP_Msk (0x3UL << DWT_CTRL_SYNCTAP_Pos) /*!< DWT CTRL: SYNCTAP Mask */ + +#define DWT_CTRL_CYCTAP_Pos 9U /*!< DWT CTRL: CYCTAP Position */ +#define DWT_CTRL_CYCTAP_Msk (0x1UL << DWT_CTRL_CYCTAP_Pos) /*!< DWT CTRL: CYCTAP Mask */ + +#define DWT_CTRL_POSTINIT_Pos 5U /*!< DWT CTRL: POSTINIT Position */ +#define DWT_CTRL_POSTINIT_Msk (0xFUL << DWT_CTRL_POSTINIT_Pos) /*!< DWT CTRL: POSTINIT Mask */ + +#define DWT_CTRL_POSTPRESET_Pos 1U /*!< DWT CTRL: POSTPRESET Position */ +#define DWT_CTRL_POSTPRESET_Msk (0xFUL << DWT_CTRL_POSTPRESET_Pos) /*!< DWT CTRL: POSTPRESET Mask */ + +#define DWT_CTRL_CYCCNTENA_Pos 0U /*!< DWT CTRL: CYCCNTENA Position */ +#define DWT_CTRL_CYCCNTENA_Msk (0x1UL /*<< DWT_CTRL_CYCCNTENA_Pos*/) /*!< DWT CTRL: CYCCNTENA Mask */ + +/* DWT CPI Count Register Definitions */ +#define DWT_CPICNT_CPICNT_Pos 0U /*!< DWT CPICNT: CPICNT Position */ +#define DWT_CPICNT_CPICNT_Msk (0xFFUL /*<< DWT_CPICNT_CPICNT_Pos*/) /*!< DWT CPICNT: CPICNT Mask */ + +/* DWT Exception Overhead Count Register Definitions */ +#define DWT_EXCCNT_EXCCNT_Pos 0U /*!< DWT EXCCNT: EXCCNT Position */ +#define DWT_EXCCNT_EXCCNT_Msk (0xFFUL /*<< DWT_EXCCNT_EXCCNT_Pos*/) /*!< DWT EXCCNT: EXCCNT Mask */ + +/* DWT Sleep Count Register Definitions */ +#define DWT_SLEEPCNT_SLEEPCNT_Pos 0U /*!< DWT SLEEPCNT: SLEEPCNT Position */ +#define DWT_SLEEPCNT_SLEEPCNT_Msk (0xFFUL /*<< DWT_SLEEPCNT_SLEEPCNT_Pos*/) /*!< DWT SLEEPCNT: SLEEPCNT Mask */ + +/* DWT LSU Count Register Definitions */ +#define DWT_LSUCNT_LSUCNT_Pos 0U /*!< DWT LSUCNT: LSUCNT Position */ +#define DWT_LSUCNT_LSUCNT_Msk (0xFFUL /*<< DWT_LSUCNT_LSUCNT_Pos*/) /*!< DWT LSUCNT: LSUCNT Mask */ + +/* DWT Folded-instruction Count Register Definitions */ +#define DWT_FOLDCNT_FOLDCNT_Pos 0U /*!< DWT FOLDCNT: FOLDCNT Position */ +#define DWT_FOLDCNT_FOLDCNT_Msk (0xFFUL /*<< DWT_FOLDCNT_FOLDCNT_Pos*/) /*!< DWT FOLDCNT: FOLDCNT Mask */ + +/* DWT Comparator Mask Register Definitions */ +#define DWT_MASK_MASK_Pos 0U /*!< DWT MASK: MASK Position */ +#define DWT_MASK_MASK_Msk (0x1FUL /*<< DWT_MASK_MASK_Pos*/) /*!< DWT MASK: MASK Mask */ + +/* DWT Comparator Function Register Definitions */ +#define DWT_FUNCTION_MATCHED_Pos 24U /*!< DWT FUNCTION: MATCHED Position */ +#define DWT_FUNCTION_MATCHED_Msk (0x1UL << DWT_FUNCTION_MATCHED_Pos) /*!< DWT FUNCTION: MATCHED Mask */ + +#define DWT_FUNCTION_DATAVADDR1_Pos 16U /*!< DWT FUNCTION: DATAVADDR1 Position */ +#define DWT_FUNCTION_DATAVADDR1_Msk (0xFUL << DWT_FUNCTION_DATAVADDR1_Pos) /*!< DWT FUNCTION: DATAVADDR1 Mask */ + +#define DWT_FUNCTION_DATAVADDR0_Pos 12U /*!< DWT FUNCTION: DATAVADDR0 Position */ +#define DWT_FUNCTION_DATAVADDR0_Msk (0xFUL << DWT_FUNCTION_DATAVADDR0_Pos) /*!< DWT FUNCTION: DATAVADDR0 Mask */ + +#define DWT_FUNCTION_DATAVSIZE_Pos 10U /*!< DWT FUNCTION: DATAVSIZE Position */ +#define DWT_FUNCTION_DATAVSIZE_Msk (0x3UL << DWT_FUNCTION_DATAVSIZE_Pos) /*!< DWT FUNCTION: DATAVSIZE Mask */ + +#define DWT_FUNCTION_LNK1ENA_Pos 9U /*!< DWT FUNCTION: LNK1ENA Position */ +#define DWT_FUNCTION_LNK1ENA_Msk (0x1UL << DWT_FUNCTION_LNK1ENA_Pos) /*!< DWT FUNCTION: LNK1ENA Mask */ + +#define DWT_FUNCTION_DATAVMATCH_Pos 8U /*!< DWT FUNCTION: DATAVMATCH Position */ +#define DWT_FUNCTION_DATAVMATCH_Msk (0x1UL << DWT_FUNCTION_DATAVMATCH_Pos) /*!< DWT FUNCTION: DATAVMATCH Mask */ + +#define DWT_FUNCTION_CYCMATCH_Pos 7U /*!< DWT FUNCTION: CYCMATCH Position */ +#define DWT_FUNCTION_CYCMATCH_Msk (0x1UL << DWT_FUNCTION_CYCMATCH_Pos) /*!< DWT FUNCTION: CYCMATCH Mask */ + +#define DWT_FUNCTION_EMITRANGE_Pos 5U /*!< DWT FUNCTION: EMITRANGE Position */ +#define DWT_FUNCTION_EMITRANGE_Msk (0x1UL << DWT_FUNCTION_EMITRANGE_Pos) /*!< DWT FUNCTION: EMITRANGE Mask */ + +#define DWT_FUNCTION_FUNCTION_Pos 0U /*!< DWT FUNCTION: FUNCTION Position */ +#define DWT_FUNCTION_FUNCTION_Msk (0xFUL /*<< DWT_FUNCTION_FUNCTION_Pos*/) /*!< DWT FUNCTION: FUNCTION Mask */ + +/*@}*/ /* end of group CMSIS_DWT */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_TPI Trace Port Interface (TPI) + \brief Type definitions for the Trace Port Interface (TPI) + @{ + */ + +/** + \brief Structure type to access the Trace Port Interface Register (TPI). + */ +typedef struct +{ + __IOM uint32_t SSPSR; /*!< Offset: 0x000 (R/ ) Supported Parallel Port Size Register */ + __IOM uint32_t CSPSR; /*!< Offset: 0x004 (R/W) Current Parallel Port Size Register */ + uint32_t RESERVED0[2U]; + __IOM uint32_t ACPR; /*!< Offset: 0x010 (R/W) Asynchronous Clock Prescaler Register */ + uint32_t RESERVED1[55U]; + __IOM uint32_t SPPR; /*!< Offset: 0x0F0 (R/W) Selected Pin Protocol Register */ + uint32_t RESERVED2[131U]; + __IM uint32_t FFSR; /*!< Offset: 0x300 (R/ ) Formatter and Flush Status Register */ + __IOM uint32_t FFCR; /*!< Offset: 0x304 (R/W) Formatter and Flush Control Register */ + __IM uint32_t FSCR; /*!< Offset: 0x308 (R/ ) Formatter Synchronization Counter Register */ + uint32_t RESERVED3[759U]; + __IM uint32_t TRIGGER; /*!< Offset: 0xEE8 (R/ ) TRIGGER */ + __IM uint32_t FIFO0; /*!< Offset: 0xEEC (R/ ) Integration ETM Data */ + __IM uint32_t ITATBCTR2; /*!< Offset: 0xEF0 (R/ ) ITATBCTR2 */ + uint32_t RESERVED4[1U]; + __IM uint32_t ITATBCTR0; /*!< Offset: 0xEF8 (R/ ) ITATBCTR0 */ + __IM uint32_t FIFO1; /*!< Offset: 0xEFC (R/ ) Integration ITM Data */ + __IOM uint32_t ITCTRL; /*!< Offset: 0xF00 (R/W) Integration Mode Control */ + uint32_t RESERVED5[39U]; + __IOM uint32_t CLAIMSET; /*!< Offset: 0xFA0 (R/W) Claim tag set */ + __IOM uint32_t CLAIMCLR; /*!< Offset: 0xFA4 (R/W) Claim tag clear */ + uint32_t RESERVED7[8U]; + __IM uint32_t DEVID; /*!< Offset: 0xFC8 (R/ ) TPIU_DEVID */ + __IM uint32_t DEVTYPE; /*!< Offset: 0xFCC (R/ ) TPIU_DEVTYPE */ +} TPI_Type; + +/* TPI Asynchronous Clock Prescaler Register Definitions */ +#define TPI_ACPR_PRESCALER_Pos 0U /*!< TPI ACPR: PRESCALER Position */ +#define TPI_ACPR_PRESCALER_Msk (0x1FFFUL /*<< TPI_ACPR_PRESCALER_Pos*/) /*!< TPI ACPR: PRESCALER Mask */ + +/* TPI Selected Pin Protocol Register Definitions */ +#define TPI_SPPR_TXMODE_Pos 0U /*!< TPI SPPR: TXMODE Position */ +#define TPI_SPPR_TXMODE_Msk (0x3UL /*<< TPI_SPPR_TXMODE_Pos*/) /*!< TPI SPPR: TXMODE Mask */ + +/* TPI Formatter and Flush Status Register Definitions */ +#define TPI_FFSR_FtNonStop_Pos 3U /*!< TPI FFSR: FtNonStop Position */ +#define TPI_FFSR_FtNonStop_Msk (0x1UL << TPI_FFSR_FtNonStop_Pos) /*!< TPI FFSR: FtNonStop Mask */ + +#define TPI_FFSR_TCPresent_Pos 2U /*!< TPI FFSR: TCPresent Position */ +#define TPI_FFSR_TCPresent_Msk (0x1UL << TPI_FFSR_TCPresent_Pos) /*!< TPI FFSR: TCPresent Mask */ + +#define TPI_FFSR_FtStopped_Pos 1U /*!< TPI FFSR: FtStopped Position */ +#define TPI_FFSR_FtStopped_Msk (0x1UL << TPI_FFSR_FtStopped_Pos) /*!< TPI FFSR: FtStopped Mask */ + +#define TPI_FFSR_FlInProg_Pos 0U /*!< TPI FFSR: FlInProg Position */ +#define TPI_FFSR_FlInProg_Msk (0x1UL /*<< TPI_FFSR_FlInProg_Pos*/) /*!< TPI FFSR: FlInProg Mask */ + +/* TPI Formatter and Flush Control Register Definitions */ +#define TPI_FFCR_TrigIn_Pos 8U /*!< TPI FFCR: TrigIn Position */ +#define TPI_FFCR_TrigIn_Msk (0x1UL << TPI_FFCR_TrigIn_Pos) /*!< TPI FFCR: TrigIn Mask */ + +#define TPI_FFCR_EnFCont_Pos 1U /*!< TPI FFCR: EnFCont Position */ +#define TPI_FFCR_EnFCont_Msk (0x1UL << TPI_FFCR_EnFCont_Pos) /*!< TPI FFCR: EnFCont Mask */ + +/* TPI TRIGGER Register Definitions */ +#define TPI_TRIGGER_TRIGGER_Pos 0U /*!< TPI TRIGGER: TRIGGER Position */ +#define TPI_TRIGGER_TRIGGER_Msk (0x1UL /*<< TPI_TRIGGER_TRIGGER_Pos*/) /*!< TPI TRIGGER: TRIGGER Mask */ + +/* TPI Integration ETM Data Register Definitions (FIFO0) */ +#define TPI_FIFO0_ITM_ATVALID_Pos 29U /*!< TPI FIFO0: ITM_ATVALID Position */ +#define TPI_FIFO0_ITM_ATVALID_Msk (0x3UL << TPI_FIFO0_ITM_ATVALID_Pos) /*!< TPI FIFO0: ITM_ATVALID Mask */ + +#define TPI_FIFO0_ITM_bytecount_Pos 27U /*!< TPI FIFO0: ITM_bytecount Position */ +#define TPI_FIFO0_ITM_bytecount_Msk (0x3UL << TPI_FIFO0_ITM_bytecount_Pos) /*!< TPI FIFO0: ITM_bytecount Mask */ + +#define TPI_FIFO0_ETM_ATVALID_Pos 26U /*!< TPI FIFO0: ETM_ATVALID Position */ +#define TPI_FIFO0_ETM_ATVALID_Msk (0x3UL << TPI_FIFO0_ETM_ATVALID_Pos) /*!< TPI FIFO0: ETM_ATVALID Mask */ + +#define TPI_FIFO0_ETM_bytecount_Pos 24U /*!< TPI FIFO0: ETM_bytecount Position */ +#define TPI_FIFO0_ETM_bytecount_Msk (0x3UL << TPI_FIFO0_ETM_bytecount_Pos) /*!< TPI FIFO0: ETM_bytecount Mask */ + +#define TPI_FIFO0_ETM2_Pos 16U /*!< TPI FIFO0: ETM2 Position */ +#define TPI_FIFO0_ETM2_Msk (0xFFUL << TPI_FIFO0_ETM2_Pos) /*!< TPI FIFO0: ETM2 Mask */ + +#define TPI_FIFO0_ETM1_Pos 8U /*!< TPI FIFO0: ETM1 Position */ +#define TPI_FIFO0_ETM1_Msk (0xFFUL << TPI_FIFO0_ETM1_Pos) /*!< TPI FIFO0: ETM1 Mask */ + +#define TPI_FIFO0_ETM0_Pos 0U /*!< TPI FIFO0: ETM0 Position */ +#define TPI_FIFO0_ETM0_Msk (0xFFUL /*<< TPI_FIFO0_ETM0_Pos*/) /*!< TPI FIFO0: ETM0 Mask */ + +/* TPI ITATBCTR2 Register Definitions */ +#define TPI_ITATBCTR2_ATREADY_Pos 0U /*!< TPI ITATBCTR2: ATREADY Position */ +#define TPI_ITATBCTR2_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR2_ATREADY_Pos*/) /*!< TPI ITATBCTR2: ATREADY Mask */ + +/* TPI Integration ITM Data Register Definitions (FIFO1) */ +#define TPI_FIFO1_ITM_ATVALID_Pos 29U /*!< TPI FIFO1: ITM_ATVALID Position */ +#define TPI_FIFO1_ITM_ATVALID_Msk (0x3UL << TPI_FIFO1_ITM_ATVALID_Pos) /*!< TPI FIFO1: ITM_ATVALID Mask */ + +#define TPI_FIFO1_ITM_bytecount_Pos 27U /*!< TPI FIFO1: ITM_bytecount Position */ +#define TPI_FIFO1_ITM_bytecount_Msk (0x3UL << TPI_FIFO1_ITM_bytecount_Pos) /*!< TPI FIFO1: ITM_bytecount Mask */ + +#define TPI_FIFO1_ETM_ATVALID_Pos 26U /*!< TPI FIFO1: ETM_ATVALID Position */ +#define TPI_FIFO1_ETM_ATVALID_Msk (0x3UL << TPI_FIFO1_ETM_ATVALID_Pos) /*!< TPI FIFO1: ETM_ATVALID Mask */ + +#define TPI_FIFO1_ETM_bytecount_Pos 24U /*!< TPI FIFO1: ETM_bytecount Position */ +#define TPI_FIFO1_ETM_bytecount_Msk (0x3UL << TPI_FIFO1_ETM_bytecount_Pos) /*!< TPI FIFO1: ETM_bytecount Mask */ + +#define TPI_FIFO1_ITM2_Pos 16U /*!< TPI FIFO1: ITM2 Position */ +#define TPI_FIFO1_ITM2_Msk (0xFFUL << TPI_FIFO1_ITM2_Pos) /*!< TPI FIFO1: ITM2 Mask */ + +#define TPI_FIFO1_ITM1_Pos 8U /*!< TPI FIFO1: ITM1 Position */ +#define TPI_FIFO1_ITM1_Msk (0xFFUL << TPI_FIFO1_ITM1_Pos) /*!< TPI FIFO1: ITM1 Mask */ + +#define TPI_FIFO1_ITM0_Pos 0U /*!< TPI FIFO1: ITM0 Position */ +#define TPI_FIFO1_ITM0_Msk (0xFFUL /*<< TPI_FIFO1_ITM0_Pos*/) /*!< TPI FIFO1: ITM0 Mask */ + +/* TPI ITATBCTR0 Register Definitions */ +#define TPI_ITATBCTR0_ATREADY_Pos 0U /*!< TPI ITATBCTR0: ATREADY Position */ +#define TPI_ITATBCTR0_ATREADY_Msk (0x1UL /*<< TPI_ITATBCTR0_ATREADY_Pos*/) /*!< TPI ITATBCTR0: ATREADY Mask */ + +/* TPI Integration Mode Control Register Definitions */ +#define TPI_ITCTRL_Mode_Pos 0U /*!< TPI ITCTRL: Mode Position */ +#define TPI_ITCTRL_Mode_Msk (0x1UL /*<< TPI_ITCTRL_Mode_Pos*/) /*!< TPI ITCTRL: Mode Mask */ + +/* TPI DEVID Register Definitions */ +#define TPI_DEVID_NRZVALID_Pos 11U /*!< TPI DEVID: NRZVALID Position */ +#define TPI_DEVID_NRZVALID_Msk (0x1UL << TPI_DEVID_NRZVALID_Pos) /*!< TPI DEVID: NRZVALID Mask */ + +#define TPI_DEVID_MANCVALID_Pos 10U /*!< TPI DEVID: MANCVALID Position */ +#define TPI_DEVID_MANCVALID_Msk (0x1UL << TPI_DEVID_MANCVALID_Pos) /*!< TPI DEVID: MANCVALID Mask */ + +#define TPI_DEVID_PTINVALID_Pos 9U /*!< TPI DEVID: PTINVALID Position */ +#define TPI_DEVID_PTINVALID_Msk (0x1UL << TPI_DEVID_PTINVALID_Pos) /*!< TPI DEVID: PTINVALID Mask */ + +#define TPI_DEVID_MinBufSz_Pos 6U /*!< TPI DEVID: MinBufSz Position */ +#define TPI_DEVID_MinBufSz_Msk (0x7UL << TPI_DEVID_MinBufSz_Pos) /*!< TPI DEVID: MinBufSz Mask */ + +#define TPI_DEVID_AsynClkIn_Pos 5U /*!< TPI DEVID: AsynClkIn Position */ +#define TPI_DEVID_AsynClkIn_Msk (0x1UL << TPI_DEVID_AsynClkIn_Pos) /*!< TPI DEVID: AsynClkIn Mask */ + +#define TPI_DEVID_NrTraceInput_Pos 0U /*!< TPI DEVID: NrTraceInput Position */ +#define TPI_DEVID_NrTraceInput_Msk (0x1FUL /*<< TPI_DEVID_NrTraceInput_Pos*/) /*!< TPI DEVID: NrTraceInput Mask */ + +/* TPI DEVTYPE Register Definitions */ +#define TPI_DEVTYPE_MajorType_Pos 4U /*!< TPI DEVTYPE: MajorType Position */ +#define TPI_DEVTYPE_MajorType_Msk (0xFUL << TPI_DEVTYPE_MajorType_Pos) /*!< TPI DEVTYPE: MajorType Mask */ + +#define TPI_DEVTYPE_SubType_Pos 0U /*!< TPI DEVTYPE: SubType Position */ +#define TPI_DEVTYPE_SubType_Msk (0xFUL /*<< TPI_DEVTYPE_SubType_Pos*/) /*!< TPI DEVTYPE: SubType Mask */ + +/*@}*/ /* end of group CMSIS_TPI */ + + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_MPU Memory Protection Unit (MPU) + \brief Type definitions for the Memory Protection Unit (MPU) + @{ + */ + +/** + \brief Structure type to access the Memory Protection Unit (MPU). + */ +typedef struct +{ + __IM uint32_t TYPE; /*!< Offset: 0x000 (R/ ) MPU Type Register */ + __IOM uint32_t CTRL; /*!< Offset: 0x004 (R/W) MPU Control Register */ + __IOM uint32_t RNR; /*!< Offset: 0x008 (R/W) MPU Region RNRber Register */ + __IOM uint32_t RBAR; /*!< Offset: 0x00C (R/W) MPU Region Base Address Register */ + __IOM uint32_t RASR; /*!< Offset: 0x010 (R/W) MPU Region Attribute and Size Register */ + __IOM uint32_t RBAR_A1; /*!< Offset: 0x014 (R/W) MPU Alias 1 Region Base Address Register */ + __IOM uint32_t RASR_A1; /*!< Offset: 0x018 (R/W) MPU Alias 1 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A2; /*!< Offset: 0x01C (R/W) MPU Alias 2 Region Base Address Register */ + __IOM uint32_t RASR_A2; /*!< Offset: 0x020 (R/W) MPU Alias 2 Region Attribute and Size Register */ + __IOM uint32_t RBAR_A3; /*!< Offset: 0x024 (R/W) MPU Alias 3 Region Base Address Register */ + __IOM uint32_t RASR_A3; /*!< Offset: 0x028 (R/W) MPU Alias 3 Region Attribute and Size Register */ +} MPU_Type; + +#define MPU_TYPE_RALIASES 4U + +/* MPU Type Register Definitions */ +#define MPU_TYPE_IREGION_Pos 16U /*!< MPU TYPE: IREGION Position */ +#define MPU_TYPE_IREGION_Msk (0xFFUL << MPU_TYPE_IREGION_Pos) /*!< MPU TYPE: IREGION Mask */ + +#define MPU_TYPE_DREGION_Pos 8U /*!< MPU TYPE: DREGION Position */ +#define MPU_TYPE_DREGION_Msk (0xFFUL << MPU_TYPE_DREGION_Pos) /*!< MPU TYPE: DREGION Mask */ + +#define MPU_TYPE_SEPARATE_Pos 0U /*!< MPU TYPE: SEPARATE Position */ +#define MPU_TYPE_SEPARATE_Msk (1UL /*<< MPU_TYPE_SEPARATE_Pos*/) /*!< MPU TYPE: SEPARATE Mask */ + +/* MPU Control Register Definitions */ +#define MPU_CTRL_PRIVDEFENA_Pos 2U /*!< MPU CTRL: PRIVDEFENA Position */ +#define MPU_CTRL_PRIVDEFENA_Msk (1UL << MPU_CTRL_PRIVDEFENA_Pos) /*!< MPU CTRL: PRIVDEFENA Mask */ + +#define MPU_CTRL_HFNMIENA_Pos 1U /*!< MPU CTRL: HFNMIENA Position */ +#define MPU_CTRL_HFNMIENA_Msk (1UL << MPU_CTRL_HFNMIENA_Pos) /*!< MPU CTRL: HFNMIENA Mask */ + +#define MPU_CTRL_ENABLE_Pos 0U /*!< MPU CTRL: ENABLE Position */ +#define MPU_CTRL_ENABLE_Msk (1UL /*<< MPU_CTRL_ENABLE_Pos*/) /*!< MPU CTRL: ENABLE Mask */ + +/* MPU Region Number Register Definitions */ +#define MPU_RNR_REGION_Pos 0U /*!< MPU RNR: REGION Position */ +#define MPU_RNR_REGION_Msk (0xFFUL /*<< MPU_RNR_REGION_Pos*/) /*!< MPU RNR: REGION Mask */ + +/* MPU Region Base Address Register Definitions */ +#define MPU_RBAR_ADDR_Pos 5U /*!< MPU RBAR: ADDR Position */ +#define MPU_RBAR_ADDR_Msk (0x7FFFFFFUL << MPU_RBAR_ADDR_Pos) /*!< MPU RBAR: ADDR Mask */ + +#define MPU_RBAR_VALID_Pos 4U /*!< MPU RBAR: VALID Position */ +#define MPU_RBAR_VALID_Msk (1UL << MPU_RBAR_VALID_Pos) /*!< MPU RBAR: VALID Mask */ + +#define MPU_RBAR_REGION_Pos 0U /*!< MPU RBAR: REGION Position */ +#define MPU_RBAR_REGION_Msk (0xFUL /*<< MPU_RBAR_REGION_Pos*/) /*!< MPU RBAR: REGION Mask */ + +/* MPU Region Attribute and Size Register Definitions */ +#define MPU_RASR_ATTRS_Pos 16U /*!< MPU RASR: MPU Region Attribute field Position */ +#define MPU_RASR_ATTRS_Msk (0xFFFFUL << MPU_RASR_ATTRS_Pos) /*!< MPU RASR: MPU Region Attribute field Mask */ + +#define MPU_RASR_XN_Pos 28U /*!< MPU RASR: ATTRS.XN Position */ +#define MPU_RASR_XN_Msk (1UL << MPU_RASR_XN_Pos) /*!< MPU RASR: ATTRS.XN Mask */ + +#define MPU_RASR_AP_Pos 24U /*!< MPU RASR: ATTRS.AP Position */ +#define MPU_RASR_AP_Msk (0x7UL << MPU_RASR_AP_Pos) /*!< MPU RASR: ATTRS.AP Mask */ + +#define MPU_RASR_TEX_Pos 19U /*!< MPU RASR: ATTRS.TEX Position */ +#define MPU_RASR_TEX_Msk (0x7UL << MPU_RASR_TEX_Pos) /*!< MPU RASR: ATTRS.TEX Mask */ + +#define MPU_RASR_S_Pos 18U /*!< MPU RASR: ATTRS.S Position */ +#define MPU_RASR_S_Msk (1UL << MPU_RASR_S_Pos) /*!< MPU RASR: ATTRS.S Mask */ + +#define MPU_RASR_C_Pos 17U /*!< MPU RASR: ATTRS.C Position */ +#define MPU_RASR_C_Msk (1UL << MPU_RASR_C_Pos) /*!< MPU RASR: ATTRS.C Mask */ + +#define MPU_RASR_B_Pos 16U /*!< MPU RASR: ATTRS.B Position */ +#define MPU_RASR_B_Msk (1UL << MPU_RASR_B_Pos) /*!< MPU RASR: ATTRS.B Mask */ + +#define MPU_RASR_SRD_Pos 8U /*!< MPU RASR: Sub-Region Disable Position */ +#define MPU_RASR_SRD_Msk (0xFFUL << MPU_RASR_SRD_Pos) /*!< MPU RASR: Sub-Region Disable Mask */ + +#define MPU_RASR_SIZE_Pos 1U /*!< MPU RASR: Region Size Field Position */ +#define MPU_RASR_SIZE_Msk (0x1FUL << MPU_RASR_SIZE_Pos) /*!< MPU RASR: Region Size Field Mask */ + +#define MPU_RASR_ENABLE_Pos 0U /*!< MPU RASR: Region enable bit Position */ +#define MPU_RASR_ENABLE_Msk (1UL /*<< MPU_RASR_ENABLE_Pos*/) /*!< MPU RASR: Region enable bit Disable Mask */ + +/*@} end of group CMSIS_MPU */ +#endif /* defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_FPU Floating Point Unit (FPU) + \brief Type definitions for the Floating Point Unit (FPU) + @{ + */ + +/** + \brief Structure type to access the Floating Point Unit (FPU). + */ +typedef struct +{ + uint32_t RESERVED0[1U]; + __IOM uint32_t FPCCR; /*!< Offset: 0x004 (R/W) Floating-Point Context Control Register */ + __IOM uint32_t FPCAR; /*!< Offset: 0x008 (R/W) Floating-Point Context Address Register */ + __IOM uint32_t FPDSCR; /*!< Offset: 0x00C (R/W) Floating-Point Default Status Control Register */ + __IM uint32_t MVFR0; /*!< Offset: 0x010 (R/ ) Media and FP Feature Register 0 */ + __IM uint32_t MVFR1; /*!< Offset: 0x014 (R/ ) Media and FP Feature Register 1 */ +} FPU_Type; + +/* Floating-Point Context Control Register Definitions */ +#define FPU_FPCCR_ASPEN_Pos 31U /*!< FPCCR: ASPEN bit Position */ +#define FPU_FPCCR_ASPEN_Msk (1UL << FPU_FPCCR_ASPEN_Pos) /*!< FPCCR: ASPEN bit Mask */ + +#define FPU_FPCCR_LSPEN_Pos 30U /*!< FPCCR: LSPEN Position */ +#define FPU_FPCCR_LSPEN_Msk (1UL << FPU_FPCCR_LSPEN_Pos) /*!< FPCCR: LSPEN bit Mask */ + +#define FPU_FPCCR_MONRDY_Pos 8U /*!< FPCCR: MONRDY Position */ +#define FPU_FPCCR_MONRDY_Msk (1UL << FPU_FPCCR_MONRDY_Pos) /*!< FPCCR: MONRDY bit Mask */ + +#define FPU_FPCCR_BFRDY_Pos 6U /*!< FPCCR: BFRDY Position */ +#define FPU_FPCCR_BFRDY_Msk (1UL << FPU_FPCCR_BFRDY_Pos) /*!< FPCCR: BFRDY bit Mask */ + +#define FPU_FPCCR_MMRDY_Pos 5U /*!< FPCCR: MMRDY Position */ +#define FPU_FPCCR_MMRDY_Msk (1UL << FPU_FPCCR_MMRDY_Pos) /*!< FPCCR: MMRDY bit Mask */ + +#define FPU_FPCCR_HFRDY_Pos 4U /*!< FPCCR: HFRDY Position */ +#define FPU_FPCCR_HFRDY_Msk (1UL << FPU_FPCCR_HFRDY_Pos) /*!< FPCCR: HFRDY bit Mask */ + +#define FPU_FPCCR_THREAD_Pos 3U /*!< FPCCR: processor mode bit Position */ +#define FPU_FPCCR_THREAD_Msk (1UL << FPU_FPCCR_THREAD_Pos) /*!< FPCCR: processor mode active bit Mask */ + +#define FPU_FPCCR_USER_Pos 1U /*!< FPCCR: privilege level bit Position */ +#define FPU_FPCCR_USER_Msk (1UL << FPU_FPCCR_USER_Pos) /*!< FPCCR: privilege level bit Mask */ + +#define FPU_FPCCR_LSPACT_Pos 0U /*!< FPCCR: Lazy state preservation active bit Position */ +#define FPU_FPCCR_LSPACT_Msk (1UL /*<< FPU_FPCCR_LSPACT_Pos*/) /*!< FPCCR: Lazy state preservation active bit Mask */ + +/* Floating-Point Context Address Register Definitions */ +#define FPU_FPCAR_ADDRESS_Pos 3U /*!< FPCAR: ADDRESS bit Position */ +#define FPU_FPCAR_ADDRESS_Msk (0x1FFFFFFFUL << FPU_FPCAR_ADDRESS_Pos) /*!< FPCAR: ADDRESS bit Mask */ + +/* Floating-Point Default Status Control Register Definitions */ +#define FPU_FPDSCR_AHP_Pos 26U /*!< FPDSCR: AHP bit Position */ +#define FPU_FPDSCR_AHP_Msk (1UL << FPU_FPDSCR_AHP_Pos) /*!< FPDSCR: AHP bit Mask */ + +#define FPU_FPDSCR_DN_Pos 25U /*!< FPDSCR: DN bit Position */ +#define FPU_FPDSCR_DN_Msk (1UL << FPU_FPDSCR_DN_Pos) /*!< FPDSCR: DN bit Mask */ + +#define FPU_FPDSCR_FZ_Pos 24U /*!< FPDSCR: FZ bit Position */ +#define FPU_FPDSCR_FZ_Msk (1UL << FPU_FPDSCR_FZ_Pos) /*!< FPDSCR: FZ bit Mask */ + +#define FPU_FPDSCR_RMode_Pos 22U /*!< FPDSCR: RMode bit Position */ +#define FPU_FPDSCR_RMode_Msk (3UL << FPU_FPDSCR_RMode_Pos) /*!< FPDSCR: RMode bit Mask */ + +/* Media and FP Feature Register 0 Definitions */ +#define FPU_MVFR0_FP_rounding_modes_Pos 28U /*!< MVFR0: FP rounding modes bits Position */ +#define FPU_MVFR0_FP_rounding_modes_Msk (0xFUL << FPU_MVFR0_FP_rounding_modes_Pos) /*!< MVFR0: FP rounding modes bits Mask */ + +#define FPU_MVFR0_Short_vectors_Pos 24U /*!< MVFR0: Short vectors bits Position */ +#define FPU_MVFR0_Short_vectors_Msk (0xFUL << FPU_MVFR0_Short_vectors_Pos) /*!< MVFR0: Short vectors bits Mask */ + +#define FPU_MVFR0_Square_root_Pos 20U /*!< MVFR0: Square root bits Position */ +#define FPU_MVFR0_Square_root_Msk (0xFUL << FPU_MVFR0_Square_root_Pos) /*!< MVFR0: Square root bits Mask */ + +#define FPU_MVFR0_Divide_Pos 16U /*!< MVFR0: Divide bits Position */ +#define FPU_MVFR0_Divide_Msk (0xFUL << FPU_MVFR0_Divide_Pos) /*!< MVFR0: Divide bits Mask */ + +#define FPU_MVFR0_FP_excep_trapping_Pos 12U /*!< MVFR0: FP exception trapping bits Position */ +#define FPU_MVFR0_FP_excep_trapping_Msk (0xFUL << FPU_MVFR0_FP_excep_trapping_Pos) /*!< MVFR0: FP exception trapping bits Mask */ + +#define FPU_MVFR0_Double_precision_Pos 8U /*!< MVFR0: Double-precision bits Position */ +#define FPU_MVFR0_Double_precision_Msk (0xFUL << FPU_MVFR0_Double_precision_Pos) /*!< MVFR0: Double-precision bits Mask */ + +#define FPU_MVFR0_Single_precision_Pos 4U /*!< MVFR0: Single-precision bits Position */ +#define FPU_MVFR0_Single_precision_Msk (0xFUL << FPU_MVFR0_Single_precision_Pos) /*!< MVFR0: Single-precision bits Mask */ + +#define FPU_MVFR0_A_SIMD_registers_Pos 0U /*!< MVFR0: A_SIMD registers bits Position */ +#define FPU_MVFR0_A_SIMD_registers_Msk (0xFUL /*<< FPU_MVFR0_A_SIMD_registers_Pos*/) /*!< MVFR0: A_SIMD registers bits Mask */ + +/* Media and FP Feature Register 1 Definitions */ +#define FPU_MVFR1_FP_fused_MAC_Pos 28U /*!< MVFR1: FP fused MAC bits Position */ +#define FPU_MVFR1_FP_fused_MAC_Msk (0xFUL << FPU_MVFR1_FP_fused_MAC_Pos) /*!< MVFR1: FP fused MAC bits Mask */ + +#define FPU_MVFR1_FP_HPFP_Pos 24U /*!< MVFR1: FP HPFP bits Position */ +#define FPU_MVFR1_FP_HPFP_Msk (0xFUL << FPU_MVFR1_FP_HPFP_Pos) /*!< MVFR1: FP HPFP bits Mask */ + +#define FPU_MVFR1_D_NaN_mode_Pos 4U /*!< MVFR1: D_NaN mode bits Position */ +#define FPU_MVFR1_D_NaN_mode_Msk (0xFUL << FPU_MVFR1_D_NaN_mode_Pos) /*!< MVFR1: D_NaN mode bits Mask */ + +#define FPU_MVFR1_FtZ_mode_Pos 0U /*!< MVFR1: FtZ mode bits Position */ +#define FPU_MVFR1_FtZ_mode_Msk (0xFUL /*<< FPU_MVFR1_FtZ_mode_Pos*/) /*!< MVFR1: FtZ mode bits Mask */ + +/*@} end of group CMSIS_FPU */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_CoreDebug Core Debug Registers (CoreDebug) + \brief Type definitions for the Core Debug Registers + @{ + */ + +/** + \brief Structure type to access the Core Debug Register (CoreDebug). + */ +typedef struct +{ + __IOM uint32_t DHCSR; /*!< Offset: 0x000 (R/W) Debug Halting Control and Status Register */ + __OM uint32_t DCRSR; /*!< Offset: 0x004 ( /W) Debug Core Register Selector Register */ + __IOM uint32_t DCRDR; /*!< Offset: 0x008 (R/W) Debug Core Register Data Register */ + __IOM uint32_t DEMCR; /*!< Offset: 0x00C (R/W) Debug Exception and Monitor Control Register */ +} CoreDebug_Type; + +/* Debug Halting Control and Status Register Definitions */ +#define CoreDebug_DHCSR_DBGKEY_Pos 16U /*!< CoreDebug DHCSR: DBGKEY Position */ +#define CoreDebug_DHCSR_DBGKEY_Msk (0xFFFFUL << CoreDebug_DHCSR_DBGKEY_Pos) /*!< CoreDebug DHCSR: DBGKEY Mask */ + +#define CoreDebug_DHCSR_S_RESET_ST_Pos 25U /*!< CoreDebug DHCSR: S_RESET_ST Position */ +#define CoreDebug_DHCSR_S_RESET_ST_Msk (1UL << CoreDebug_DHCSR_S_RESET_ST_Pos) /*!< CoreDebug DHCSR: S_RESET_ST Mask */ + +#define CoreDebug_DHCSR_S_RETIRE_ST_Pos 24U /*!< CoreDebug DHCSR: S_RETIRE_ST Position */ +#define CoreDebug_DHCSR_S_RETIRE_ST_Msk (1UL << CoreDebug_DHCSR_S_RETIRE_ST_Pos) /*!< CoreDebug DHCSR: S_RETIRE_ST Mask */ + +#define CoreDebug_DHCSR_S_LOCKUP_Pos 19U /*!< CoreDebug DHCSR: S_LOCKUP Position */ +#define CoreDebug_DHCSR_S_LOCKUP_Msk (1UL << CoreDebug_DHCSR_S_LOCKUP_Pos) /*!< CoreDebug DHCSR: S_LOCKUP Mask */ + +#define CoreDebug_DHCSR_S_SLEEP_Pos 18U /*!< CoreDebug DHCSR: S_SLEEP Position */ +#define CoreDebug_DHCSR_S_SLEEP_Msk (1UL << CoreDebug_DHCSR_S_SLEEP_Pos) /*!< CoreDebug DHCSR: S_SLEEP Mask */ + +#define CoreDebug_DHCSR_S_HALT_Pos 17U /*!< CoreDebug DHCSR: S_HALT Position */ +#define CoreDebug_DHCSR_S_HALT_Msk (1UL << CoreDebug_DHCSR_S_HALT_Pos) /*!< CoreDebug DHCSR: S_HALT Mask */ + +#define CoreDebug_DHCSR_S_REGRDY_Pos 16U /*!< CoreDebug DHCSR: S_REGRDY Position */ +#define CoreDebug_DHCSR_S_REGRDY_Msk (1UL << CoreDebug_DHCSR_S_REGRDY_Pos) /*!< CoreDebug DHCSR: S_REGRDY Mask */ + +#define CoreDebug_DHCSR_C_SNAPSTALL_Pos 5U /*!< CoreDebug DHCSR: C_SNAPSTALL Position */ +#define CoreDebug_DHCSR_C_SNAPSTALL_Msk (1UL << CoreDebug_DHCSR_C_SNAPSTALL_Pos) /*!< CoreDebug DHCSR: C_SNAPSTALL Mask */ + +#define CoreDebug_DHCSR_C_MASKINTS_Pos 3U /*!< CoreDebug DHCSR: C_MASKINTS Position */ +#define CoreDebug_DHCSR_C_MASKINTS_Msk (1UL << CoreDebug_DHCSR_C_MASKINTS_Pos) /*!< CoreDebug DHCSR: C_MASKINTS Mask */ + +#define CoreDebug_DHCSR_C_STEP_Pos 2U /*!< CoreDebug DHCSR: C_STEP Position */ +#define CoreDebug_DHCSR_C_STEP_Msk (1UL << CoreDebug_DHCSR_C_STEP_Pos) /*!< CoreDebug DHCSR: C_STEP Mask */ + +#define CoreDebug_DHCSR_C_HALT_Pos 1U /*!< CoreDebug DHCSR: C_HALT Position */ +#define CoreDebug_DHCSR_C_HALT_Msk (1UL << CoreDebug_DHCSR_C_HALT_Pos) /*!< CoreDebug DHCSR: C_HALT Mask */ + +#define CoreDebug_DHCSR_C_DEBUGEN_Pos 0U /*!< CoreDebug DHCSR: C_DEBUGEN Position */ +#define CoreDebug_DHCSR_C_DEBUGEN_Msk (1UL /*<< CoreDebug_DHCSR_C_DEBUGEN_Pos*/) /*!< CoreDebug DHCSR: C_DEBUGEN Mask */ + +/* Debug Core Register Selector Register Definitions */ +#define CoreDebug_DCRSR_REGWnR_Pos 16U /*!< CoreDebug DCRSR: REGWnR Position */ +#define CoreDebug_DCRSR_REGWnR_Msk (1UL << CoreDebug_DCRSR_REGWnR_Pos) /*!< CoreDebug DCRSR: REGWnR Mask */ + +#define CoreDebug_DCRSR_REGSEL_Pos 0U /*!< CoreDebug DCRSR: REGSEL Position */ +#define CoreDebug_DCRSR_REGSEL_Msk (0x1FUL /*<< CoreDebug_DCRSR_REGSEL_Pos*/) /*!< CoreDebug DCRSR: REGSEL Mask */ + +/* Debug Exception and Monitor Control Register Definitions */ +#define CoreDebug_DEMCR_TRCENA_Pos 24U /*!< CoreDebug DEMCR: TRCENA Position */ +#define CoreDebug_DEMCR_TRCENA_Msk (1UL << CoreDebug_DEMCR_TRCENA_Pos) /*!< CoreDebug DEMCR: TRCENA Mask */ + +#define CoreDebug_DEMCR_MON_REQ_Pos 19U /*!< CoreDebug DEMCR: MON_REQ Position */ +#define CoreDebug_DEMCR_MON_REQ_Msk (1UL << CoreDebug_DEMCR_MON_REQ_Pos) /*!< CoreDebug DEMCR: MON_REQ Mask */ + +#define CoreDebug_DEMCR_MON_STEP_Pos 18U /*!< CoreDebug DEMCR: MON_STEP Position */ +#define CoreDebug_DEMCR_MON_STEP_Msk (1UL << CoreDebug_DEMCR_MON_STEP_Pos) /*!< CoreDebug DEMCR: MON_STEP Mask */ + +#define CoreDebug_DEMCR_MON_PEND_Pos 17U /*!< CoreDebug DEMCR: MON_PEND Position */ +#define CoreDebug_DEMCR_MON_PEND_Msk (1UL << CoreDebug_DEMCR_MON_PEND_Pos) /*!< CoreDebug DEMCR: MON_PEND Mask */ + +#define CoreDebug_DEMCR_MON_EN_Pos 16U /*!< CoreDebug DEMCR: MON_EN Position */ +#define CoreDebug_DEMCR_MON_EN_Msk (1UL << CoreDebug_DEMCR_MON_EN_Pos) /*!< CoreDebug DEMCR: MON_EN Mask */ + +#define CoreDebug_DEMCR_VC_HARDERR_Pos 10U /*!< CoreDebug DEMCR: VC_HARDERR Position */ +#define CoreDebug_DEMCR_VC_HARDERR_Msk (1UL << CoreDebug_DEMCR_VC_HARDERR_Pos) /*!< CoreDebug DEMCR: VC_HARDERR Mask */ + +#define CoreDebug_DEMCR_VC_INTERR_Pos 9U /*!< CoreDebug DEMCR: VC_INTERR Position */ +#define CoreDebug_DEMCR_VC_INTERR_Msk (1UL << CoreDebug_DEMCR_VC_INTERR_Pos) /*!< CoreDebug DEMCR: VC_INTERR Mask */ + +#define CoreDebug_DEMCR_VC_BUSERR_Pos 8U /*!< CoreDebug DEMCR: VC_BUSERR Position */ +#define CoreDebug_DEMCR_VC_BUSERR_Msk (1UL << CoreDebug_DEMCR_VC_BUSERR_Pos) /*!< CoreDebug DEMCR: VC_BUSERR Mask */ + +#define CoreDebug_DEMCR_VC_STATERR_Pos 7U /*!< CoreDebug DEMCR: VC_STATERR Position */ +#define CoreDebug_DEMCR_VC_STATERR_Msk (1UL << CoreDebug_DEMCR_VC_STATERR_Pos) /*!< CoreDebug DEMCR: VC_STATERR Mask */ + +#define CoreDebug_DEMCR_VC_CHKERR_Pos 6U /*!< CoreDebug DEMCR: VC_CHKERR Position */ +#define CoreDebug_DEMCR_VC_CHKERR_Msk (1UL << CoreDebug_DEMCR_VC_CHKERR_Pos) /*!< CoreDebug DEMCR: VC_CHKERR Mask */ + +#define CoreDebug_DEMCR_VC_NOCPERR_Pos 5U /*!< CoreDebug DEMCR: VC_NOCPERR Position */ +#define CoreDebug_DEMCR_VC_NOCPERR_Msk (1UL << CoreDebug_DEMCR_VC_NOCPERR_Pos) /*!< CoreDebug DEMCR: VC_NOCPERR Mask */ + +#define CoreDebug_DEMCR_VC_MMERR_Pos 4U /*!< CoreDebug DEMCR: VC_MMERR Position */ +#define CoreDebug_DEMCR_VC_MMERR_Msk (1UL << CoreDebug_DEMCR_VC_MMERR_Pos) /*!< CoreDebug DEMCR: VC_MMERR Mask */ + +#define CoreDebug_DEMCR_VC_CORERESET_Pos 0U /*!< CoreDebug DEMCR: VC_CORERESET Position */ +#define CoreDebug_DEMCR_VC_CORERESET_Msk (1UL /*<< CoreDebug_DEMCR_VC_CORERESET_Pos*/) /*!< CoreDebug DEMCR: VC_CORERESET Mask */ + +/*@} end of group CMSIS_CoreDebug */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_bitfield Core register bit field macros + \brief Macros for use with bit field definitions (xxx_Pos, xxx_Msk). + @{ + */ + +/** + \brief Mask and shift a bit field value for use in a register bit range. + \param[in] field Name of the register bit field. + \param[in] value Value of the bit field. This parameter is interpreted as an uint32_t type. + \return Masked and shifted value. +*/ +#define _VAL2FLD(field, value) (((uint32_t)(value) << field ## _Pos) & field ## _Msk) + +/** + \brief Mask and shift a register value to extract a bit filed value. + \param[in] field Name of the register bit field. + \param[in] value Value of register. This parameter is interpreted as an uint32_t type. + \return Masked and shifted bit field value. +*/ +#define _FLD2VAL(field, value) (((uint32_t)(value) & field ## _Msk) >> field ## _Pos) + +/*@} end of group CMSIS_core_bitfield */ + + +/** + \ingroup CMSIS_core_register + \defgroup CMSIS_core_base Core Definitions + \brief Definitions for base addresses, unions, and structures. + @{ + */ + +/* Memory mapping of Core Hardware */ +#define SCS_BASE (0xE000E000UL) /*!< System Control Space Base Address */ +#define ITM_BASE (0xE0000000UL) /*!< ITM Base Address */ +#define DWT_BASE (0xE0001000UL) /*!< DWT Base Address */ +#define TPI_BASE (0xE0040000UL) /*!< TPI Base Address */ +#define CoreDebug_BASE (0xE000EDF0UL) /*!< Core Debug Base Address */ +#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */ +#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */ +#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */ + +#define SCnSCB ((SCnSCB_Type *) SCS_BASE ) /*!< System control Register not in SCB */ +#define SCB ((SCB_Type *) SCB_BASE ) /*!< SCB configuration struct */ +#define SysTick ((SysTick_Type *) SysTick_BASE ) /*!< SysTick configuration struct */ +#define NVIC ((NVIC_Type *) NVIC_BASE ) /*!< NVIC configuration struct */ +#define ITM ((ITM_Type *) ITM_BASE ) /*!< ITM configuration struct */ +#define DWT ((DWT_Type *) DWT_BASE ) /*!< DWT configuration struct */ +#define TPI ((TPI_Type *) TPI_BASE ) /*!< TPI configuration struct */ +#define CoreDebug ((CoreDebug_Type *) CoreDebug_BASE) /*!< Core Debug configuration struct */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + #define MPU_BASE (SCS_BASE + 0x0D90UL) /*!< Memory Protection Unit */ + #define MPU ((MPU_Type *) MPU_BASE ) /*!< Memory Protection Unit */ +#endif + +#define FPU_BASE (SCS_BASE + 0x0F30UL) /*!< Floating Point Unit */ +#define FPU ((FPU_Type *) FPU_BASE ) /*!< Floating Point Unit */ + +/*@} */ + + + +/******************************************************************************* + * Hardware Abstraction Layer + Core Function Interface contains: + - Core NVIC Functions + - Core SysTick Functions + - Core Debug Functions + - Core Register Access Functions + ******************************************************************************/ +/** + \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference +*/ + + + +/* ########################## NVIC functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_NVICFunctions NVIC Functions + \brief Functions that manage interrupts and exceptions via the NVIC. + @{ + */ + +#ifdef CMSIS_NVIC_VIRTUAL + #ifndef CMSIS_NVIC_VIRTUAL_HEADER_FILE + #define CMSIS_NVIC_VIRTUAL_HEADER_FILE "cmsis_nvic_virtual.h" + #endif + #include CMSIS_NVIC_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetPriorityGrouping __NVIC_SetPriorityGrouping + #define NVIC_GetPriorityGrouping __NVIC_GetPriorityGrouping + #define NVIC_EnableIRQ __NVIC_EnableIRQ + #define NVIC_GetEnableIRQ __NVIC_GetEnableIRQ + #define NVIC_DisableIRQ __NVIC_DisableIRQ + #define NVIC_GetPendingIRQ __NVIC_GetPendingIRQ + #define NVIC_SetPendingIRQ __NVIC_SetPendingIRQ + #define NVIC_ClearPendingIRQ __NVIC_ClearPendingIRQ + #define NVIC_GetActive __NVIC_GetActive + #define NVIC_SetPriority __NVIC_SetPriority + #define NVIC_GetPriority __NVIC_GetPriority + #define NVIC_SystemReset __NVIC_SystemReset +#endif /* CMSIS_NVIC_VIRTUAL */ + +#ifdef CMSIS_VECTAB_VIRTUAL + #ifndef CMSIS_VECTAB_VIRTUAL_HEADER_FILE + #define CMSIS_VECTAB_VIRTUAL_HEADER_FILE "cmsis_vectab_virtual.h" + #endif + #include CMSIS_VECTAB_VIRTUAL_HEADER_FILE +#else + #define NVIC_SetVector __NVIC_SetVector + #define NVIC_GetVector __NVIC_GetVector +#endif /* (CMSIS_VECTAB_VIRTUAL) */ + +#define NVIC_USER_IRQ_OFFSET 16 + + + +/** + \brief Set Priority Grouping + \details Sets the priority grouping field using the required unlock sequence. + The parameter PriorityGroup is assigned to the field SCB->AIRCR [10:8] PRIGROUP field. + Only values from 0..7 are used. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Priority grouping field. + */ +__STATIC_INLINE void __NVIC_SetPriorityGrouping(uint32_t PriorityGroup) +{ + uint32_t reg_value; + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + + reg_value = SCB->AIRCR; /* read old register configuration */ + reg_value &= ~((uint32_t)(SCB_AIRCR_VECTKEY_Msk | SCB_AIRCR_PRIGROUP_Msk)); /* clear bits to change */ + reg_value = (reg_value | + ((uint32_t)0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (PriorityGroupTmp << 8U) ); /* Insert write key and priorty group */ + SCB->AIRCR = reg_value; +} + + +/** + \brief Get Priority Grouping + \details Reads the priority grouping field from the NVIC Interrupt Controller. + \return Priority grouping field (SCB->AIRCR [10:8] PRIGROUP field). + */ +__STATIC_INLINE uint32_t __NVIC_GetPriorityGrouping(void) +{ + return ((uint32_t)((SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) >> SCB_AIRCR_PRIGROUP_Pos)); +} + + +/** + \brief Enable Interrupt + \details Enables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_EnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Interrupt Enable status + \details Returns a device specific interrupt enable status from the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt is not enabled. + \return 1 Interrupt is enabled. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetEnableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISER[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Disable Interrupt + \details Disables a device specific interrupt in the NVIC interrupt controller. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_DisableIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICER[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + __DSB(); + __ISB(); + } +} + + +/** + \brief Get Pending Interrupt + \details Reads the NVIC pending register and returns the pending bit for the specified device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not pending. + \return 1 Interrupt status is pending. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Pending Interrupt + \details Sets the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_SetPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ISPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Clear Pending Interrupt + \details Clears the pending bit of a device specific interrupt in the NVIC pending register. + \param [in] IRQn Device specific interrupt number. + \note IRQn must not be negative. + */ +__STATIC_INLINE void __NVIC_ClearPendingIRQ(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->ICPR[(((uint32_t)(int32_t)IRQn) >> 5UL)] = (uint32_t)(1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL)); + } +} + + +/** + \brief Get Active Interrupt + \details Reads the active register in the NVIC and returns the active bit for the device specific interrupt. + \param [in] IRQn Device specific interrupt number. + \return 0 Interrupt status is not active. + \return 1 Interrupt status is active. + \note IRQn must not be negative. + */ +__STATIC_INLINE uint32_t __NVIC_GetActive(IRQn_Type IRQn) +{ + if ((int32_t)(IRQn) >= 0) + { + return((uint32_t)(((NVIC->IABR[(((uint32_t)(int32_t)IRQn) >> 5UL)] & (1UL << (((uint32_t)(int32_t)IRQn) & 0x1FUL))) != 0UL) ? 1UL : 0UL)); + } + else + { + return(0U); + } +} + + +/** + \brief Set Interrupt Priority + \details Sets the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \param [in] priority Priority to set. + \note The priority cannot be set for every processor exception. + */ +__STATIC_INLINE void __NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority) +{ + if ((int32_t)(IRQn) >= 0) + { + NVIC->IP[((uint32_t)(int32_t)IRQn)] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } + else + { + SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] = (uint8_t)((priority << (8U - __NVIC_PRIO_BITS)) & (uint32_t)0xFFUL); + } +} + + +/** + \brief Get Interrupt Priority + \details Reads the priority of a device specific interrupt or a processor exception. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Interrupt Priority. + Value is aligned automatically to the implemented priority bits of the microcontroller. + */ +__STATIC_INLINE uint32_t __NVIC_GetPriority(IRQn_Type IRQn) +{ + + if ((int32_t)(IRQn) >= 0) + { + return(((uint32_t)NVIC->IP[((uint32_t)(int32_t)IRQn)] >> (8U - __NVIC_PRIO_BITS))); + } + else + { + return(((uint32_t)SCB->SHP[(((uint32_t)(int32_t)IRQn) & 0xFUL)-4UL] >> (8U - __NVIC_PRIO_BITS))); + } +} + + +/** + \brief Encode Priority + \details Encodes the priority for an interrupt with the given priority group, + preemptive priority value, and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS), the smallest possible priority group is set. + \param [in] PriorityGroup Used priority group. + \param [in] PreemptPriority Preemptive priority value (starting from 0). + \param [in] SubPriority Subpriority value (starting from 0). + \return Encoded priority. Value can be used in the function \ref NVIC_SetPriority(). + */ +__STATIC_INLINE uint32_t NVIC_EncodePriority (uint32_t PriorityGroup, uint32_t PreemptPriority, uint32_t SubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + return ( + ((PreemptPriority & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL)) << SubPriorityBits) | + ((SubPriority & (uint32_t)((1UL << (SubPriorityBits )) - 1UL))) + ); +} + + +/** + \brief Decode Priority + \details Decodes an interrupt priority value with a given priority group to + preemptive priority value and subpriority value. + In case of a conflict between priority grouping and available + priority bits (__NVIC_PRIO_BITS) the smallest possible priority group is set. + \param [in] Priority Priority value, which can be retrieved with the function \ref NVIC_GetPriority(). + \param [in] PriorityGroup Used priority group. + \param [out] pPreemptPriority Preemptive priority value (starting from 0). + \param [out] pSubPriority Subpriority value (starting from 0). + */ +__STATIC_INLINE void NVIC_DecodePriority (uint32_t Priority, uint32_t PriorityGroup, uint32_t* const pPreemptPriority, uint32_t* const pSubPriority) +{ + uint32_t PriorityGroupTmp = (PriorityGroup & (uint32_t)0x07UL); /* only values 0..7 are used */ + uint32_t PreemptPriorityBits; + uint32_t SubPriorityBits; + + PreemptPriorityBits = ((7UL - PriorityGroupTmp) > (uint32_t)(__NVIC_PRIO_BITS)) ? (uint32_t)(__NVIC_PRIO_BITS) : (uint32_t)(7UL - PriorityGroupTmp); + SubPriorityBits = ((PriorityGroupTmp + (uint32_t)(__NVIC_PRIO_BITS)) < (uint32_t)7UL) ? (uint32_t)0UL : (uint32_t)((PriorityGroupTmp - 7UL) + (uint32_t)(__NVIC_PRIO_BITS)); + + *pPreemptPriority = (Priority >> SubPriorityBits) & (uint32_t)((1UL << (PreemptPriorityBits)) - 1UL); + *pSubPriority = (Priority ) & (uint32_t)((1UL << (SubPriorityBits )) - 1UL); +} + + +/** + \brief Set Interrupt Vector + \details Sets an interrupt vector in SRAM based interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + VTOR must been relocated to SRAM before. + \param [in] IRQn Interrupt number + \param [in] vector Address of interrupt handler function + */ +__STATIC_INLINE void __NVIC_SetVector(IRQn_Type IRQn, uint32_t vector) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET] = vector; +} + + +/** + \brief Get Interrupt Vector + \details Reads an interrupt vector from interrupt vector table. + The interrupt number can be positive to specify a device specific interrupt, + or negative to specify a processor exception. + \param [in] IRQn Interrupt number. + \return Address of interrupt handler function + */ +__STATIC_INLINE uint32_t __NVIC_GetVector(IRQn_Type IRQn) +{ + uint32_t *vectors = (uint32_t *)SCB->VTOR; + return vectors[(int32_t)IRQn + NVIC_USER_IRQ_OFFSET]; +} + + +/** + \brief System Reset + \details Initiates a system reset request to reset the MCU. + */ +__STATIC_INLINE void __NVIC_SystemReset(void) +{ + __DSB(); /* Ensure all outstanding memory accesses included + buffered write are completed before reset */ + SCB->AIRCR = (uint32_t)((0x5FAUL << SCB_AIRCR_VECTKEY_Pos) | + (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) | + SCB_AIRCR_SYSRESETREQ_Msk ); /* Keep priority group unchanged */ + __DSB(); /* Ensure completion of memory access */ + + for(;;) /* wait until reset */ + { + __NOP(); + } +} + +/*@} end of CMSIS_Core_NVICFunctions */ + +/* ########################## MPU functions #################################### */ + +#if defined (__MPU_PRESENT) && (__MPU_PRESENT == 1U) + +#include "mpu_armv7.h" + +#endif + + +/* ########################## FPU functions #################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_FpuFunctions FPU Functions + \brief Function that provides FPU type. + @{ + */ + +/** + \brief get FPU type + \details returns the FPU type + \returns + - \b 0: No FPU + - \b 1: Single precision FPU + - \b 2: Double + Single precision FPU + */ +__STATIC_INLINE uint32_t SCB_GetFPUType(void) +{ + uint32_t mvfr0; + + mvfr0 = FPU->MVFR0; + if ((mvfr0 & (FPU_MVFR0_Single_precision_Msk | FPU_MVFR0_Double_precision_Msk)) == 0x020U) + { + return 1U; /* Single precision FPU */ + } + else + { + return 0U; /* No FPU */ + } +} + + +/*@} end of CMSIS_Core_FpuFunctions */ + + + +/* ################################## SysTick function ############################################ */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_SysTickFunctions SysTick Functions + \brief Functions that configure the System. + @{ + */ + +#if defined (__Vendor_SysTickConfig) && (__Vendor_SysTickConfig == 0U) + +/** + \brief System Tick Configuration + \details Initializes the System Timer and its interrupt, and starts the System Tick Timer. + Counter is in free running mode to generate periodic interrupts. + \param [in] ticks Number of ticks between two interrupts. + \return 0 Function succeeded. + \return 1 Function failed. + \note When the variable __Vendor_SysTickConfig is set to 1, then the + function SysTick_Config is not included. In this case, the file device.h + must contain a vendor-specific implementation of this function. + */ +__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks) +{ + if ((ticks - 1UL) > SysTick_LOAD_RELOAD_Msk) + { + return (1UL); /* Reload value impossible */ + } + + SysTick->LOAD = (uint32_t)(ticks - 1UL); /* set reload register */ + NVIC_SetPriority (SysTick_IRQn, (1UL << __NVIC_PRIO_BITS) - 1UL); /* set Priority for Systick Interrupt */ + SysTick->VAL = 0UL; /* Load the SysTick Counter Value */ + SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | + SysTick_CTRL_TICKINT_Msk | + SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */ + return (0UL); /* Function successful */ +} + +#endif + +/*@} end of CMSIS_Core_SysTickFunctions */ + + + +/* ##################################### Debug In/Output function ########################################### */ +/** + \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_core_DebugFunctions ITM Functions + \brief Functions that access the ITM debug interface. + @{ + */ + +extern volatile int32_t ITM_RxBuffer; /*!< External variable to receive characters. */ +#define ITM_RXBUFFER_EMPTY ((int32_t)0x5AA55AA5U) /*!< Value identifying \ref ITM_RxBuffer is ready for next character. */ + + +/** + \brief ITM Send Character + \details Transmits a character via the ITM channel 0, and + \li Just returns when no debugger is connected that has booked the output. + \li Is blocking when a debugger is connected, but the previous character sent has not been transmitted. + \param [in] ch Character to transmit. + \returns Character to transmit. + */ +__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch) +{ + if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) && /* ITM enabled */ + ((ITM->TER & 1UL ) != 0UL) ) /* ITM Port #0 enabled */ + { + while (ITM->PORT[0U].u32 == 0UL) + { + __NOP(); + } + ITM->PORT[0U].u8 = (uint8_t)ch; + } + return (ch); +} + + +/** + \brief ITM Receive Character + \details Inputs a character via the external variable \ref ITM_RxBuffer. + \return Received character. + \return -1 No character pending. + */ +__STATIC_INLINE int32_t ITM_ReceiveChar (void) +{ + int32_t ch = -1; /* no character available */ + + if (ITM_RxBuffer != ITM_RXBUFFER_EMPTY) + { + ch = ITM_RxBuffer; + ITM_RxBuffer = ITM_RXBUFFER_EMPTY; /* ready for next character */ + } + + return (ch); +} + + +/** + \brief ITM Check Character + \details Checks whether a character is pending for reading in the variable \ref ITM_RxBuffer. + \return 0 No character available. + \return 1 Character available. + */ +__STATIC_INLINE int32_t ITM_CheckChar (void) +{ + + if (ITM_RxBuffer == ITM_RXBUFFER_EMPTY) + { + return (0); /* no character available */ + } + else + { + return (1); /* character available */ + } +} + +/*@} end of CMSIS_core_DebugFunctions */ + + + + +#ifdef __cplusplus +} +#endif + +#endif /* __CORE_CM4_H_DEPENDANT */ + +#endif /* __CMSIS_GENERIC */ diff --git a/include/core_cm4_simd.h b/include/core_cm4_simd.h new file mode 100644 index 0000000..c1678b9 --- /dev/null +++ b/include/core_cm4_simd.h @@ -0,0 +1,650 @@ +/**************************************************************************//** + * @file core_cm4_simd.h + * @brief CMSIS Cortex-M4 SIMD Header File + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2010-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef __CORE_CM4_SIMD_H +#define __CORE_CM4_SIMD_H + + +/******************************************************************************* + * Hardware Abstraction Layer + ******************************************************************************/ + + +/* ################### Compiler specific Intrinsics ########################### */ +/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics + Access to dedicated SIMD instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ +#define __SADD8 __sadd8 +#define __QADD8 __qadd8 +#define __SHADD8 __shadd8 +#define __UADD8 __uadd8 +#define __UQADD8 __uqadd8 +#define __UHADD8 __uhadd8 +#define __SSUB8 __ssub8 +#define __QSUB8 __qsub8 +#define __SHSUB8 __shsub8 +#define __USUB8 __usub8 +#define __UQSUB8 __uqsub8 +#define __UHSUB8 __uhsub8 +#define __SADD16 __sadd16 +#define __QADD16 __qadd16 +#define __SHADD16 __shadd16 +#define __UADD16 __uadd16 +#define __UQADD16 __uqadd16 +#define __UHADD16 __uhadd16 +#define __SSUB16 __ssub16 +#define __QSUB16 __qsub16 +#define __SHSUB16 __shsub16 +#define __USUB16 __usub16 +#define __UQSUB16 __uqsub16 +#define __UHSUB16 __uhsub16 +#define __SASX __sasx +#define __QASX __qasx +#define __SHASX __shasx +#define __UASX __uasx +#define __UQASX __uqasx +#define __UHASX __uhasx +#define __SSAX __ssax +#define __QSAX __qsax +#define __SHSAX __shsax +#define __USAX __usax +#define __UQSAX __uqsax +#define __UHSAX __uhsax +#define __USAD8 __usad8 +#define __USADA8 __usada8 +#define __SSAT16 __ssat16 +#define __USAT16 __usat16 +#define __UXTB16 __uxtb16 +#define __UXTAB16 __uxtab16 +#define __SXTB16 __sxtb16 +#define __SXTAB16 __sxtab16 +#define __SMUAD __smuad +#define __SMUADX __smuadx +#define __SMLAD __smlad +#define __SMLADX __smladx +#define __SMLALD __smlald +#define __SMLALDX __smlaldx +#define __SMUSD __smusd +#define __SMUSDX __smusdx +#define __SMLSD __smlsd +#define __SMLSDX __smlsdx +#define __SMLSLD __smlsld +#define __SMLSLDX __smlsldx +#define __SEL __sel +#define __QADD __qadd +#define __QSUB __qsub + +#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ + ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) + +#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ + ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) + + +/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ +#include + +/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ + + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ +#include + +/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ + + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHADD16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhadd16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSUB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsub16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHASX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhasx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("ssax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("shsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UQSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uqsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UHSAX(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uhsax %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USAD8(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("usad8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __USADA8(uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("usada8 %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SSAT16(ARG1,ARG2) \ + ({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ +}) + +#define __USAT16(ARG1,ARG2) \ + ({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat16 %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ +}) + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("uxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __UXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("uxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTB16(uint32_t op1) +{ + uint32_t result; + + __ASM volatile ("sxtb16 %0, %1" : "=r" (result) : "r" (op1)); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SXTAB16(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sxtab16 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUAD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuad %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUADX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smuadx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLAD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlad %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLADX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smladx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SMLALD(ARG1,ARG2,ARG3) \ + ({ \ + uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ + __ASM volatile ("smlald %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ + (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ +}) + +#define __SMLALDX(ARG1,ARG2,ARG3) \ + ({ \ + uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((uint64_t)(ARG3) >> 32), __ARG3_L = (uint32_t)((uint64_t)(ARG3) & 0xFFFFFFFFUL); \ + __ASM volatile ("smlaldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ + (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ +}) + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSD (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMUSDX (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("smusdx %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSD (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsd %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SMLSDX (uint32_t op1, uint32_t op2, uint32_t op3) +{ + uint32_t result; + + __ASM volatile ("smlsdx %0, %1, %2, %3" : "=r" (result) : "r" (op1), "r" (op2), "r" (op3) ); + return(result); +} + +#define __SMLSLD(ARG1,ARG2,ARG3) \ + ({ \ + uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ + __ASM volatile ("smlsld %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ + (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ +}) + +#define __SMLSLDX(ARG1,ARG2,ARG3) \ + ({ \ + uint32_t __ARG1 = (ARG1), __ARG2 = (ARG2), __ARG3_H = (uint32_t)((ARG3) >> 32), __ARG3_L = (uint32_t)((ARG3) & 0xFFFFFFFFUL); \ + __ASM volatile ("smlsldx %0, %1, %2, %3" : "=r" (__ARG3_L), "=r" (__ARG3_H) : "r" (__ARG1), "r" (__ARG2), "0" (__ARG3_L), "1" (__ARG3_H) ); \ + (uint64_t)(((uint64_t)__ARG3_H << 32) | __ARG3_L); \ +}) + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __SEL (uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("sel %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QADD(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qadd %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __QSUB(uint32_t op1, uint32_t op2) +{ + uint32_t result; + + __ASM volatile ("qsub %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); + return(result); +} + +#define __PKHBT(ARG1,ARG2,ARG3) \ + ({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + __ASM ("pkhbt %0, %1, %2, lsl %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ +}) + +#define __PKHTB(ARG1,ARG2,ARG3) \ + ({ \ + uint32_t __RES, __ARG1 = (ARG1), __ARG2 = (ARG2); \ + if (ARG3 == 0) \ + __ASM ("pkhtb %0, %1, %2" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2) ); \ + else \ + __ASM ("pkhtb %0, %1, %2, asr %3" : "=r" (__RES) : "r" (__ARG1), "r" (__ARG2), "I" (ARG3) ); \ + __RES; \ +}) + +/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + + +/*------ CM4 SIMD Intrinsics -----------------------------------------------------*/ +/* not yet supported */ +/*-- End CM4 SIMD Intrinsics -----------------------------------------------------*/ + + +#endif + +/*@} end of group CMSIS_SIMD_intrinsics */ + + +#endif /* __CORE_CM4_SIMD_H */ + +#ifdef __cplusplus +} +#endif + diff --git a/include/core_cmFunc.h b/include/core_cmFunc.h new file mode 100644 index 0000000..8b77c85 --- /dev/null +++ b/include/core_cmFunc.h @@ -0,0 +1,617 @@ +/**************************************************************************//** + * @file core_cmFunc.h + * @brief CMSIS Cortex-M Core Function Access Header File + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2009-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMFUNC_H +#define __CORE_CMFUNC_H + + +/* ########################### Core Function Access ########################### */ +/** \ingroup CMSIS_Core_FunctionInterface + \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions + @{ + */ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) +#error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + +/* intrinsic void __enable_irq(); */ +/* intrinsic void __disable_irq(); */ + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__STATIC_INLINE uint32_t __get_CONTROL(void) +{ + register uint32_t __regControl __ASM("control"); + return(__regControl); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + register uint32_t __regControl __ASM("control"); + __regControl = control; +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__STATIC_INLINE uint32_t __get_IPSR(void) +{ + register uint32_t __regIPSR __ASM("ipsr"); + return(__regIPSR); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__STATIC_INLINE uint32_t __get_APSR(void) +{ + register uint32_t __regAPSR __ASM("apsr"); + return(__regAPSR); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__STATIC_INLINE uint32_t __get_xPSR(void) +{ + register uint32_t __regXPSR __ASM("xpsr"); + return(__regXPSR); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + return(__regProcessStackPointer); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + register uint32_t __regProcessStackPointer __ASM("psp"); + __regProcessStackPointer = topOfProcStack; +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + return(__regMainStackPointer); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + register uint32_t __regMainStackPointer __ASM("msp"); + __regMainStackPointer = topOfMainStack; +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + register uint32_t __regPriMask __ASM("primask"); + return(__regPriMask); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + register uint32_t __regPriMask __ASM("primask"); + __regPriMask = (priMask); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __enable_fault_irq __enable_fiq + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +#define __disable_fault_irq __disable_fiq + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + register uint32_t __regBasePri __ASM("basepri"); + return(__regBasePri); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__STATIC_INLINE void __set_BASEPRI(uint32_t basePri) +{ + register uint32_t __regBasePri __ASM("basepri"); + __regBasePri = (basePri & 0xff); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + return(__regFaultMask); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + register uint32_t __regFaultMask __ASM("faultmask"); + __regFaultMask = (faultMask & (uint32_t)1); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + return(__regfpscr); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + register uint32_t __regfpscr __ASM("fpscr"); + __regfpscr = (fpscr); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief Enable IRQ Interrupts + + This function enables IRQ interrupts by clearing the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void) +{ + __ASM volatile ("cpsie i"); +} + + +/** \brief Disable IRQ Interrupts + + This function disables IRQ interrupts by setting the I-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void) +{ + __ASM volatile ("cpsid i"); +} + + +/** \brief Get Control Register + + This function returns the content of the Control Register. + + \return Control Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, control" : "=r" (result) ); + return(result); +} + + +/** \brief Set Control Register + + This function writes the given value to the Control Register. + + \param [in] control Control Register value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control) +{ + __ASM volatile ("MSR control, %0" : : "r" (control) ); +} + + +/** \brief Get IPSR Register + + This function returns the content of the IPSR Register. + + \return IPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get APSR Register + + This function returns the content of the APSR Register. + + \return APSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, apsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get xPSR Register + + This function returns the content of the xPSR Register. + + \return xPSR Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); + return(result); +} + + +/** \brief Get Process Stack Pointer + + This function returns the current value of the Process Stack Pointer (PSP). + + \return PSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, psp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Process Stack Pointer + + This function assigns the given value to the Process Stack Pointer (PSP). + + \param [in] topOfProcStack Process Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack) +{ + __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) ); +} + + +/** \brief Get Main Stack Pointer + + This function returns the current value of the Main Stack Pointer (MSP). + + \return MSP Register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void) +{ + register uint32_t result; + + __ASM volatile ("MRS %0, msp\n" : "=r" (result) ); + return(result); +} + + +/** \brief Set Main Stack Pointer + + This function assigns the given value to the Main Stack Pointer (MSP). + + \param [in] topOfMainStack Main Stack Pointer value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack) +{ + __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) ); +} + + +/** \brief Get Priority Mask + + This function returns the current state of the priority mask bit from the Priority Mask Register. + + \return Priority Mask value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, primask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Priority Mask + + This function assigns the given value to the Priority Mask Register. + + \param [in] priMask Priority Mask + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask) +{ + __ASM volatile ("MSR primask, %0" : : "r" (priMask) ); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Enable FIQ + + This function enables FIQ interrupts by clearing the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void) +{ + __ASM volatile ("cpsie f"); +} + + +/** \brief Disable FIQ + + This function disables FIQ interrupts by setting the F-bit in the CPSR. + Can only be executed in Privileged modes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void) +{ + __ASM volatile ("cpsid f"); +} + + +/** \brief Get Base Priority + + This function returns the current value of the Base Priority register. + + \return Base Priority register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, basepri_max" : "=r" (result) ); + return(result); +} + + +/** \brief Set Base Priority + + This function assigns the given value to the Base Priority register. + + \param [in] basePri Base Priority value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value) +{ + __ASM volatile ("MSR basepri, %0" : : "r" (value) ); +} + + +/** \brief Get Fault Mask + + This function returns the current value of the Fault Mask register. + + \return Fault Mask register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void) +{ + uint32_t result; + + __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); + return(result); +} + + +/** \brief Set Fault Mask + + This function assigns the given value to the Fault Mask register. + + \param [in] faultMask Fault Mask value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask) +{ + __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) ); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + +#if (__CORTEX_M == 0x04) + +/** \brief Get FPSCR + + This function returns the current value of the Floating Point Status/Control register. + + \return Floating Point Status/Control register value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + uint32_t result; + + __ASM volatile ("VMRS %0, fpscr" : "=r" (result) ); + return(result); +#else + return(0); +#endif +} + + +/** \brief Set FPSCR + + This function assigns the given value to the Floating Point Status/Control register. + + \param [in] fpscr Floating Point Status/Control value to set + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr) +{ +#if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) ); +#endif +} + +#endif /* (__CORTEX_M == 0x04) */ + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all instrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@} end of CMSIS_Core_RegAccFunctions */ + + +#endif /* __CORE_CMFUNC_H */ + diff --git a/include/core_cmInstr.h b/include/core_cmInstr.h new file mode 100644 index 0000000..e5fd9a8 --- /dev/null +++ b/include/core_cmInstr.h @@ -0,0 +1,619 @@ +/**************************************************************************//** + * @file core_cmInstr.h + * @brief CMSIS Cortex-M Core Instruction Access Header File + * @version V3.01 + * @date 06. March 2012 + * + * @note + * Copyright (C) 2009-2012 ARM Limited. All rights reserved. + * + * @par + * ARM Limited (ARM) is supplying this software for use with Cortex-M + * processor based microcontrollers. This file can be freely distributed + * within development tools that are supporting such ARM based processors. + * + * @par + * THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED + * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. + * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR + * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER. + * + ******************************************************************************/ + +#ifndef __CORE_CMINSTR_H +#define __CORE_CMINSTR_H + + +/* ########################## Core Instruction Access ######################### */ +/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface + Access to dedicated instructions + @{ +*/ + +#if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ +/* ARM armcc specific functions */ + +#if (__ARMCC_VERSION < 400677) +#error "Please use ARM Compiler Toolchain V4.0.677 or later!" +#endif + + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +#define __NOP __nop + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +#define __WFI __wfi + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +#define __WFE __wfe + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +#define __SEV __sev + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +#define __ISB() __isb(0xF) + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +#define __DSB() __dsb(0xF) + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +#define __DMB() __dmb(0xF) + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __REV __rev + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value) +{ + rev16 r0, r0 + bx lr +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value) +{ + revsh r0, r0 + bx lr +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +#define __ROR __ror + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +#define __RBIT __rbit + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +#define __LDREXB(ptr) ((uint8_t ) __ldrex(ptr)) + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +#define __LDREXH(ptr) ((uint16_t) __ldrex(ptr)) + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +#define __LDREXW(ptr) ((uint32_t ) __ldrex(ptr)) + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXB(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXH(value, ptr) __strex(value, ptr) + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +#define __STREXW(value, ptr) __strex(value, ptr) + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +#define __CLREX __clrex + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT __ssat + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT __usat + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +#define __CLZ __clz + +#endif /* (__CORTEX_M >= 0x03) */ + + + +#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/ +/* IAR iccarm specific functions */ + +#include + + +#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/ +/* TI CCS specific functions */ + +#include + + +#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/ +/* GNU gcc specific functions */ + +/** \brief No Operation + + No Operation does nothing. This instruction can be used for code alignment purposes. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void) +{ + __ASM volatile ("nop"); +} + + +/** \brief Wait For Interrupt + + Wait For Interrupt is a hint instruction that suspends execution + until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void) +{ + __ASM volatile ("wfi"); +} + + +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void) +{ + __ASM volatile ("wfe"); +} + + +/** \brief Send Event + + Send Event is a hint instruction. It causes an event to be signaled to the CPU. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void) +{ + __ASM volatile ("sev"); +} + + +/** \brief Instruction Synchronization Barrier + + Instruction Synchronization Barrier flushes the pipeline in the processor, + so that all instructions following the ISB are fetched from cache or + memory, after the instruction has been completed. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void) +{ + __ASM volatile ("isb"); +} + + +/** \brief Data Synchronization Barrier + + This function acts as a special kind of Data Memory Barrier. + It completes when all explicit memory accesses before this instruction complete. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void) +{ + __ASM volatile ("dsb"); +} + + +/** \brief Data Memory Barrier + + This function ensures the apparent order of the explicit memory operations before + and after the instruction, without ensuring their completion. + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void) +{ + __ASM volatile ("dmb"); +} + + +/** \brief Reverse byte order (32 bit) + + This function reverses the byte order in integer value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order (16 bit) + + This function reverses the byte order in two unsigned short values. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rev16 %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Reverse byte order in signed short value + + This function reverses the byte order in a signed short value with sign extension to integer. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value) +{ + uint32_t result; + + __ASM volatile ("revsh %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief Rotate Right in unsigned value (32 bit) + + This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. + + \param [in] value Value to rotate + \param [in] value Number of Bits to rotate + \return Rotated value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2) +{ + + __ASM volatile ("ror %0, %0, %1" : "+r" (op1) : "r" (op2) ); + return(op1); +} + + +#if (__CORTEX_M >= 0x03) + +/** \brief Reverse bit order of value + + This function reverses the bit order of the given value. + + \param [in] value Value to reverse + \return Reversed value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value) +{ + uint32_t result; + + __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + + +/** \brief LDR Exclusive (8 bit) + + This function performs a exclusive LDR command for 8 bit value. + + \param [in] ptr Pointer to data + \return value of type uint8_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr) +{ + uint8_t result; + + __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (16 bit) + + This function performs a exclusive LDR command for 16 bit values. + + \param [in] ptr Pointer to data + \return value of type uint16_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr) +{ + uint16_t result; + + __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief LDR Exclusive (32 bit) + + This function performs a exclusive LDR command for 32 bit values. + + \param [in] ptr Pointer to data + \return value of type uint32_t at (*ptr) + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("ldrex %0, [%1]" : "=r" (result) : "r" (addr) ); + return(result); +} + + +/** \brief STR Exclusive (8 bit) + + This function performs a exclusive STR command for 8 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (16 bit) + + This function performs a exclusive STR command for 16 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr) +{ + uint32_t result; + + __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief STR Exclusive (32 bit) + + This function performs a exclusive STR command for 32 bit values. + + \param [in] value Value to store + \param [in] ptr Pointer to location + \return 0 Function succeeded + \return 1 Function failed + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) +{ + uint32_t result; + + __ASM volatile ("strex %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) ); + return(result); +} + + +/** \brief Remove the exclusive lock + + This function removes the exclusive lock which is created by LDREX. + + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void) +{ + __ASM volatile ("clrex"); +} + + +/** \brief Signed Saturate + + This function saturates a signed value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (1..32) + \return Saturated value + */ +#define __SSAT(ARG1,ARG2) \ + ({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("ssat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Unsigned Saturate + + This function saturates an unsigned value. + + \param [in] value Value to be saturated + \param [in] sat Bit position to saturate to (0..31) + \return Saturated value + */ +#define __USAT(ARG1,ARG2) \ + ({ \ + uint32_t __RES, __ARG1 = (ARG1); \ + __ASM ("usat %0, %1, %2" : "=r" (__RES) : "I" (ARG2), "r" (__ARG1) ); \ + __RES; \ + }) + + +/** \brief Count leading zeros + + This function counts the number of leading zeros of a data value. + + \param [in] value Value to count the leading zeros + \return number of leading zeros in value + */ +__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value) +{ + uint8_t result; + + __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) ); + return(result); +} + +#endif /* (__CORTEX_M >= 0x03) */ + + + + +#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/ +/* TASKING carm specific functions */ + +/* + * The CMSIS functions have been implemented as intrinsics in the compiler. + * Please use "carm -?i" to get an up to date list of all intrinsics, + * Including the CMSIS ones. + */ + +#endif + +/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ + +#endif /* __CORE_CMINSTR_H */ + diff --git a/include/mpu_armv7.h b/include/mpu_armv7.h new file mode 100644 index 0000000..49b86ab --- /dev/null +++ b/include/mpu_armv7.h @@ -0,0 +1,204 @@ +/****************************************************************************** + * @file mpu_armv7.h + * @brief CMSIS MPU API for ARMv7 MPU + * @version V5.0.3 + * @date 09. August 2017 + ******************************************************************************/ +/* + * Copyright (c) 2017 ARM Limited. All rights reserved. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the License); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * www.apache.org/licenses/LICENSE-2.0 + * + * 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. + */ + +#if defined ( __ICCARM__ ) + #pragma system_include /* treat file as system include file for MISRA check */ +#elif defined (__clang__) + #pragma clang system_header /* treat file as system include file */ +#endif + +#ifndef ARM_MPU_ARMV7_H +#define ARM_MPU_ARMV7_H + +#define ARM_MPU_REGION_SIZE_32B ((uint8_t)0x04U) +#define ARM_MPU_REGION_SIZE_64B ((uint8_t)0x05U) +#define ARM_MPU_REGION_SIZE_128B ((uint8_t)0x06U) +#define ARM_MPU_REGION_SIZE_256B ((uint8_t)0x07U) +#define ARM_MPU_REGION_SIZE_512B ((uint8_t)0x08U) +#define ARM_MPU_REGION_SIZE_1KB ((uint8_t)0x09U) +#define ARM_MPU_REGION_SIZE_2KB ((uint8_t)0x0AU) +#define ARM_MPU_REGION_SIZE_4KB ((uint8_t)0x0BU) +#define ARM_MPU_REGION_SIZE_8KB ((uint8_t)0x0CU) +#define ARM_MPU_REGION_SIZE_16KB ((uint8_t)0x0DU) +#define ARM_MPU_REGION_SIZE_32KB ((uint8_t)0x0EU) +#define ARM_MPU_REGION_SIZE_64KB ((uint8_t)0x0FU) +#define ARM_MPU_REGION_SIZE_128KB ((uint8_t)0x10U) +#define ARM_MPU_REGION_SIZE_256KB ((uint8_t)0x11U) +#define ARM_MPU_REGION_SIZE_512KB ((uint8_t)0x12U) +#define ARM_MPU_REGION_SIZE_1MB ((uint8_t)0x13U) +#define ARM_MPU_REGION_SIZE_2MB ((uint8_t)0x14U) +#define ARM_MPU_REGION_SIZE_4MB ((uint8_t)0x15U) +#define ARM_MPU_REGION_SIZE_8MB ((uint8_t)0x16U) +#define ARM_MPU_REGION_SIZE_16MB ((uint8_t)0x17U) +#define ARM_MPU_REGION_SIZE_32MB ((uint8_t)0x18U) +#define ARM_MPU_REGION_SIZE_64MB ((uint8_t)0x19U) +#define ARM_MPU_REGION_SIZE_128MB ((uint8_t)0x1AU) +#define ARM_MPU_REGION_SIZE_256MB ((uint8_t)0x1BU) +#define ARM_MPU_REGION_SIZE_512MB ((uint8_t)0x1CU) +#define ARM_MPU_REGION_SIZE_1GB ((uint8_t)0x1DU) +#define ARM_MPU_REGION_SIZE_2GB ((uint8_t)0x1EU) +#define ARM_MPU_REGION_SIZE_4GB ((uint8_t)0x1FU) + +#define ARM_MPU_AP_NONE 0U +#define ARM_MPU_AP_PRIV 1U +#define ARM_MPU_AP_URO 2U +#define ARM_MPU_AP_FULL 3U +#define ARM_MPU_AP_PRO 5U +#define ARM_MPU_AP_RO 6U + +/** MPU Region Base Address Register Value +* +* \param Region The region to be configured, number 0 to 15. +* \param BaseAddress The base address for the region. +*/ +#define ARM_MPU_RBAR(Region, BaseAddress) \ + (((BaseAddress) & MPU_RBAR_ADDR_Msk) | \ + ((Region) & MPU_RBAR_REGION_Msk) | \ + (MPU_RBAR_VALID_Msk)) + +/** +* MPU Region Attribut and Size Register Value +* +* \param DisableExec Instruction access disable bit, 1= disable instruction fetches. +* \param AccessPermission Data access permissions, allows you to configure read/write access for User and Privileged mode. +* \param TypeExtField Type extension field, allows you to configure memory access type, for example strongly ordered, peripheral. +* \param IsShareable Region is shareable between multiple bus masters. +* \param IsCacheable Region is cacheable, i.e. its value may be kept in cache. +* \param IsBufferable Region is bufferable, i.e. using write-back caching. Cacheable but non-bufferable regions use write-through policy. +* \param SubRegionDisable Sub-region disable field. +* \param Size Region size of the region to be configured, for example 4K, 8K. +*/ +#define ARM_MPU_RASR(DisableExec, AccessPermission, TypeExtField, IsShareable, IsCacheable, IsBufferable, SubRegionDisable, Size) \ + ((((DisableExec ) << MPU_RASR_XN_Pos) & MPU_RASR_XN_Msk) | \ + (((AccessPermission) << MPU_RASR_AP_Pos) & MPU_RASR_AP_Msk) | \ + (((TypeExtField ) << MPU_RASR_TEX_Pos) & MPU_RASR_TEX_Msk) | \ + (((IsShareable ) << MPU_RASR_S_Pos) & MPU_RASR_S_Msk) | \ + (((IsCacheable ) << MPU_RASR_C_Pos) & MPU_RASR_C_Msk) | \ + (((IsBufferable ) << MPU_RASR_B_Pos) & MPU_RASR_B_Msk) | \ + (((SubRegionDisable) << MPU_RASR_SRD_Pos) & MPU_RASR_SRD_Msk) | \ + (((Size ) << MPU_RASR_SIZE_Pos) & MPU_RASR_SIZE_Msk) | \ + (MPU_RASR_ENABLE_Msk)) + + +/** +* Struct for a single MPU Region +*/ +#if defined (__CMCPPARM__) +typedef struct { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; +#else +typedef struct _ARM_MPU_Region_t { + uint32_t RBAR; //!< The region base address register value (RBAR) + uint32_t RASR; //!< The region attribute and size register value (RASR) \ref MPU_RASR +} ARM_MPU_Region_t; +#endif + +/** Enable the MPU. +* \param MPU_Control Default access permissions for unconfigured regions. +*/ +__STATIC_INLINE void ARM_MPU_Enable(uint32_t MPU_Control) +{ + __DSB(); + __ISB(); + MPU->CTRL = MPU_Control | MPU_CTRL_ENABLE_Msk; +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk; +#endif +} + +/** Disable the MPU. +*/ +__STATIC_INLINE void ARM_MPU_Disable(void) +{ + __DSB(); + __ISB(); +#ifdef SCB_SHCSR_MEMFAULTENA_Msk + SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk; +#endif + MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; +} + +/** Clear and disable the given MPU region. +* \param rnr Region number to be cleared. +*/ +__STATIC_INLINE void ARM_MPU_ClrRegion(uint32_t rnr) +{ + MPU->RNR = rnr; + MPU->RASR = 0U; +} + +/** Configure an MPU region. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegion(uint32_t rbar, uint32_t rasr) +{ + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Configure the given MPU region. +* \param rnr Region number to be configured. +* \param rbar Value for RBAR register. +* \param rsar Value for RSAR register. +*/ +__STATIC_INLINE void ARM_MPU_SetRegionEx(uint32_t rnr, uint32_t rbar, uint32_t rasr) +{ + MPU->RNR = rnr; + MPU->RBAR = rbar; + MPU->RASR = rasr; +} + +/** Memcopy with strictly ordered memory access, e.g. for register targets. +* \param dst Destination data is copied to. +* \param src Source data is copied from. +* \param len Amount of data words to be copied. +*/ +__STATIC_INLINE void orderedCpy(volatile uint32_t* dst, const uint32_t* __RESTRICT src, uint32_t len) +{ + uint32_t i; + for (i = 0U; i < len; ++i) + { + dst[i] = src[i]; + } +} + +/** Load the given number of MPU regions from a table. +* \param table Pointer to the MPU configuration table. +* \param cnt Amount of regions to be configured. +*/ +__STATIC_INLINE void ARM_MPU_Load(ARM_MPU_Region_t const* table, uint32_t cnt) +{ + const uint32_t rowWordSize = sizeof(ARM_MPU_Region_t)/4U; + while (cnt > MPU_TYPE_RALIASES) { + orderedCpy(&(MPU->RBAR), &(table->RBAR), MPU_TYPE_RALIASES*rowWordSize); + table += MPU_TYPE_RALIASES; + cnt -= MPU_TYPE_RALIASES; + } + orderedCpy(&(MPU->RBAR), &(table->RBAR), cnt*rowWordSize); +} + +#endif diff --git a/include/startup.h b/include/startup.h new file mode 100644 index 0000000..5c25076 --- /dev/null +++ b/include/startup.h @@ -0,0 +1,685 @@ +/*! + Copyright 2018 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file startup.h + \brief Заголовочный файл с векторами прерываний + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 04/09/2018 + + */ + + +#ifndef ASM_STARTUP_H_ +#define ASM_STARTUP_H_ + +#include "K1921VK028.h" +#include "core_cm4.h" + +typedef unsigned char Uint8; +typedef unsigned short int Uint16; +typedef unsigned int Uint32; + +// Символы из линкера +extern int _estack; +int main (void); + +// Дефолтный обработчик +void defaultISRhandler (void) { + while(1){}; +}; + +// Функции прерываний, объявленные как "weak" +//void _estack(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void Reset_Handler(void) __attribute__((naked)); +void NMI_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void HardFault_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void MemManage_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void BusFault_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UsageFault_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +//void 0(void) __attribute__ ((weak, alias("defaultISRhandler"))); +//void 0(void) __attribute__ ((weak, alias("defaultISRhandler"))); +//void 0(void) __attribute__ ((weak, alias("defaultISRhandler"))); +//void 0(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SVC_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DebugMon_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +//void 0(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PendSV_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SysTick_Handler(void) __attribute__ ((weak, alias("defaultISRhandler"))); +void WDT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void RCU_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void RTC_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void MFLASH_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void BFLASH_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOA_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOB_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOC_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOE_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOF_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOG_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOH_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOJ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOK_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOL_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void GPIOM_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH4_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH5_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH6_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH7_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH8_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH9_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH10_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH11_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH12_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH13_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH14_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH15_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH16_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH17_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH18_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH19_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH20_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH21_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH22_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH23_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH24_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH25_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH26_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH27_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH28_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH29_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH30_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void DMA_CH31_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TMR0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TMR1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TMR2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TMR3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ETMR0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ETMR1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ETMR2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ETMR3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_TD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_MS_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_E_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_TD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_MS_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_E_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_TD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_MS_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_E_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_TD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_MS_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_E_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void UART3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART0_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART0_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART0_RO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART0_TO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART1_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART1_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART1_RO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART1_TO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TUART1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI0_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI0_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI0_RO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI0_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI1_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI1_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI1_RO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI1_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI2_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI2_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI2_RO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI2_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI3_RX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI3_TX_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI3_RO_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPI3_RT_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void I2C0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void I2C1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPWR0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SPWR1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void MILSTD0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void MILSTD1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ECAP0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ECAP1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ECAP2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ECAP3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ECAP4_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ECAP5_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM0_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM0_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM1_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM1_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM2_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM2_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM3_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM3_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM4_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM4_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM4_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM5_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM5_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM5_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM6_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM6_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM6_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM7_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM7_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM7_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM8_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM8_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM8_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM9_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM9_HD_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void PWM9_TZ_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void QEP0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void QEP1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void QEP2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void QEP3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ4_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ5_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ6_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_SEQ7_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ADC_DC_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void ETH_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN2_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN3_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN4_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN5_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN6_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN7_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN8_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN9_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN10_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN11_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN12_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN13_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN14_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void CAN15_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void FPU_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void TMU_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void LAU_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void SDFM_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void OWI0_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); +void OWI1_IRQHandler (void) __attribute__ ((weak, alias("defaultISRhandler"))); + + +struct SisrVectors; +typedef volatile struct SisrVectors TisrVectors; + +struct SisrVectors { + void (*_estack)(void); + void (*Reset_Handler)(void); + void (*NMI_Handler)(void); + void (*HardFault_Handler)(void); + void (*MemManage_Handler)(void); + void (*BusFault_Handler)(void); + void (*UsageFault_Handler)(void); + void (*reserved1)(void); + void (*reserved2)(void); + void (*reserved3)(void); + void (*reserved4)(void); + void (*SVC_Handler)(void); + void (*DebugMon_Handler)(void); + void (*reserved5)(void); + void (*PendSV_Handler)(void); + void (*SysTick_Handler)(void); + void (*WDT_IRQHandler)(void); + void (*RCU_IRQHandler)(void); + void (*RTC_IRQHandler)(void); + void (*MFLASH_IRQHandler)(void); + void (*BFLASH_IRQHandler)(void); + void (*GPIOA_IRQHandler)(void); + void (*GPIOB_IRQHandler)(void); + void (*GPIOC_IRQHandler)(void); + void (*GPIOD_IRQHandler)(void); + void (*GPIOE_IRQHandler)(void); + void (*GPIOF_IRQHandler)(void); + void (*GPIOG_IRQHandler)(void); + void (*GPIOH_IRQHandler)(void); + void (*GPIOJ_IRQHandler)(void); + void (*GPIOK_IRQHandler)(void); + void (*GPIOL_IRQHandler)(void); + void (*GPIOM_IRQHandler)(void); + void (*DMA_CH0_IRQHandler)(void); + void (*DMA_CH1_IRQHandler)(void); + void (*DMA_CH2_IRQHandler)(void); + void (*DMA_CH3_IRQHandler)(void); + void (*DMA_CH4_IRQHandler)(void); + void (*DMA_CH5_IRQHandler)(void); + void (*DMA_CH6_IRQHandler)(void); + void (*DMA_CH7_IRQHandler)(void); + void (*DMA_CH8_IRQHandler)(void); + void (*DMA_CH9_IRQHandler)(void); + void (*DMA_CH10_IRQHandler)(void); + void (*DMA_CH11_IRQHandler)(void); + void (*DMA_CH12_IRQHandler)(void); + void (*DMA_CH13_IRQHandler)(void); + void (*DMA_CH14_IRQHandler)(void); + void (*DMA_CH15_IRQHandler)(void); + void (*DMA_CH16_IRQHandler)(void); + void (*DMA_CH17_IRQHandler)(void); + void (*DMA_CH18_IRQHandler)(void); + void (*DMA_CH19_IRQHandler)(void); + void (*DMA_CH20_IRQHandler)(void); + void (*DMA_CH21_IRQHandler)(void); + void (*DMA_CH22_IRQHandler)(void); + void (*DMA_CH23_IRQHandler)(void); + void (*DMA_CH24_IRQHandler)(void); + void (*DMA_CH25_IRQHandler)(void); + void (*DMA_CH26_IRQHandler)(void); + void (*DMA_CH27_IRQHandler)(void); + void (*DMA_CH28_IRQHandler)(void); + void (*DMA_CH29_IRQHandler)(void); + void (*DMA_CH30_IRQHandler)(void); + void (*DMA_CH31_IRQHandler)(void); + void (*TMR0_IRQHandler)(void); + void (*TMR1_IRQHandler)(void); + void (*TMR2_IRQHandler)(void); + void (*TMR3_IRQHandler)(void); + void (*ETMR0_IRQHandler)(void); + void (*ETMR1_IRQHandler)(void); + void (*ETMR2_IRQHandler)(void); + void (*ETMR3_IRQHandler)(void); + void (*UART0_TD_IRQHandler)(void); + void (*UART0_MS_IRQHandler)(void); + void (*UART0_RX_IRQHandler)(void); + void (*UART0_TX_IRQHandler)(void); + void (*UART0_RT_IRQHandler)(void); + void (*UART0_E_IRQHandler)(void); + void (*UART0_IRQHandler)(void); + void (*UART1_TD_IRQHandler)(void); + void (*UART1_MS_IRQHandler)(void); + void (*UART1_RX_IRQHandler)(void); + void (*UART1_TX_IRQHandler)(void); + void (*UART1_RT_IRQHandler)(void); + void (*UART1_E_IRQHandler)(void); + void (*UART1_IRQHandler)(void); + void (*UART2_TD_IRQHandler)(void); + void (*UART2_MS_IRQHandler)(void); + void (*UART2_RX_IRQHandler)(void); + void (*UART2_TX_IRQHandler)(void); + void (*UART2_RT_IRQHandler)(void); + void (*UART2_E_IRQHandler)(void); + void (*UART2_IRQHandler)(void); + void (*UART3_TD_IRQHandler)(void); + void (*UART3_MS_IRQHandler)(void); + void (*UART3_RX_IRQHandler)(void); + void (*UART3_TX_IRQHandler)(void); + void (*UART3_RT_IRQHandler)(void); + void (*UART3_E_IRQHandler)(void); + void (*UART3_IRQHandler)(void); + void (*TUART0_RX_IRQHandler)(void); + void (*TUART0_TX_IRQHandler)(void); + void (*TUART0_RO_IRQHandler)(void); + void (*TUART0_TO_IRQHandler)(void); + void (*TUART0_IRQHandler)(void); + void (*TUART1_RX_IRQHandler)(void); + void (*TUART1_TX_IRQHandler)(void); + void (*TUART1_RO_IRQHandler)(void); + void (*TUART1_TO_IRQHandler)(void); + void (*TUART1_IRQHandler)(void); + void (*SPI0_IRQHandler)(void); + void (*SPI0_RX_IRQHandler)(void); + void (*SPI0_TX_IRQHandler)(void); + void (*SPI0_RO_IRQHandler)(void); + void (*SPI0_RT_IRQHandler)(void); + void (*SPI1_IRQHandler)(void); + void (*SPI1_RX_IRQHandler)(void); + void (*SPI1_TX_IRQHandler)(void); + void (*SPI1_RO_IRQHandler)(void); + void (*SPI1_RT_IRQHandler)(void); + void (*SPI2_IRQHandler)(void); + void (*SPI2_RX_IRQHandler)(void); + void (*SPI2_TX_IRQHandler)(void); + void (*SPI2_RO_IRQHandler)(void); + void (*SPI2_RT_IRQHandler)(void); + void (*SPI3_IRQHandler)(void); + void (*SPI3_RX_IRQHandler)(void); + void (*SPI3_TX_IRQHandler)(void); + void (*SPI3_RO_IRQHandler)(void); + void (*SPI3_RT_IRQHandler)(void); + void (*I2C0_IRQHandler)(void); + void (*I2C1_IRQHandler)(void); + void (*SPWR0_IRQHandler)(void); + void (*SPWR1_IRQHandler)(void); + void (*MILSTD0_IRQHandler)(void); + void (*MILSTD1_IRQHandler)(void); + void (*ECAP0_IRQHandler)(void); + void (*ECAP1_IRQHandler)(void); + void (*ECAP2_IRQHandler)(void); + void (*ECAP3_IRQHandler)(void); + void (*ECAP4_IRQHandler)(void); + void (*ECAP5_IRQHandler)(void); + void (*PWM0_IRQHandler)(void); + void (*PWM0_HD_IRQHandler)(void); + void (*PWM0_TZ_IRQHandler)(void); + void (*PWM1_IRQHandler)(void); + void (*PWM1_HD_IRQHandler)(void); + void (*PWM1_TZ_IRQHandler)(void); + void (*PWM2_IRQHandler)(void); + void (*PWM2_HD_IRQHandler)(void); + void (*PWM2_TZ_IRQHandler)(void); + void (*PWM3_IRQHandler)(void); + void (*PWM3_HD_IRQHandler)(void); + void (*PWM3_TZ_IRQHandler)(void); + void (*PWM4_IRQHandler)(void); + void (*PWM4_HD_IRQHandler)(void); + void (*PWM4_TZ_IRQHandler)(void); + void (*PWM5_IRQHandler)(void); + void (*PWM5_HD_IRQHandler)(void); + void (*PWM5_TZ_IRQHandler)(void); + void (*PWM6_IRQHandler)(void); + void (*PWM6_HD_IRQHandler)(void); + void (*PWM6_TZ_IRQHandler)(void); + void (*PWM7_IRQHandler)(void); + void (*PWM7_HD_IRQHandler)(void); + void (*PWM7_TZ_IRQHandler)(void); + void (*PWM8_IRQHandler)(void); + void (*PWM8_HD_IRQHandler)(void); + void (*PWM8_TZ_IRQHandler)(void); + void (*PWM9_IRQHandler)(void); + void (*PWM9_HD_IRQHandler)(void); + void (*PWM9_TZ_IRQHandler)(void); + void (*QEP0_IRQHandler)(void); + void (*QEP1_IRQHandler)(void); + void (*QEP2_IRQHandler)(void); + void (*QEP3_IRQHandler)(void); + void (*ADC_SEQ0_IRQHandler)(void); + void (*ADC_SEQ1_IRQHandler)(void); + void (*ADC_SEQ2_IRQHandler)(void); + void (*ADC_SEQ3_IRQHandler)(void); + void (*ADC_SEQ4_IRQHandler)(void); + void (*ADC_SEQ5_IRQHandler)(void); + void (*ADC_SEQ6_IRQHandler)(void); + void (*ADC_SEQ7_IRQHandler)(void); + void (*ADC_DC_IRQHandler)(void); + void (*ETH_IRQHandler)(void); + void (*CAN0_IRQHandler)(void); + void (*CAN1_IRQHandler)(void); + void (*CAN2_IRQHandler)(void); + void (*CAN3_IRQHandler)(void); + void (*CAN4_IRQHandler)(void); + void (*CAN5_IRQHandler)(void); + void (*CAN6_IRQHandler)(void); + void (*CAN7_IRQHandler)(void); + void (*CAN8_IRQHandler)(void); + void (*CAN9_IRQHandler)(void); + void (*CAN10_IRQHandler)(void); + void (*CAN11_IRQHandler)(void); + void (*CAN12_IRQHandler)(void); + void (*CAN13_IRQHandler)(void); + void (*CAN14_IRQHandler)(void); + void (*CAN15_IRQHandler)(void); + void (*FPU_IRQHandler)(void); + void (*TMU_IRQHandler)(void); + void (*LAU_IRQHandler)(void); + void (*SDFM_IRQHandler)(void); + void (*OWI0_IRQHandler)(void); + void (*OWI1_IRQHandler)(void); +}; + +// Заполнитель массива векторов +#define ISR_VECTORS {\ + (void(*)(void))&_estack,\ + Reset_Handler,\ + NMI_Handler,\ + HardFault_Handler,\ + MemManage_Handler,\ + BusFault_Handler,\ + UsageFault_Handler,\ + 0,\ + 0,\ + 0,\ + 0,\ + SVC_Handler,\ + DebugMon_Handler,\ + 0,\ + PendSV_Handler,\ + SysTick_Handler,\ + WDT_IRQHandler,\ + RCU_IRQHandler,\ + RTC_IRQHandler,\ + MFLASH_IRQHandler,\ + BFLASH_IRQHandler,\ + GPIOA_IRQHandler,\ + GPIOB_IRQHandler,\ + GPIOC_IRQHandler,\ + GPIOD_IRQHandler,\ + GPIOE_IRQHandler,\ + GPIOF_IRQHandler,\ + GPIOG_IRQHandler,\ + GPIOH_IRQHandler,\ + GPIOJ_IRQHandler,\ + GPIOK_IRQHandler,\ + GPIOL_IRQHandler,\ + GPIOM_IRQHandler,\ + DMA_CH0_IRQHandler,\ + DMA_CH1_IRQHandler,\ + DMA_CH2_IRQHandler,\ + DMA_CH3_IRQHandler,\ + DMA_CH4_IRQHandler,\ + DMA_CH5_IRQHandler,\ + DMA_CH6_IRQHandler,\ + DMA_CH7_IRQHandler,\ + DMA_CH8_IRQHandler,\ + DMA_CH9_IRQHandler,\ + DMA_CH10_IRQHandler,\ + DMA_CH11_IRQHandler,\ + DMA_CH12_IRQHandler,\ + DMA_CH13_IRQHandler,\ + DMA_CH14_IRQHandler,\ + DMA_CH15_IRQHandler,\ + DMA_CH16_IRQHandler,\ + DMA_CH17_IRQHandler,\ + DMA_CH18_IRQHandler,\ + DMA_CH19_IRQHandler,\ + DMA_CH20_IRQHandler,\ + DMA_CH21_IRQHandler,\ + DMA_CH22_IRQHandler,\ + DMA_CH23_IRQHandler,\ + DMA_CH24_IRQHandler,\ + DMA_CH25_IRQHandler,\ + DMA_CH26_IRQHandler,\ + DMA_CH27_IRQHandler,\ + DMA_CH28_IRQHandler,\ + DMA_CH29_IRQHandler,\ + DMA_CH30_IRQHandler,\ + DMA_CH31_IRQHandler,\ + TMR0_IRQHandler,\ + TMR1_IRQHandler,\ + TMR2_IRQHandler,\ + TMR3_IRQHandler,\ + ETMR0_IRQHandler,\ + ETMR1_IRQHandler,\ + ETMR2_IRQHandler,\ + ETMR3_IRQHandler,\ + UART0_TD_IRQHandler,\ + UART0_MS_IRQHandler,\ + UART0_RX_IRQHandler,\ + UART0_TX_IRQHandler,\ + UART0_RT_IRQHandler,\ + UART0_E_IRQHandler,\ + UART0_IRQHandler,\ + UART1_TD_IRQHandler,\ + UART1_MS_IRQHandler,\ + UART1_RX_IRQHandler,\ + UART1_TX_IRQHandler,\ + UART1_RT_IRQHandler,\ + UART1_E_IRQHandler,\ + UART1_IRQHandler,\ + UART2_TD_IRQHandler,\ + UART2_MS_IRQHandler,\ + UART2_RX_IRQHandler,\ + UART2_TX_IRQHandler,\ + UART2_RT_IRQHandler,\ + UART2_E_IRQHandler,\ + UART2_IRQHandler,\ + UART3_TD_IRQHandler,\ + UART3_MS_IRQHandler,\ + UART3_RX_IRQHandler,\ + UART3_TX_IRQHandler,\ + UART3_RT_IRQHandler,\ + UART3_E_IRQHandler,\ + UART3_IRQHandler,\ + TUART0_RX_IRQHandler,\ + TUART0_TX_IRQHandler,\ + TUART0_RO_IRQHandler,\ + TUART0_TO_IRQHandler,\ + TUART0_IRQHandler,\ + TUART1_RX_IRQHandler,\ + TUART1_TX_IRQHandler,\ + TUART1_RO_IRQHandler,\ + TUART1_TO_IRQHandler,\ + TUART1_IRQHandler,\ + SPI0_IRQHandler,\ + SPI0_RX_IRQHandler,\ + SPI0_TX_IRQHandler,\ + SPI0_RO_IRQHandler,\ + SPI0_RT_IRQHandler,\ + SPI1_IRQHandler,\ + SPI1_RX_IRQHandler,\ + SPI1_TX_IRQHandler,\ + SPI1_RO_IRQHandler,\ + SPI1_RT_IRQHandler,\ + SPI2_IRQHandler,\ + SPI2_RX_IRQHandler,\ + SPI2_TX_IRQHandler,\ + SPI2_RO_IRQHandler,\ + SPI2_RT_IRQHandler,\ + SPI3_IRQHandler,\ + SPI3_RX_IRQHandler,\ + SPI3_TX_IRQHandler,\ + SPI3_RO_IRQHandler,\ + SPI3_RT_IRQHandler,\ + I2C0_IRQHandler,\ + I2C1_IRQHandler,\ + SPWR0_IRQHandler,\ + SPWR1_IRQHandler,\ + MILSTD0_IRQHandler,\ + MILSTD1_IRQHandler,\ + ECAP0_IRQHandler,\ + ECAP1_IRQHandler,\ + ECAP2_IRQHandler,\ + ECAP3_IRQHandler,\ + ECAP4_IRQHandler,\ + ECAP5_IRQHandler,\ + PWM0_IRQHandler,\ + PWM0_HD_IRQHandler,\ + PWM0_TZ_IRQHandler,\ + PWM1_IRQHandler,\ + PWM1_HD_IRQHandler,\ + PWM1_TZ_IRQHandler,\ + PWM2_IRQHandler,\ + PWM2_HD_IRQHandler,\ + PWM2_TZ_IRQHandler,\ + PWM3_IRQHandler,\ + PWM3_HD_IRQHandler,\ + PWM3_TZ_IRQHandler,\ + PWM4_IRQHandler,\ + PWM4_HD_IRQHandler,\ + PWM4_TZ_IRQHandler,\ + PWM5_IRQHandler,\ + PWM5_HD_IRQHandler,\ + PWM5_TZ_IRQHandler,\ + PWM6_IRQHandler,\ + PWM6_HD_IRQHandler,\ + PWM6_TZ_IRQHandler,\ + PWM7_IRQHandler,\ + PWM7_HD_IRQHandler,\ + PWM7_TZ_IRQHandler,\ + PWM8_IRQHandler,\ + PWM8_HD_IRQHandler,\ + PWM8_TZ_IRQHandler,\ + PWM9_IRQHandler,\ + PWM9_HD_IRQHandler,\ + PWM9_TZ_IRQHandler,\ + QEP0_IRQHandler,\ + QEP1_IRQHandler,\ + QEP2_IRQHandler,\ + QEP3_IRQHandler,\ + ADC_SEQ0_IRQHandler,\ + ADC_SEQ1_IRQHandler,\ + ADC_SEQ2_IRQHandler,\ + ADC_SEQ3_IRQHandler,\ + ADC_SEQ4_IRQHandler,\ + ADC_SEQ5_IRQHandler,\ + ADC_SEQ6_IRQHandler,\ + ADC_SEQ7_IRQHandler,\ + ADC_DC_IRQHandler,\ + ETH_IRQHandler,\ + CAN0_IRQHandler,\ + CAN1_IRQHandler,\ + CAN2_IRQHandler,\ + CAN3_IRQHandler,\ + CAN4_IRQHandler,\ + CAN5_IRQHandler,\ + CAN6_IRQHandler,\ + CAN7_IRQHandler,\ + CAN8_IRQHandler,\ + CAN9_IRQHandler,\ + CAN10_IRQHandler,\ + CAN11_IRQHandler,\ + CAN12_IRQHandler,\ + CAN13_IRQHandler,\ + CAN14_IRQHandler,\ + CAN15_IRQHandler,\ + FPU_IRQHandler,\ + TMU_IRQHandler,\ + LAU_IRQHandler,\ + SDFM_IRQHandler,\ + OWI0_IRQHandler,\ + OWI1_IRQHandler,\ +} + +#endif + +/*@}*/ diff --git a/include/system_K1921VK028.h b/include/system_K1921VK028.h new file mode 100644 index 0000000..c3bbb79 --- /dev/null +++ b/include/system_K1921VK028.h @@ -0,0 +1,81 @@ +/*============================================================================== + * Инициализация К1921ВК028 + *------------------------------------------------------------------------------ + * НИИЭТ, Богдан Колбов + *============================================================================== + * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО + * ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ + * ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ + * НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ + * ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА + * ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ + * ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ + * ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ + * ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + * ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ. + * + * 2018 АО "НИИЭТ" + *============================================================================== + */ + +#ifndef SYSTEM_K1921VK028_H +#define SYSTEM_K1921VK028_H + +#ifdef __cplusplus +extern "C" { +#endif + +//-- Includes ------------------------------------------------------------------ +#include + +//-- Defines ------------------------------------------------------------------- +#ifndef CPE +#define CPE 0 +#endif + +#define SYSCLK_PLL +#define OSICLK_VAL 16000000 +#ifndef OSECLK_VAL +#define OSECLK_VAL 12000000 +#endif +#ifndef EXTCLK_VAL +#define EXTCLK_VAL 0 +#endif +#define SYSCLK_SWITCH_TIMEOUT 0x100000 + +#if (CPE == 0) +#define REFCLK_VAL OSICLK_VAL +#define SRCCLK_VAL OSECLK_VAL +#elif (CPE == 1) +#define REFCLK_VAL OSECLK_VAL +#define SRCCLK_VAL OSICLK_VAL +#else +#error "Please define CPE with correct state!" +#endif +#define SRCCLK_STARTUP_TIMEOUT 0x100000 + +#ifndef TRACEEXTCLK_VAL +#define TRACEEXTCLK_VAL OSECLK_VAL +#endif + +#ifndef PLLEXTCLK_VAL +#define PLLEXTCLK_VAL OSECLK_VAL +#endif + +//-- Variables ----------------------------------------------------------------- +extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock) +extern uint32_t APB0BusClock; // APB0 Bus Clock Frequency +extern uint32_t APB1BusClock; // APB1 Bus Clock Frequency +extern uint32_t programMemType; // Memory Region That Program Is Written To + +//-- Functions ----------------------------------------------------------------- +// Initialize the System +extern void SystemInit(void); +// Updates the SystemCoreClock with current core Clock retrieved from registers +extern uint16_t SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif // SYSTEM_K1921VK028_H diff --git a/lib/libCANOpen_drv.a b/lib/libCANOpen_drv.a new file mode 100644 index 0000000..3d69631 Binary files /dev/null and b/lib/libCANOpen_drv.a differ diff --git a/lib/libc.a b/lib/libc.a new file mode 100644 index 0000000..89fe8a6 Binary files /dev/null and b/lib/libc.a differ diff --git a/lib/libgcc.a b/lib/libgcc.a new file mode 100644 index 0000000..b3207d3 Binary files /dev/null and b/lib/libgcc.a differ diff --git a/lib/libm.a b/lib/libm.a new file mode 100644 index 0000000..5678f56 Binary files /dev/null and b/lib/libm.a differ diff --git a/src/GpioPeripheralInit.c b/src/GpioPeripheralInit.c new file mode 100644 index 0000000..ce4c204 --- /dev/null +++ b/src/GpioPeripheralInit.c @@ -0,0 +1,123 @@ +/* + * GpioPeripheralInit.c + * + * Настройка GPIO-шек под периферию, используемую в проекте + * Created on: 15 мар. 2019 г. + * Author: Dmitry + */ +#include "DSP.h" +#include "build.h" + +void gpioPeripheralInit (void) { + // Разрешение работы всех ножек на проце + GPIOA->DENSET = 0xFFFF; + GPIOB->DENSET = 0xFFFF; + GPIOC->DENSET = 0xFFFF; + GPIOD->DENSET = 0xFFFF; + GPIOE->DENSET = 0xFFFF; + GPIOF->DENSET = 0xFFFF; + GPIOG->DENSET = 0xFFFF; + GPIOH->DENSET = 0xFFFF; + GPIOJ->DENSET = 0xFFFF; + GPIOK->DENSET = 0xFFFF; + GPIOL->DENSET = 0xFFFF; + GPIOM->DENSET = 0xFFFF; + + // LEDs: K14 / K15 + GPIOK->DATAOUTCLR = GPIO_PIN_14 | GPIO_PIN_15; + GPIOK->OUTENSET = GPIO_PIN_14 | GPIO_PIN_15; + GPIOK->ALTFUNCCLR = GPIO_PIN_14 | GPIO_PIN_15; + + // Buttons: D10 / D11 + GPIOD->OUTENCLR = GPIO_PIN_10 | GPIO_PIN_11; + GPIOD->ALTFUNCCLR = GPIO_PIN_10 | GPIO_PIN_11; + + // SPI: A0 / A1 / A2 / A3 + GPIOA->ALTFUNCNUM0_bit.PIN0 = 1; // SPI0_CLK + GPIOA->ALTFUNCNUM0_bit.PIN1 = 1; // SPI0_RX + GPIOA->ALTFUNCNUM0_bit.PIN2 = 1; // SPI0_TX + GPIOA->ALTFUNCNUM0_bit.PIN3 = 1; // SPI0_FSS + GPIOA->ALTFUNCSET = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3; + + + // QEP0: A12 / A13 / A14 / A15 + GPIOA->ALTFUNCNUM1_bit.PIN12 = 1; // QEP_A + GPIOA->ALTFUNCNUM1_bit.PIN13 = 1; // QEP_B + GPIOA->ALTFUNCNUM1_bit.PIN14 = 1; // QEP_I + GPIOA->ALTFUNCNUM1_bit.PIN15 = 1; // QEP_S + GPIOA->ALTFUNCSET = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; + + // PWM TZ0/1/2: B3 / B4 / B5 + GPIOB->ALTFUNCNUM0_bit.PIN3 = 1; // TZ_0 + GPIOB->ALTFUNCNUM0_bit.PIN4 = 1; // TZ_1 + GPIOB->ALTFUNCNUM0_bit.PIN5 = 1; // TZ_2 + GPIOB->ALTFUNCSET = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5; + + // PWM TZ3/4/5: D4 / D5 / D6 + GPIOD->ALTFUNCNUM0_bit.PIN4 = 2; // TZ_3 + GPIOD->ALTFUNCNUM0_bit.PIN5 = 2; // TZ_4 + GPIOD->ALTFUNCNUM0_bit.PIN6 = 2; // TZ_5 + GPIOD->ALTFUNCSET = GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6; + + // PWM0/1/2/3: B6 / B7 / B8 / B9 / B10 / B11 / B12 / B13 + GPIOB->ALTFUNCNUM0_bit.PIN6 = 1; // PWM0_A + GPIOB->ALTFUNCNUM0_bit.PIN7 = 1; // PWM0_B + GPIOB->ALTFUNCNUM1_bit.PIN8 = 1; // PWM1_A + GPIOB->ALTFUNCNUM1_bit.PIN9 = 1; // PWM1_B + GPIOB->ALTFUNCNUM1_bit.PIN10 = 1; // PWM2_A + GPIOB->ALTFUNCNUM1_bit.PIN11 = 1; // PWM2_B + GPIOB->ALTFUNCNUM1_bit.PIN12 = 1; // PWM3_A + GPIOB->ALTFUNCNUM1_bit.PIN13 = 1; // PWM3_B + GPIOB->ALTFUNCSET = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | + GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13; + +#ifdef CANTORS_ENA + // UART2: С8 / С9 (USB-UART) + GPIOC->ALTFUNCNUM1_bit.PIN8 = 2; // UART2_RX + GPIOC->ALTFUNCNUM1_bit.PIN9 = 2; // UART2_TX + GPIOC->ALTFUNCSET = GPIO_PIN_8 | GPIO_PIN_9; +#endif + +#ifdef MODBUS_ENA + // UART2: K10 / K11 + M2 (modbus tx/rx) + GPIOK->ALTFUNCNUM1_bit.PIN10 = 4; // UART2_RX + GPIOK->ALTFUNCNUM1_bit.PIN11 = 4; // UART2_TX + GPIOK->ALTFUNCSET = GPIO_PIN_10 | GPIO_PIN_11; + + GPIOM->ALTFUNCCLR = GPIO_PIN_2; + GPIOM->OUTENSET = GPIO_PIN_2; +#endif + + + // UdControl: B14 + GPIOB->ALTFUNCCLR = GPIO_PIN_14; + GPIOB->DATAOUTCLR = GPIO_PIN_14; + GPIOB->OUTENSET = GPIO_PIN_14; + + // DI: D1 / D2 / M14 + GPIOD->ALTFUNCCLR = GPIO_PIN_1 | GPIO_PIN_2; + GPIOD->DATAOUTCLR = GPIO_PIN_1 | GPIO_PIN_2; + GPIOD->OUTENSET = GPIO_PIN_1 | GPIO_PIN_2; + + GPIOM->ALTFUNCCLR = GPIO_PIN_14; + GPIOM->DATAOUTCLR = GPIO_PIN_14; + GPIOM->OUTENSET = GPIO_PIN_14; + + // DO: M10 / M11 / M13 + GPIOM->OUTENCLR = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_13; + GPIOM->ALTFUNCCLR = GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_13; + + // CAP: M5 / M6 / M7 + GPIOM->ALTFUNCNUM0_bit.PIN5 = 2; + GPIOM->ALTFUNCNUM0_bit.PIN6 = 2; + GPIOM->ALTFUNCNUM0_bit.PIN7 = 2; + GPIOM->ALTFUNCSET = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; + + // Fan Control: B13 + GPIOB->ALTFUNCCLR = GPIO_PIN_13; + GPIOB->DATAOUTCLR = GPIO_PIN_13; + GPIOB->OUTENSET = GPIO_PIN_13; + + + +} diff --git a/src/startup.c b/src/startup.c new file mode 100644 index 0000000..5d23285 --- /dev/null +++ b/src/startup.c @@ -0,0 +1,86 @@ +/*! + Copyright 2018 АО "НИИЭТ" и ООО "НПФ ВЕКТОР" + + Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0 + + 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. + + \file startup.c + \brief Стартовый файл + \author ООО "НПФ Вектор". http://motorcontrol.ru + \version v 1.0 04/09/2018 + + */ + +#include "K1921VK028.h" +#include "core_cm4.h" + +#include "startup.h" +typedef unsigned char Uint8; +typedef unsigned short int Uint16; +typedef unsigned int Uint32; + +// Массив из 148 указателей на функции +//void (*g_pfnVectors[148])(void) __attribute__((section (".isr_vector"))) = ISR_VECTORS; +TisrVectors g_pfnVectors __attribute__((section (".isr_vector"))) = ISR_VECTORS; + +// Обработчик Reset_Handler +// Копирует константы для инициализации переменных, +// заполняет нулями то, что должно быть нулями +extern int _estack; +extern int __textdata_start__, _sdata, _edata, _sbss, _ebss; +void Reset_Handler (void) { + // Сначала правильно расположить стек (если программа выполняется из RAM) + __set_MSP((Uint32)&_estack); + + // Копируем константы + Uint32 i; + Uint8 *from, *to; + Uint32 size; + + // Определяем, откуда-куда-сколько + from = (Uint8*)&__textdata_start__; + to = (Uint8*)&_sdata; + size = (Uint32)((Uint8*)&_edata - (Uint8*)&_sdata); + + // Копируем + for (i = 0; i < size; i++) { + *to = *from; + to++; + from++; + } + + // Теперь тоже самое для ZeroBss + to = (Uint8*)&_sbss; + size = (Uint32)((Uint8*)&_ebss - (Uint8*)&_sbss); + + // Копируем + for (i = 0; i < size; i++) { + *to = 0; + to++; + } + + // Теперь нужно включить плавающую точку + SCB->CPACR |= 0b11 << 20; + SCB->CPACR |= 0b11 << 22; + __DSB(); + __ISB(); + + + + // А теперь переходим к main() + Uint16 mainRet = main(); + + // А если вдруг main закончился - зацикливаемся + while(1){}; +} + +/*@}*/ diff --git a/src/system_K1921VK028.c b/src/system_K1921VK028.c new file mode 100644 index 0000000..69c4742 --- /dev/null +++ b/src/system_K1921VK028.c @@ -0,0 +1,472 @@ +/*============================================================================== + * Инициализация К1921ВК028 + *------------------------------------------------------------------------------ + * НИИЭТ, Богдан Колбов + *============================================================================== + * ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО + * ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ ГАРАНТИИ ТОВАРНОЙ + * ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ И ОТСУТСТВИЯ + * НАРУШЕНИЙ, НО НЕ ОГРАНИЧИВАЯСЬ ИМИ. ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ + * ПРЕДНАЗНАЧЕНО ДЛЯ ОЗНАКОМИТЕЛЬНЫХ ЦЕЛЕЙ И НАПРАВЛЕНО ТОЛЬКО НА + * ПРЕДОСТАВЛЕНИЕ ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ О ПРОДУКТЕ, С ЦЕЛЬЮ СОХРАНИТЬ ВРЕМЯ + * ПОТРЕБИТЕЛЮ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ НЕСУТ + * ОТВЕТСТВЕННОСТИ ПО КАКИМ-ЛИБО ИСКАМ, ЗА ПРЯМОЙ ИЛИ КОСВЕННЫЙ УЩЕРБ, ИЛИ + * ПО ИНЫМ ТРЕБОВАНИЯМ, ВОЗНИКШИМ ИЗ-ЗА ИСПОЛЬЗОВАНИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ + * ИЛИ ИНЫХ ДЕЙСТВИЙ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ. + * + * 2018 АО "НИИЭТ" + *============================================================================== + */ + +//-- Includes ------------------------------------------------------------------ +#include "system_K1921VK028.h" +#include "K1921VK028.h" + +//-- Variables ----------------------------------------------------------------- +uint32_t SystemCoreClock; // System Clock Frequency (Core Clock) +uint32_t APB0BusClock; // APB0 Bus Clock Frequency +uint32_t APB1BusClock; // APB1 Bus Clock Frequency +uint32_t programMemType; // Memory Region That Program Is Written To + + +//-- Functions ----------------------------------------------------------------- +uint16_t SystemCoreClockUpdate(void) +{ + uint32_t current_sysclk; + uint32_t pll_div1, pll_div2, pll_fbdiv, pll_refdiv, pll_refclk, pll_div = 1; + + current_sysclk = RCU->SYSCLKSTAT_bit.SYSSTAT; + + switch (current_sysclk) { + case RCU_SYSCLKSTAT_SYSSTAT_REFCLK: + SystemCoreClock = REFCLK_VAL; + break; + case RCU_SYSCLKSTAT_SYSSTAT_SRCCLK: + SystemCoreClock = SRCCLK_VAL; + break; + case RCU_SYSCLKSTAT_SYSSTAT_PLLDIVCLK: + case RCU_SYSCLKSTAT_SYSSTAT_PLLCLK: + if (current_sysclk == RCU_SYSCLKSTAT_SYSSTAT_PLLDIVCLK) + pll_div = RCU->PLLDIV_bit.DIV + 1; + pll_div1 = RCU->PLLCFG_bit.DIV1; + pll_div2 = RCU->PLLCFG_bit.DIV2; + pll_fbdiv = RCU->PLLCFG_bit.FBDIV; + pll_refdiv = RCU->PLLCFG_bit.REFDIV; + if (RCU->PLLCFG_bit.REFSRC == RCU_PLLCFG_REFSRC_OSICLK) + pll_refclk = OSICLK_VAL; + else if (RCU->PLLCFG_bit.REFSRC == RCU_PLLCFG_REFSRC_OSECLK) + pll_refclk = OSECLK_VAL; + else // (RCU->PLLCFG_bit.REFSRC == RCU_PLLCFG_REFSRC_PLLEXTCLK) + pll_refclk = PLLEXTCLK_VAL; + SystemCoreClock = (pll_refclk * pll_fbdiv) / (pll_refdiv * pll_div1 * pll_div2 * pll_div); + break; + } + + APB0BusClock = SystemCoreClock / (1 << RCU->APBCFG_bit.DIV); + APB1BusClock = SystemCoreClock; + + // Проверка, что тактирование не сбоит + if (RCU->SYSCLKSTAT_bit.SYSFAIL == 1) return 1; + else return 0; +} + +void ClkInit() +{ + uint32_t timeout_counter = 0; + uint32_t sysclk_source; + +//clockout control +#ifndef CKO_NONE + //D0 clockout + RCU->HCLKCFG_bit.GPIODEN = 1; + RCU->HRSTCFG_bit.GPIODEN = 1; + GPIOD->ALTFUNCNUM0_bit.PIN0 = 2; + GPIOD->ALTFUNCSET_bit.PIN0 = 1; + GPIOD->DENSET_bit.PIN0 = 1; +#endif + +#if defined CKO_REF + RCU->CLKOUTCFG = (RCU_CLKOUTCFG_CLKSEL_REFCLK << RCU_CLKOUTCFG_CLKSEL_Pos) | + (RCU_CLKOUTCFG_CLKEN_Msk); //CKO = REFCLK +#elif defined CKO_SRC + RCU->CLKOUTCFG = (RCU_CLKOUTCFG_CLKSEL_SRCCLK << RCU_CLKOUTCFG_CLKSEL_Pos) | + (RCU_CLKOUTCFG_CLKEN_Msk); //CKO = SRCCLK +#elif defined CKO_SYS + RCU->CLKOUTCFG = (RCU_CLKOUTCFG_CLKSEL_SYSCLK << RCU_CLKOUTCFG_CLKSEL_Pos) | + (3 << RCU_CLKOUTCFG_DIVN_Pos) | + (RCU_CLKOUTCFG_DIVEN_Msk) | + (RCU_CLKOUTCFG_CLKEN_Msk); //CKO = SYSCLK/8 +#elif defined CKO_PLL + RCU->CLKOUTCFG = (RCU_CLKOUTCFG_CLKSEL_PLLCLK << RCU_CLKOUTCFG_CLKSEL_Pos) | + (3 << RCU_CLKOUTCFG_DIVN_Pos) | + (RCU_CLKOUTCFG_DIVEN_Msk) | + (RCU_CLKOUTCFG_CLKEN_Msk); //CKO = PLLCLK/8 +#endif + +//wait till oscillator is ready +#if defined OSECLK_VAL && (OSECLK_VAL != 0) && (CPE == 0) + while ((!RCU->SYSCLKSTAT_bit.SRCCLKOK) && (timeout_counter < SRCCLK_STARTUP_TIMEOUT)) + timeout_counter++; + if (timeout_counter == SRCCLK_STARTUP_TIMEOUT) + while (1) { + }; +#endif + +//select system clock +#ifdef SYSCLK_PLL + //PLLCLK = (REFSRC/REFDIV) * (FBDIV/(DIV1*DIV2)) + uint32_t pllcfg_clr = (RCU_PLLCFG_REFSRC_Msk | + RCU_PLLCFG_REFDIV_Msk | + RCU_PLLCFG_DIV1_Msk | + RCU_PLLCFG_DIV2_Msk); + RCU->PLLCFG_bit.BP = 0; +#if (OSECLK_VAL == 8000000) + RCU->PLLCFG_bit.FBDIV = 100; + RCU->PLLCFG_bit.PD = 0; + RCU->PLLCFG |= (RCU_PLLCFG_REFSRC_OSECLK << RCU_PLLCFG_REFSRC_Pos) | + (1 << RCU_PLLCFG_REFDIV_Pos) | + (4 << RCU_PLLCFG_DIV1_Pos) | + (1 << RCU_PLLCFG_DIV2_Pos); +#elif (OSECLK_VAL == 12000000) + // SYSCLKOUT = Fclk / REFDIV * FBDIV / (DIV1 * DIV2) + // SYSCLKOUT = 12 / 3 * 100 / (2 * 1) = 200 МГц + // При этом Fvco = 400 МГц + RCU->PLLCFG_bit.FBDIV = 100; // Множитель входной частоты + RCU->PLLCFG_bit.PD = 0; // Энергосбереженеи запрещено + RCU->PLLCFG = (RCU->PLLCFG & (~pllcfg_clr)) | + (RCU_PLLCFG_REFSRC_OSECLK << RCU_PLLCFG_REFSRC_Pos) | + (3 << RCU_PLLCFG_REFDIV_Pos) | + (2 << RCU_PLLCFG_DIV1_Pos) | + (1 << RCU_PLLCFG_DIV2_Pos); +#elif (OSECLK_VAL == 16000000) + RCU->PLLCFG_bit.FBDIV = 50; + RCU->PLLCFG_bit.PD = 0; + RCU->PLLCFG = (RCU->PLLCFG & (~pllcfg_clr)) | + (RCU_PLLCFG_REFSRC_OSECLK << RCU_PLLCFG_REFSRC_Pos) | + (1 << RCU_PLLCFG_REFDIV_Pos) | + (4 << RCU_PLLCFG_DIV1_Pos) | + (1 << RCU_PLLCFG_DIV2_Pos); +#elif (OSECLK_VAL == 20000000) + RCU->PLLCFG_bit.FBDIV = 40; + RCU->PLLCFG_bit.PD = 0; + RCU->PLLCFG = (RCU->PLLCFG & (~pllcfg_clr)) | + (RCU_PLLCFG_REFSRC_OSECLK << RCU_PLLCFG_REFSRC_Pos) | + (1 << RCU_PLLCFG_REFDIV_Pos) | + (4 << RCU_PLLCFG_DIV1_Pos) | + (1 << RCU_PLLCFG_DIV2_Pos); +#elif (OSECLK_VAL == 24000000) + RCU->PLLCFG_bit.FBDIV = 50; + RCU->PLLCFG_bit.PD = 0; + RCU->PLLCFG = (RCU->PLLCFG & (~pllcfg_clr)) | + (RCU_PLLCFG_REFSRC_OSECLK << RCU_PLLCFG_REFSRC_Pos) | + (2 << RCU_PLLCFG_REFDIV_Pos) | + (3 << RCU_PLLCFG_DIV1_Pos) | + (1 << RCU_PLLCFG_DIV2_Pos); +#elif defined EXTCLK_VAL && (EXTCLK_VAL != 0) + //for example, if EXTCLK = 10000000 + RCU->PLLCFG_bit.FBDIV = 60; + RCU->PLLCFG_bit.PD = 0; + RCU->PLLCFG = (RCU->PLLCFG & (~pllcfg_clr)) | + (RCU_PLLCFG_REFSRC_EXTCLK << RCU_PLLCFG_REFSRC_Pos) | + (2 << RCU_PLLCFG_REFDIV_Pos) | + (3 << RCU_PLLCFG_DIV1_Pos) | + (1 << RCU_PLLCFG_DIV2_Pos); +#else +#error "Please define OSECLK_VAL or EXTCLK_VAL with correct values!" +#endif + RCU->PLLCFG_bit.OUTDIS = 0; // Включение PLL + while (!RCU->PLLCFG_bit.LOCK) { // Ожидание, пока он зафиксируется + }; + // additional waitstates + MFLASH->CTRL = (7 << MFLASH_CTRL_LAT_Pos); + BFLASH->CTRL = (7 << BFLASH_CTRL_LAT_Pos); + //apb0 div by 2 + RCU->APBCFG_bit.DIV = 1; // Fapb = SYSCLKOUT / (2 ^ DIV) = 100 МГц + //select PLL as source system clock + sysclk_source = RCU_SYSCLKCFG_SYSSEL_PLLCLK; +#elif defined SYSCLK_REF + sysclk_source = RCU_SYSCLKCFG_SYSSEL_REFCLK; +#elif defined SYSCLK_SRC + sysclk_source = RCU_SYSCLKCFG_SYSSEL_SRCCLK; +#else +#error "Please define SYSCLK source (SYSCLK_PLL | SYSCLK_REF | SYSCLK_SRC)!" +#endif + + //switch sysclk + RCU->SYSCLKCFG = (sysclk_source << RCU_SYSCLKCFG_SYSSEL_Pos); + // Wait switching done + timeout_counter = 0; + while ((RCU->SYSCLKSTAT_bit.SYSSTAT != RCU->SYSCLKCFG_bit.SYSSEL) && (timeout_counter < SYSCLK_SWITCH_TIMEOUT)) + timeout_counter++; + if (timeout_counter == SYSCLK_SWITCH_TIMEOUT) //SYSCLK failed to switch + while (1) { + }; + + //flush and enable cache + MFLASH->CTRL_bit.IFLUSH = 1; + while (MFLASH->ICSTAT_bit.BUSY) { + }; + MFLASH->CTRL_bit.DFLUSH = 1; + while (MFLASH->DCSTAT_bit.BUSY) { + }; + MFLASH->CTRL |= (MFLASH_CTRL_DCEN_Msk) | (MFLASH_CTRL_ICEN_Msk); +} + +void PeripheralsClockEnable () { + // Разрешение тактирования + RCU->PCLKCFG0_bit.ECAP0EN = 1; + RCU->PCLKCFG0_bit.ECAP1EN = 1; + RCU->PCLKCFG0_bit.ECAP2EN = 1; + RCU->PCLKCFG0_bit.ECAP3EN = 1; + RCU->PCLKCFG0_bit.ECAP4EN = 1; + RCU->PCLKCFG0_bit.ECAP5EN = 1; + RCU->PCLKCFG0_bit.ETMR0EN = 1; + RCU->PCLKCFG0_bit.ETMR1EN = 1; + RCU->PCLKCFG0_bit.ETMR2EN = 1; + RCU->PCLKCFG0_bit.ETMR3EN = 1; + RCU->PCLKCFG0_bit.I2C0EN = 1; + RCU->PCLKCFG0_bit.I2C1EN = 1; + RCU->PCLKCFG0_bit.RTCEN = 1; + RCU->PCLKCFG0_bit.TMR0EN = 1; + RCU->PCLKCFG0_bit.TMR1EN = 1; + RCU->PCLKCFG0_bit.TMR2EN = 1; + RCU->PCLKCFG0_bit.TMR3EN = 1; + RCU->PCLKCFG0_bit.TUART0EN = 1; + RCU->PCLKCFG0_bit.TUART1EN = 1; + + RCU->PCLKCFG1_bit.LAUEN = 1; + RCU->PCLKCFG1_bit.OWI0EN = 1; + RCU->PCLKCFG1_bit.OWI1EN = 1; + RCU->PCLKCFG1_bit.PWM0EN = 1; + RCU->PCLKCFG1_bit.PWM1EN = 1; + RCU->PCLKCFG1_bit.PWM2EN = 1; + RCU->PCLKCFG1_bit.PWM3EN = 1; + RCU->PCLKCFG1_bit.PWM4EN = 1; + RCU->PCLKCFG1_bit.PWM5EN = 1; + RCU->PCLKCFG1_bit.PWM6EN = 1; + RCU->PCLKCFG1_bit.PWM7EN = 1; + RCU->PCLKCFG1_bit.PWM8EN = 1; + RCU->PCLKCFG1_bit.PWM9EN = 1; + RCU->PCLKCFG1_bit.QEP0EN = 1; + RCU->PCLKCFG1_bit.QEP1EN = 1; + RCU->PCLKCFG1_bit.QEP2EN = 1; + RCU->PCLKCFG1_bit.QEP3EN = 1; + + RCU->HCLKCFG_bit.CANEN = 1; + RCU->HCLKCFG_bit.ETHEN = 1; + RCU->HCLKCFG_bit.EXTMEMEN = 1; + RCU->HCLKCFG_bit.GPIOAEN = 1; + RCU->HCLKCFG_bit.GPIOBEN = 1; + RCU->HCLKCFG_bit.GPIOCEN = 1; + RCU->HCLKCFG_bit.GPIODEN = 1; + RCU->HCLKCFG_bit.GPIOEEN = 1; + RCU->HCLKCFG_bit.GPIOFEN = 1; + RCU->HCLKCFG_bit.GPIOGEN = 1; + RCU->HCLKCFG_bit.GPIOHEN = 1; + RCU->HCLKCFG_bit.GPIOJEN = 1; + RCU->HCLKCFG_bit.GPIOKEN = 1; + RCU->HCLKCFG_bit.GPIOLEN = 1; + RCU->HCLKCFG_bit.GPIOMEN = 1; + RCU->HCLKCFG_bit.MILSTD0EN = 1; + RCU->HCLKCFG_bit.MILSTD1EN = 1; + RCU->HCLKCFG_bit.SDFMEN = 1; + RCU->HCLKCFG_bit.SPWR0EN = 1; + RCU->HCLKCFG_bit.SPWR1EN = 1; + + // Вывод из сброса + RCU->HRSTCFG_bit.CANEN = 1; + RCU->HRSTCFG_bit.ETHEN = 1; + RCU->HRSTCFG_bit.EXTMEMEN = 1; + RCU->HRSTCFG_bit.GPIOAEN = 1; + RCU->HRSTCFG_bit.GPIOBEN = 1; + RCU->HRSTCFG_bit.GPIOCEN = 1; + RCU->HRSTCFG_bit.GPIODEN = 1; + RCU->HRSTCFG_bit.GPIOEEN = 1; + RCU->HRSTCFG_bit.GPIOFEN = 1; + RCU->HRSTCFG_bit.GPIOGEN = 1; + RCU->HRSTCFG_bit.GPIOHEN = 1; + RCU->HRSTCFG_bit.GPIOJEN = 1; + RCU->HRSTCFG_bit.GPIOKEN = 1; + RCU->HRSTCFG_bit.GPIOLEN = 1; + RCU->HRSTCFG_bit.GPIOMEN = 1; + RCU->HRSTCFG_bit.MILSTD0EN = 1; + RCU->HRSTCFG_bit.MILSTD1EN = 1; + RCU->HRSTCFG_bit.SDFMEN = 1; + RCU->HRSTCFG_bit.SPWR0EN = 1; + RCU->HRSTCFG_bit.SPWR1EN = 1; + + RCU->PRSTCFG0_bit.ECAP0EN = 1; + RCU->PRSTCFG0_bit.ECAP1EN = 1; + RCU->PRSTCFG0_bit.ECAP2EN = 1; + RCU->PRSTCFG0_bit.ECAP3EN = 1; + RCU->PRSTCFG0_bit.ECAP4EN = 1; + RCU->PRSTCFG0_bit.ECAP5EN = 1; + RCU->PRSTCFG0_bit.ETMR0EN = 1; + RCU->PRSTCFG0_bit.ETMR1EN = 1; + RCU->PRSTCFG0_bit.ETMR2EN = 1; + RCU->PRSTCFG0_bit.ETMR3EN = 1; + RCU->PRSTCFG0_bit.I2C0EN = 1; + RCU->PRSTCFG0_bit.I2C1EN = 1; + RCU->PRSTCFG0_bit.RTCEN = 1; + RCU->PRSTCFG0_bit.TMR0EN = 1; + RCU->PRSTCFG0_bit.TMR1EN = 1; + RCU->PRSTCFG0_bit.TMR2EN = 1; + RCU->PRSTCFG0_bit.TMR3EN = 1; + RCU->PRSTCFG0_bit.TUART0EN = 1; + RCU->PRSTCFG0_bit.TUART1EN = 1; + + RCU->PRSTCFG1_bit.LAUEN = 1; + RCU->PRSTCFG1_bit.OWI0EN = 1; + RCU->PRSTCFG1_bit.OWI1EN = 1; + RCU->PRSTCFG1_bit.OWI1EN = 1; + RCU->PRSTCFG1_bit.PWM0EN = 1; + RCU->PRSTCFG1_bit.PWM1EN = 1; + RCU->PRSTCFG1_bit.PWM2EN = 1; + RCU->PRSTCFG1_bit.PWM3EN = 1; + RCU->PRSTCFG1_bit.PWM4EN = 1; + RCU->PRSTCFG1_bit.PWM5EN = 1; + RCU->PRSTCFG1_bit.PWM6EN = 1; + RCU->PRSTCFG1_bit.PWM7EN = 1; + RCU->PRSTCFG1_bit.PWM8EN = 1; + RCU->PRSTCFG1_bit.PWM9EN = 1; + RCU->PRSTCFG1_bit.QEP0EN = 1; + RCU->PRSTCFG1_bit.QEP1EN = 1; + RCU->PRSTCFG1_bit.QEP2EN = 1; + RCU->PRSTCFG1_bit.QEP3EN = 1; + + // Включение АЦП в блоке PMU (управление энергосбережением) + PMU->ADCPC = PMU_ADCPC_LDOEN0_Msk | PMU_ADCPC_LDOEN1_Msk | + PMU_ADCPC_LDOEN2_Msk | PMU_ADCPC_LDOEN3_Msk; + //ждем готовности LDO в АЦП + while (!(PMU->ADCPC_bit.LDORDY0 && + PMU->ADCPC_bit.LDORDY1 && + PMU->ADCPC_bit.LDORDY2 && + PMU->ADCPC_bit.LDORDY3)) { + }; + + + // Включение тактирования АЦП (выбор частоты по доке) + RCU->ADCCFG_bit.CLKSEL = 1; // PLL + RCU->ADCCFG_bit.DIVN = 2; // F_ACLK = F_PLL / (2 * (DIVN + 1)) = 33.3 МГц + RCU->ADCCFG_bit.DIVEN = 1; + RCU->ADCCFG_bit.CLKEN = 1; + RCU->ADCCFG_bit.RSTDIS = 1; + + // Тактирование SPI 0 / 1 / 2 / 3 + RCU->SPICFG[0].SPICFG_bit.CLKSEL = 1; // PLL + RCU->SPICFG[0].SPICFG_bit.DIVN = 3; // F_SPICLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->SPICFG[0].SPICFG_bit.DIVEN = 1; + RCU->SPICFG[0].SPICFG_bit.CLKEN = 1; + RCU->SPICFG[0].SPICFG_bit.RSTDIS = 1; + + RCU->SPICFG[1].SPICFG_bit.CLKSEL = 1; // PLL + RCU->SPICFG[1].SPICFG_bit.DIVN = 3; // F_SPICLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->SPICFG[1].SPICFG_bit.DIVEN = 1; + RCU->SPICFG[1].SPICFG_bit.CLKEN = 1; + RCU->SPICFG[1].SPICFG_bit.RSTDIS = 1; + + RCU->SPICFG[2].SPICFG_bit.CLKSEL = 1; // PLL + RCU->SPICFG[2].SPICFG_bit.DIVN = 3; // F_SPICLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->SPICFG[2].SPICFG_bit.DIVEN = 1; + RCU->SPICFG[2].SPICFG_bit.CLKEN = 1; + RCU->SPICFG[2].SPICFG_bit.RSTDIS = 1; + + RCU->SPICFG[3].SPICFG_bit.CLKSEL = 1; // PLL + RCU->SPICFG[3].SPICFG_bit.DIVN = 3; // F_SPICLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->SPICFG[3].SPICFG_bit.DIVEN = 1; + RCU->SPICFG[3].SPICFG_bit.CLKEN = 1; + RCU->SPICFG[3].SPICFG_bit.RSTDIS = 1; + + + // Тактирование UART 0 / 1 / 2 / 3 + RCU->UARTCFG[0].UARTCFG_bit.CLKSEL = 1; // PLL + RCU->UARTCFG[0].UARTCFG_bit.DIVN = 3; // F_UARTCLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->UARTCFG[0].UARTCFG_bit.DIVEN = 1; + RCU->UARTCFG[0].UARTCFG_bit.CLKEN = 1; + RCU->UARTCFG[0].UARTCFG_bit.RSTDIS = 1; + + RCU->UARTCFG[1].UARTCFG_bit.CLKSEL = 1; // PLL + RCU->UARTCFG[1].UARTCFG_bit.DIVN = 3; // F_UARTCLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->UARTCFG[1].UARTCFG_bit.DIVEN = 1; + RCU->UARTCFG[1].UARTCFG_bit.CLKEN = 1; + RCU->UARTCFG[1].UARTCFG_bit.RSTDIS = 1; + + RCU->UARTCFG[2].UARTCFG_bit.CLKSEL = 1; // PLL + RCU->UARTCFG[2].UARTCFG_bit.DIVN = 3; // F_UARTCLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->UARTCFG[2].UARTCFG_bit.DIVEN = 1; + RCU->UARTCFG[2].UARTCFG_bit.CLKEN = 1; + RCU->UARTCFG[2].UARTCFG_bit.RSTDIS = 1; + + RCU->UARTCFG[3].UARTCFG_bit.CLKSEL = 1; // PLL + RCU->UARTCFG[3].UARTCFG_bit.DIVN = 3; // F_UARTCLK = F_PLL / (2 * (DIVN + 1)) = 25 МГц + RCU->UARTCFG[3].UARTCFG_bit.DIVEN = 1; + RCU->UARTCFG[3].UARTCFG_bit.CLKEN = 1; + RCU->UARTCFG[3].UARTCFG_bit.RSTDIS = 1; + + +// RCU->WDTCFG_bit.CLKEN = 1; + +} + + +#define GLOBMEM(ADDR) *(volatile uint32_t*)(ADDR) //макрос для обращения к учейке по адресу + +void remapCheck() +{ + //Данная функция определяет из какой области памяти происходит запуск программы. Делает она это путем "простукивания" памяти. + //Функция обращается к самым крайним ячейкам областей памяти (MFLASH, BLASH, RAM0) с заранее известными размерами. + //При обращении к несуществующей ячейке, просиходит BusFault, который мы игнорируем, и выставляется флаг BusFault'a в регистре SCB->CFSR, + //и таким образом мы вычленяем память, из которой работает программа. + + programMemType = 0; + + static const uint32_t BFARVALID_MASK = (0x80 << SCB_CFSR_BUSFAULTSR_Pos); + + SCB->CFSR |= BFARVALID_MASK; //сбрасываем флаг, который взводится по событию BusFault + + uint32_t mask = __get_FAULTMASK(); //сохраняем значения регистра с масками для фолтов + __disable_fault_irq(); //отлючяем прерывания по фолтам + SCB->CCR |= SCB_CCR_BFHFNMIGN_Msk; //игнорировать BusFault + + GLOBMEM(MEM_MFLASH_SIZE); + if (!(SCB->CFSR & BFARVALID_MASK)) { + programMemType = 0x1; //программа во внешней памяти (EXT_MEM) + } + else { + SCB->CFSR |= BFARVALID_MASK; + GLOBMEM(MEM_BFLASH_SIZE); + if (!(SCB->CFSR & BFARVALID_MASK)) { + programMemType = 0x2; //программа в основной памяти (MFLASH) + } + else { + SCB->CFSR |= BFARVALID_MASK; + GLOBMEM(MEM_RAM0_SIZE); + if (!(SCB->CFSR & BFARVALID_MASK)) { + programMemType = 0x4; //программа в загрузочной памяти (BFLASH) + } + else { + SCB->CFSR |= BFARVALID_MASK; + programMemType = 0x8; //программа в оперативной памяти (RAM0) + } + } + } + + SCB->CCR &= ~SCB_CCR_BFHFNMIGN_Msk; //сбросываем игнорирование BusFault + __set_FAULTMASK(mask); //восстанавливаем занчения регистра с масками для фолтов + __enable_fault_irq(); //включаем прерывания по фолтам +} + + +void FPUInit() +{ + SCB->CPACR = 0x00F00000; + __DSB(); + __ISB(); +} +void SystemInit(void) +{ + ClkInit(); + FPUInit(); + PeripheralsClockEnable(); + remapCheck(); +} diff --git a/Лицензионное соглашение [CANOpen].txt b/Лицензионное соглашение [CANOpen].txt new file mode 100644 index 0000000..4a4048d --- /dev/null +++ b/Лицензионное соглашение [CANOpen].txt @@ -0,0 +1,42 @@ +ВНИМАНИЕ! +ЕСЛИ ВЫ ЗАГРУЖАЕТЕ ИЗ СЕТИ ИНТЕРНЕТ, КОПИРУЕТЕ ИЛИ КАКИМ-ЛИБО ДРУГИМ СПОСОБОМ ИСПОЛЬЗУЕТЕ ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ (ПРОДУКТ), ТО ВЫ ПОДТВЕРЖДАЕТЕ СВОЕ СОГЛАСИЕ С УСЛОВИЯМИ ПРЕДСТАВЛЕННОГО НИЖЕ ЛИЦЕНЗИОННОГО СОГЛАШЕНИЯ (ст.1286 ГК РФ). + +Настоящий документ «Лицензионное соглашение с конечным пользователем» (EULA) представляет собой предложение АО «НИИЭТ» и ООО «НПФ ВЕКТОР» (далее — «Правообладатели») заключить соглашение на изложенных ниже условиях. + +1. Термины и определения +Используемые в настоящем Лицензионном соглашении слова и выражения имеют следующие значения, если иное прямо не определено далее по тексту: +а) Лицензия (Соглашение) — текст настоящего документа, распространяемого совместно с Продуктом на любом электронном носителе информации, либо через интернет. +б) Пользователь — лицо, заключившее настоящее Соглашение с Правообладателем в своём или чужом интересе в соответствии с требованиями действующего законодательства и настоящего Соглашения. +в) Продукт — принадлежащий Правообладателям сборник подпрограмм в виде любой из библиотек: «libCANOpen_drv.a», «libCANOpen_drv_CAN1.a», «libCANOpen_drv_CAN2.a», «libCANOpen_drv.mcl», «libCANOpen_drv_CAN1.mcl», «libCANOpen_drv_CAN2.mcl», включая настоящее Соглашение, которые правомерно находятся у конечного Пользователя. + + +2. Лицензия на использование программного продукта +2.1. По настоящему Соглашению Правообладатели предоставляют Пользователю право использования Продукта на условиях простой (неисключительной) лицензии. +2.2. Для заключения настоящего Соглашения на изложенных в нём условиях достаточно совершения Пользователем любого из указанных ниже действий: +• установка (копирование) Продукта на ЭВМ, в том числе в составе других программных модулей и/или проектов программного обеспечения (ПО); +• компоновка (сборка исполнимого модуля) проекта ПО, в состав которого входит данный Продукт; +• загрузка в микроконтроллер исполнимого модуля, собранного с использованием данного Продукта. + +Выполнение указанных выше действий подтверждает ознакомление и полное безоговорочное принятие Пользователем условий, изложенных в настоящем Соглашении, и создает между Пользователем и Правообладателем договор на приведенных условиях в соответствии с положениями ст.437 и 438 ГК РФ. +2.3. Пользователь вправе использовать Продукт в соответствии с условиями настоящего Соглашения следующими способами (с учетом п.3 настоящего Соглашения): +• Пользователь вправе использовать Продукт любым способом, по своему усмотрению, в том числе для извлечения собственной выгоды путём распространения третьим лицам, при условии, что с Продуктом поставляется данное лицензионное Соглашение в неизменном виде и сам продукт передается третьим лицам на безвозмездной основе. +3. Ограничения использования программного продукта +3.1. Пользователь не имеет права самостоятельно или с привлечением третьих лиц дизассемблировать, декомпилировать, дешифровать, модифицировать, производить пошаговую отладку или иные аналогичные действия с Продуктом. +3.2. Пользователь обязан информировать Правообладателей о всех обнаруженных ошибках в работе Продукта с указанием условий их появления для возможности их устранения Правообладателями. +3.3. Пользователь не имеет права удалять или любым способом изменять товарные знаки и уведомления об авторских или любых иных правах, включенные в состав Продукта. +3.4. Пользователь не имеет права удалять из Продукта или любым способом изменять данное лицензионное Соглашение. + +4. Ответственность по Лицензии +4.1. Ввиду предоставления в рамках Лицензии права использования Продукта на безвозмездной основе к отношениям сторон по Лицензии не применимы положения законодательства о защите прав потребителей. +4.2. Правообладатели могут (но не обязаны) оказывать техническую поддержку Пользователю. +4.3. Правообладатели распространяют любые редакции Продукта в виде «как есть», без каких-либо гарантий его корректной работы, на условиях использования, обозначенных в п.2.3 настоящего Соглашения. +4.4. Правообладатели не несут никакой ответственности за вид и способы использования Продукта Пользователем. +4.5. Правообладатели не несут никакой ответственности за убыток или ущерб, включая, в том числе, косвенный или сопутствующий убыток и ущерб, и в целом любой убыток и ущерб, возникший в результате потери данных или упущенной выгоды, или возникший в результате или в связи с использованием данного Продукта. +4.6. Правообладатели вправе по собственному усмотрению, без предварительного уведомления Пользователя производить доработку Продукта, изменять функциональные возможности и/или состав Продукта, в том числе, выпускать обновленный Продукт под новой Лицензией. +4.7. Пользователь несет ответственность за любое нарушение обязательств, установленных настоящим Соглашением и (или) применимым правом, а также за все последствия таких нарушений (включая любые убытки, которые могут понести Правообладатели и иные третьи лица). +4.8. Правообладатели оставляют за собой право преследования нарушителей исключительных прав на Продукт в соответствии с гражданским, административным и уголовным законодательством Российской Федерации по своему усмотрению. + +5. Заключительные положения +5.1. Настоящее Соглашение, порядок его заключения и исполнения, а также вопросы, не урегулированные настоящим Соглашением, регулируются действующим законодательством Российской Федерации. +5.2. Все споры по Соглашению или в связи с ним, не урегулированные путем переговоров между Правообладателем и Пользователем, подлежат рассмотрению в суде по месту нахождения Правообладателя в соответствии с действующим процессуальным правом Российской Федерации. Реквизиты Правообладателей доступны на официальных сайтах: http://niiet.ru, http://motorcontrol.ru +