初始版本

This commit is contained in:
2026-04-23 14:02:03 +08:00
parent d68cb4273f
commit bbd563b069
121 changed files with 94711 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<component_viewer schemaVersion="0.1" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:noNamespaceSchemaLocation="Component_Viewer.xsd">
<component name="EventRecorderStub" version="1.0.0"/> <!--name and version of the component-->
<events>
</events>
</component_viewer>
+35
View File
@@ -0,0 +1,35 @@
[BREAKPOINTS]
ForceImpTypeAny = 0
ShowInfoWin = 1
EnableFlashBP = 2
BPDuringExecution = 0
[CFI]
CFISize = 0x00
CFIAddr = 0x00
[CPU]
OverrideMemMap = 0
AllowSimulation = 1
ScriptFile=""
[FLASH]
CacheExcludeSize = 0x00
CacheExcludeAddr = 0x00
MinNumBytesFlashDL = 0
SkipProgOnCRCMatch = 1
VerifyDownload = 1
AllowCaching = 1
EnableFlashDL = 2
Override = 1
Device="Cortex-M0+"
[GENERAL]
WorkRAMSize = 0x00
WorkRAMAddr = 0x00
RAMUsageLimit = 0x00
[SWO]
SWOLogFile=""
[MEM]
RdOverrideOrMask = 0x00
RdOverrideAndMask = 0xFFFFFFFF
RdOverrideAddr = 0xFFFFFFFF
WrOverrideOrMask = 0x00
WrOverrideAndMask = 0xFFFFFFFF
WrOverrideAddr = 0xFFFFFFFF
+79
View File
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-05-24 the first version
*/
#include <rthw.h>
#include <rtthread.h>
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
*/
#define RT_HEAP_SIZE (15*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void)
{
return rt_heap;
}
RT_WEAK void *rt_heap_end_get(void)
{
return rt_heap + RT_HEAP_SIZE;
}
#endif
void rt_os_tick_callback(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
/**
* This function will initial your board.
*/
void rt_hw_board_init(void)
{
#error "TODO 1: OS Tick Configuration."
/*
* TODO 1: OS Tick Configuration
* Enable the hardware timer and call the rt_os_tick_callback function
* periodically with the frequency RT_TICK_PER_SECOND.
*/
/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}
#ifdef RT_USING_CONSOLE
static int uart_init(void)
{
#error "TODO 2: Enable the hardware uart and config baudrate."
return 0;
}
INIT_BOARD_EXPORT(uart_init);
void rt_hw_console_output(const char *str)
{
#error "TODO 3: Output the string 'str' through the uart."
}
#endif
+79
View File
@@ -0,0 +1,79 @@
/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-05-24 the first version
*/
#include <rthw.h>
#include <rtthread.h>
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
* Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
* the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
*/
#define RT_HEAP_SIZE (15*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];
RT_WEAK void *rt_heap_begin_get(void)
{
return rt_heap;
}
RT_WEAK void *rt_heap_end_get(void)
{
return rt_heap + RT_HEAP_SIZE;
}
#endif
void rt_os_tick_callback(void)
{
rt_interrupt_enter();
rt_tick_increase();
rt_interrupt_leave();
}
/**
* This function will initial your board.
*/
void rt_hw_board_init(void)
{
#error "TODO 1: OS Tick Configuration."
/*
* TODO 1: OS Tick Configuration
* Enable the hardware timer and call the rt_os_tick_callback function
* periodically with the frequency RT_TICK_PER_SECOND.
*/
/* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
rt_components_board_init();
#endif
#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}
#ifdef RT_USING_CONSOLE
static int uart_init(void)
{
#error "TODO 2: Enable the hardware uart and config baudrate."
return 0;
}
INIT_BOARD_EXPORT(uart_init);
void rt_hw_console_output(const char *str)
{
#error "TODO 3: Output the string 'str' through the uart."
}
#endif
+29
View File
@@ -0,0 +1,29 @@
/* FinSH config file */
#ifndef __MSH_CFG_H__
#define __MSH_CFG_H__
// <<< Use Configuration Wizard in Context Menu >>>
#define RT_USING_FINSH
#define FINSH_USING_MSH
#define FINSH_USING_MSH_ONLY
// <h>FinSH Configuration
// <o>the priority of finsh thread <1-30>
// <i>the priority of finsh thread
// <i>Default: 21
#define FINSH_THREAD_PRIORITY 21
// <o>the stack of finsh thread <1-4096>
// <i>the stack of finsh thread
// <i>Default: 4096 (4096Byte)
#define FINSH_THREAD_STACK_SIZE 1024
#define FINSH_USING_SYMTAB
// <c1>Enable command description
// <i>Enable command description
#define FINSH_USING_DESCRIPTION
// </c>
// </h>
// <<< end of configuration section >>>
#endif
+29
View File
@@ -0,0 +1,29 @@
/* FinSH config file */
#ifndef __MSH_CFG_H__
#define __MSH_CFG_H__
// <<< Use Configuration Wizard in Context Menu >>>
#define RT_USING_FINSH
#define FINSH_USING_MSH
#define FINSH_USING_MSH_ONLY
// <h>FinSH Configuration
// <o>the priority of finsh thread <1-30>
// <i>the priority of finsh thread
// <i>Default: 21
#define FINSH_THREAD_PRIORITY 21
// <o>the stack of finsh thread <1-4096>
// <i>the stack of finsh thread
// <i>Default: 4096 (4096Byte)
#define FINSH_THREAD_STACK_SIZE 1024
#define FINSH_USING_SYMTAB
// <c1>Enable command description
// <i>Enable command description
#define FINSH_USING_DESCRIPTION
// </c>
// </h>
// <<< end of configuration section >>>
#endif
+30
View File
@@ -0,0 +1,30 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*/
#include <rthw.h>
#include <rtconfig.h>
#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h
#endif
#ifdef RT_USING_FINSH
RT_WEAK char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
#error "TODO 4: Read a char from the uart and assign it to 'ch'."
return ch;
}
#endif /* RT_USING_FINSH */
+30
View File
@@ -0,0 +1,30 @@
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
*/
#include <rthw.h>
#include <rtconfig.h>
#ifndef RT_USING_FINSH
#error Please uncomment the line <#include "finsh_config.h"> in the rtconfig.h
#endif
#ifdef RT_USING_FINSH
RT_WEAK char rt_hw_console_getchar(void)
{
/* Note: the initial value of ch must < 0 */
int ch = -1;
#error "TODO 4: Read a char from the uart and assign it to 'ch'."
return ch;
}
#endif /* RT_USING_FINSH */
+139
View File
@@ -0,0 +1,139 @@
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
// <<< Use Configuration Wizard in Context Menu >>>
// <h>Basic Configuration
// <o>Maximal level of thread priority <8-256>
// <i>Default: 32
#define RT_THREAD_PRIORITY_MAX 32
// <o>OS tick per second
// <i>Default: 1000 (1ms)
#define RT_TICK_PER_SECOND 1000
// <o>Alignment size for CPU architecture data access
// <i>Default: 4
#define RT_ALIGN_SIZE 4
// <o>the max length of object name<2-16>
// <i>Default: 8
#define RT_NAME_MAX 8
// <c1>Using RT-Thread components initialization
// <i>Using RT-Thread components initialization
#define RT_USING_COMPONENTS_INIT
// </c>
#define RT_USING_USER_MAIN
// <o>the stack size of main thread<1-4086>
// <i>Default: 512
#define RT_MAIN_THREAD_STACK_SIZE 256
// </h>
// <h>Debug Configuration
// <c1>enable kernel debug configuration
// <i>Default: enable kernel debug configuration
//#define RT_DEBUG
// </c>
// <o>enable components initialization debug configuration<0-1>
// <i>Default: 0
#define RT_DEBUG_INIT 0
// <c1>thread stack over flow detect
// <i> Diable Thread stack over flow detect
//#define RT_USING_OVERFLOW_CHECK
// </c>
// </h>
// <h>Hook Configuration
// <c1>using hook
// <i>using hook
//#define RT_USING_HOOK
// </c>
// <c1>using idle hook
// <i>using idle hook
//#define RT_USING_IDLE_HOOK
// </c>
// </h>
// <e>Software timers Configuration
// <i> Enables user timers
#define RT_USING_TIMER_SOFT 0
#if RT_USING_TIMER_SOFT == 0
#undef RT_USING_TIMER_SOFT
#endif
// <o>The priority level of timer thread <0-31>
// <i>Default: 4
#define RT_TIMER_THREAD_PRIO 4
// <o>The stack size of timer thread <0-8192>
// <i>Default: 512
#define RT_TIMER_THREAD_STACK_SIZE 512
// </e>
// <h>IPC(Inter-process communication) Configuration
// <c1>Using Semaphore
// <i>Using Semaphore
#define RT_USING_SEMAPHORE
// </c>
// <c1>Using Mutex
// <i>Using Mutex
//#define RT_USING_MUTEX
// </c>
// <c1>Using Event
// <i>Using Event
//#define RT_USING_EVENT
// </c>
// <c1>Using MailBox
// <i>Using MailBox
#define RT_USING_MAILBOX
// </c>
// <c1>Using Message Queue
// <i>Using Message Queue
//#define RT_USING_MESSAGEQUEUE
// </c>
// </h>
// <h>Memory Management Configuration
// <c1>Memory Pool Management
// <i>Memory Pool Management
//#define RT_USING_MEMPOOL
// </c>
// <c1>Dynamic Heap Management(Algorithm: small memory )
// <i>Dynamic Heap Management
#define RT_USING_HEAP
#define RT_USING_SMALL_MEM
// </c>
// <c1>using tiny size of memory
// <i>using tiny size of memory
//#define RT_USING_TINY_SIZE
// </c>
// </h>
// <h>Console Configuration
// <c1>Using console
// <i>Using console
//#define RT_USING_CONSOLE
// </c>
// <o>the buffer size of console <1-1024>
// <i>the buffer size of console
// <i>Default: 128 (128Byte)
#define RT_CONSOLEBUF_SIZE 256
// </h>
// <h>FinSH Configuration
// <c1>include finsh config
// <i>Select this choice if you using FinSH
//#include "finsh_config.h"
// </c>
// </h>
// <h>Device Configuration
// <c1>using device framework
// <i>using device framework
//#define RT_USING_DEVICE
// </c>
// </h>
// <<< end of configuration section >>>
#endif
+139
View File
@@ -0,0 +1,139 @@
/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
// <<< Use Configuration Wizard in Context Menu >>>
// <h>Basic Configuration
// <o>Maximal level of thread priority <8-256>
// <i>Default: 32
#define RT_THREAD_PRIORITY_MAX 32
// <o>OS tick per second
// <i>Default: 1000 (1ms)
#define RT_TICK_PER_SECOND 1000
// <o>Alignment size for CPU architecture data access
// <i>Default: 4
#define RT_ALIGN_SIZE 4
// <o>the max length of object name<2-16>
// <i>Default: 8
#define RT_NAME_MAX 8
// <c1>Using RT-Thread components initialization
// <i>Using RT-Thread components initialization
#define RT_USING_COMPONENTS_INIT
// </c>
#define RT_USING_USER_MAIN
// <o>the stack size of main thread<1-4086>
// <i>Default: 512
#define RT_MAIN_THREAD_STACK_SIZE 256
// </h>
// <h>Debug Configuration
// <c1>enable kernel debug configuration
// <i>Default: enable kernel debug configuration
//#define RT_DEBUG
// </c>
// <o>enable components initialization debug configuration<0-1>
// <i>Default: 0
#define RT_DEBUG_INIT 0
// <c1>thread stack over flow detect
// <i> Diable Thread stack over flow detect
//#define RT_USING_OVERFLOW_CHECK
// </c>
// </h>
// <h>Hook Configuration
// <c1>using hook
// <i>using hook
//#define RT_USING_HOOK
// </c>
// <c1>using idle hook
// <i>using idle hook
//#define RT_USING_IDLE_HOOK
// </c>
// </h>
// <e>Software timers Configuration
// <i> Enables user timers
#define RT_USING_TIMER_SOFT 0
#if RT_USING_TIMER_SOFT == 0
#undef RT_USING_TIMER_SOFT
#endif
// <o>The priority level of timer thread <0-31>
// <i>Default: 4
#define RT_TIMER_THREAD_PRIO 4
// <o>The stack size of timer thread <0-8192>
// <i>Default: 512
#define RT_TIMER_THREAD_STACK_SIZE 512
// </e>
// <h>IPC(Inter-process communication) Configuration
// <c1>Using Semaphore
// <i>Using Semaphore
#define RT_USING_SEMAPHORE
// </c>
// <c1>Using Mutex
// <i>Using Mutex
//#define RT_USING_MUTEX
// </c>
// <c1>Using Event
// <i>Using Event
//#define RT_USING_EVENT
// </c>
// <c1>Using MailBox
// <i>Using MailBox
#define RT_USING_MAILBOX
// </c>
// <c1>Using Message Queue
// <i>Using Message Queue
//#define RT_USING_MESSAGEQUEUE
// </c>
// </h>
// <h>Memory Management Configuration
// <c1>Memory Pool Management
// <i>Memory Pool Management
//#define RT_USING_MEMPOOL
// </c>
// <c1>Dynamic Heap Management(Algorithm: small memory )
// <i>Dynamic Heap Management
#define RT_USING_HEAP
#define RT_USING_SMALL_MEM
// </c>
// <c1>using tiny size of memory
// <i>using tiny size of memory
//#define RT_USING_TINY_SIZE
// </c>
// </h>
// <h>Console Configuration
// <c1>Using console
// <i>Using console
//#define RT_USING_CONSOLE
// </c>
// <o>the buffer size of console <1-1024>
// <i>the buffer size of console
// <i>Default: 128 (128Byte)
#define RT_CONSOLEBUF_SIZE 256
// </h>
// <h>FinSH Configuration
// <c1>include finsh config
// <i>Select this choice if you using FinSH
//#include "finsh_config.h"
// </c>
// </h>
// <h>Device Configuration
// <c1>using device framework
// <i>using device framework
//#define RT_USING_DEVICE
// </c>
// </h>
// <<< end of configuration section >>>
#endif
+21
View File
@@ -0,0 +1,21 @@
/*
* Auto generated Run-Time-Environment Configuration File
* *** Do not modify ! ***
*
* Project: 'hc32l17x'
* Target: 'HC32L17X'
*/
#ifndef RTE_COMPONENTS_H
#define RTE_COMPONENTS_H
/*
* Define the Device Header File:
*/
#define CMSIS_device_header "HC32L170JATA.h"
#endif /* RTE_COMPONENTS_H */
@@ -0,0 +1,20 @@
/*
* Auto generated Run-Time-Environment Component Configuration File
* *** Do not modify ! ***
*
* Project: 'ddl_template'
* Target: '{FEATURE}_Release'
*/
#ifndef RTE_COMPONENTS_H
#define RTE_COMPONENTS_H
/*
* Define the Device Header File:
*/
#define CMSIS_device_header "ARMCM0plus.h"
#endif /* RTE_COMPONENTS_H */
@@ -0,0 +1,21 @@
/*
* Auto generated Run-Time-Environment Configuration File
* *** Do not modify ! ***
*
* Project: 'hc32l17x'
* Target: 'template_Release'
*/
#ifndef RTE_COMPONENTS_H
#define RTE_COMPONENTS_H
/*
* Define the Device Header File:
*/
#define CMSIS_device_header "ARMCM0plus.h"
#endif /* RTE_COMPONENTS_H */
+798
View File
@@ -0,0 +1,798 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_optx.xsd">
<SchemaVersion>1.0</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Extensions>
<cExt>*.c</cExt>
<aExt>*.s*; *.src; *.a*</aExt>
<oExt>*.obj; *.o</oExt>
<lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc; *.md</tExt>
<pExt>*.plm</pExt>
<CppX>*.cpp; *.cc; *.cxx</CppX>
<nMigrate>0</nMigrate>
</Extensions>
<DaveTm>
<dwLowDateTime>0</dwLowDateTime>
<dwHighDateTime>0</dwHighDateTime>
</DaveTm>
<Target>
<TargetName>HC32L17X</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<TargetOption>
<CLKADS>12000000</CLKADS>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
<RunSim>0</RunSim>
<RunTarget>1</RunTarget>
<RunAbUc>0</RunAbUc>
</OPTTT>
<OPTHX>
<HexSelection>1</HexSelection>
<FlashByte>65535</FlashByte>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
</OPTHX>
<OPTLEX>
<PageWidth>79</PageWidth>
<PageLength>66</PageLength>
<TabStop>8</TabStop>
<ListingPath>.\output\release\</ListingPath>
</OPTLEX>
<ListingPage>
<CreateCListing>1</CreateCListing>
<CreateAListing>1</CreateAListing>
<CreateLListing>1</CreateLListing>
<CreateIListing>0</CreateIListing>
<AsmCond>1</AsmCond>
<AsmSymb>1</AsmSymb>
<AsmXref>0</AsmXref>
<CCond>1</CCond>
<CCode>0</CCode>
<CListInc>0</CListInc>
<CSymb>0</CSymb>
<LinkerCodeListing>0</LinkerCodeListing>
</ListingPage>
<OPTXL>
<LMap>1</LMap>
<LComments>1</LComments>
<LGenerateSymbols>1</LGenerateSymbols>
<LLibSym>1</LLibSym>
<LLines>1</LLines>
<LLocSym>1</LLocSym>
<LPubSym>1</LPubSym>
<LXref>0</LXref>
<LExpSel>0</LExpSel>
</OPTXL>
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>255</CpuCode>
<DebugOpt>
<uSim>0</uSim>
<uTrg>1</uTrg>
<sLdApp>1</sLdApp>
<sGomain>1</sGomain>
<sRbreak>1</sRbreak>
<sRwatch>1</sRwatch>
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tGomain>1</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>12</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon>BIN\CMSIS_AGDI.dll</pMon>
</DebugOpt>
<TargetDriverDllRegistry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGUARM</Key>
<Name></Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>CMSIS_AGDI</Key>
<Name>-X"Any" -UAny -O206 -S8 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0FlashHC32L17X_128K.FLM -FS00 -FL020000 -FP0($$Device:HC32L170JATA$Flash\FlashHC32L17X_128K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>UL2CM3</Key>
<Name>UL2CM3(-S0 -C0 -P0 ) -FN1 -FC1000 -FD20000000 -FF0FlashHC32L17X_128K -FL020000 -FS00 -FP0($$Device:HC32L170JATA$Flash\FlashHC32L17X_128K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>JL2CM3</Key>
<Name>-U4294967295 -O78 -S1 -ZTIFSpeedSel10000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(0BC11477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC1000 -FN1 -FF0FlashHC32L17X_128K.FLM -FS00 -FL020000 -FP0($$Device:HC32L170JATA$Flash\FlashHC32L17X_128K.FLM)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMRTXEVENTFLAGS</Key>
<Name>-L70 -Z18 -C0 -M0 -T1</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>DLGTARM</Key>
<Name>(1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)</Name>
</SetRegEntry>
<SetRegEntry>
<Number>0</Number>
<Key>ARMDBGFLAGS</Key>
<Name></Name>
</SetRegEntry>
</TargetDriverDllRegistry>
<Breakpoint/>
<WatchWindow1>
<Ww>
<count>0</count>
<WinNumber>1</WinNumber>
<ItemText>App.Login2Min30SCount,0x0A</ItemText>
</Ww>
<Ww>
<count>1</count>
<WinNumber>1</WinNumber>
<ItemText>App.TD1mSDelayCnt,0x0A</ItemText>
</Ww>
<Ww>
<count>2</count>
<WinNumber>1</WinNumber>
<ItemText>App.Nonce,0x0A</ItemText>
</Ww>
<Ww>
<count>3</count>
<WinNumber>1</WinNumber>
<ItemText>App.RDStatus,0x0A</ItemText>
</Ww>
<Ww>
<count>4</count>
<WinNumber>1</WinNumber>
<ItemText>SGCP.TimingAcquisition</ItemText>
</Ww>
<Ww>
<count>5</count>
<WinNumber>1</WinNumber>
<ItemText>App.Para.Layout.CollectTime,0x0A</ItemText>
</Ww>
<Ww>
<count>6</count>
<WinNumber>1</WinNumber>
<ItemText>App.Para.Layout.ReportInterval,0x0A</ItemText>
</Ww>
<Ww>
<count>7</count>
<WinNumber>1</WinNumber>
<ItemText>App.Para.Layout.ERInterval,0x0A</ItemText>
</Ww>
<Ww>
<count>8</count>
<WinNumber>1</WinNumber>
<ItemText>App.Para.Layout.ERTime,0x0A</ItemText>
</Ww>
<Ww>
<count>9</count>
<WinNumber>1</WinNumber>
<ItemText>App.Para.Layout.TimeStamp,0x0A</ItemText>
</Ww>
<Ww>
<count>10</count>
<WinNumber>1</WinNumber>
<ItemText>SGCP.DeviceData</ItemText>
</Ww>
<Ww>
<count>11</count>
<WinNumber>1</WinNumber>
<ItemText>SGCP.GatewayBuff</ItemText>
</Ww>
<Ww>
<count>12</count>
<WinNumber>1</WinNumber>
<ItemText>VBAT_12V,0x0A</ItemText>
</Ww>
<Ww>
<count>13</count>
<WinNumber>1</WinNumber>
<ItemText>i,0x0A</ItemText>
</Ww>
<Ww>
<count>14</count>
<WinNumber>1</WinNumber>
<ItemText>VBAT_Percentage,0x0A</ItemText>
</Ww>
<Ww>
<count>15</count>
<WinNumber>1</WinNumber>
<ItemText>App.Tcnt,0x0A</ItemText>
</Ww>
<Ww>
<count>16</count>
<WinNumber>1</WinNumber>
<ItemText>App.Status,0x0A</ItemText>
</Ww>
<Ww>
<count>17</count>
<WinNumber>1</WinNumber>
<ItemText>App.TestTimeCnt,0x0A</ItemText>
</Ww>
<Ww>
<count>18</count>
<WinNumber>1</WinNumber>
<ItemText>App.LaserFlag,0x0A</ItemText>
</Ww>
</WatchWindow1>
<MemoryWindow1>
<Mm>
<WinNumber>1</WinNumber>
<SubType>0</SubType>
<ItemText>0x1fe00</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow1>
<MemoryWindow2>
<Mm>
<WinNumber>2</WinNumber>
<SubType>2</SubType>
<ItemText>0x20000f35</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow2>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
<aPa>0</aPa>
<viewmode>1</viewmode>
<vrSel>0</vrSel>
<aSym>0</aSym>
<aTbox>0</aTbox>
<AscS1>0</AscS1>
<AscS2>0</AscS2>
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>0</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
</DebugFlag>
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
<DebugDescription>
<Enable>1</Enable>
<EnableFlashSeq>0</EnableFlashSeq>
<EnableLog>0</EnableLog>
<Protocol>2</Protocol>
<DbgClock>10000000</DbgClock>
</DebugDescription>
</TargetOption>
</Target>
<Group>
<GroupName>common</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>1</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\startup_hc32l17x.s</PathWithFileName>
<FilenameWithoutPath>startup_hc32l17x.s</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\mcu\common\system_hc32l17x.c</PathWithFileName>
<FilenameWithoutPath>system_hc32l17x.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>3</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\mcu\common\interrupts_hc32l17x.c</PathWithFileName>
<FilenameWithoutPath>interrupts_hc32l17x.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>source</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>4</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\Src\main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>5</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\src\bsp.c</PathWithFileName>
<FilenameWithoutPath>bsp.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>6</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\src\Algorithm.c</PathWithFileName>
<FilenameWithoutPath>Algorithm.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\src\SGCP.c</PathWithFileName>
<FilenameWithoutPath>SGCP.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>2</GroupNumber>
<FileNumber>8</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\source\src\Update.c</PathWithFileName>
<FilenameWithoutPath>Update.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>driver</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>9</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\dmac.c</PathWithFileName>
<FilenameWithoutPath>dmac.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>10</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\flash.c</PathWithFileName>
<FilenameWithoutPath>flash.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>11</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\gpio.c</PathWithFileName>
<FilenameWithoutPath>gpio.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>12</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\lpm.c</PathWithFileName>
<FilenameWithoutPath>lpm.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>13</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\lpuart.c</PathWithFileName>
<FilenameWithoutPath>lpuart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>14</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\spi.c</PathWithFileName>
<FilenameWithoutPath>spi.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>15</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\uart.c</PathWithFileName>
<FilenameWithoutPath>uart.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>16</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\wdt.c</PathWithFileName>
<FilenameWithoutPath>wdt.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>17</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\ddl.c</PathWithFileName>
<FilenameWithoutPath>ddl.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>18</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\sysctrl.c</PathWithFileName>
<FilenameWithoutPath>sysctrl.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>19</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\reset.c</PathWithFileName>
<FilenameWithoutPath>reset.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>20</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\lptim.c</PathWithFileName>
<FilenameWithoutPath>lptim.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>21</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\rtc.c</PathWithFileName>
<FilenameWithoutPath>rtc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>22</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\trim.c</PathWithFileName>
<FilenameWithoutPath>trim.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>23</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\i2c.c</PathWithFileName>
<FilenameWithoutPath>i2c.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>24</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\bt.c</PathWithFileName>
<FilenameWithoutPath>bt.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>25</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\adc.c</PathWithFileName>
<FilenameWithoutPath>adc.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>3</GroupNumber>
<FileNumber>26</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\driver\src\bgr.c</PathWithFileName>
<FilenameWithoutPath>bgr.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Debug</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>4</GroupNumber>
<FileNumber>27</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Module\Debug\UartDebug.c</PathWithFileName>
<FilenameWithoutPath>UartDebug.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>LSM6DSL</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>28</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Module\lsm6dsl\lsm6dsl_reg.c</PathWithFileName>
<FilenameWithoutPath>lsm6dsl_reg.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>5</GroupNumber>
<FileNumber>29</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Module\lsm6dsl\lsm6dsl_app.c</PathWithFileName>
<FilenameWithoutPath>lsm6dsl_app.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>MMC5893</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>6</GroupNumber>
<FileNumber>30</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Module\MMC5983\mmc5983.c</PathWithFileName>
<FilenameWithoutPath>mmc5983.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>LORA</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>7</GroupNumber>
<FileNumber>31</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Module\LORA\sx127x.c</PathWithFileName>
<FilenameWithoutPath>sx127x.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>Imu</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>8</GroupNumber>
<FileNumber>32</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\Module\Imu\Imu.c</PathWithFileName>
<FilenameWithoutPath>Imu.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>ReadMe</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>9</GroupNumber>
<FileNumber>33</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>..\ReadMe.txt</PathWithFileName>
<FilenameWithoutPath>ReadMe.txt</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>1</RteFlg>
</Group>
</ProjectOpt>
+650
View File
@@ -0,0 +1,650 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_projx.xsd">
<SchemaVersion>2.1</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Targets>
<Target>
<TargetName>HC32L17X</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pArmCC>6160000::V6.16::ARMCLANG</pArmCC>
<pCCUsed>6160000::V6.16::ARMCLANG</pCCUsed>
<uAC6>1</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>HC32L170JATA</Device>
<Vendor>HDSC</Vendor>
<PackID>HDSC.HC32L17X.1.0.1</PackID>
<PackURL>https://raw.githubusercontent.com/hdscmcu/pack/master/</PackURL>
<Cpu>IRAM(0x20000000,0x4000) IROM(0x00000000,0x20000) CPUTYPE("Cortex-M0+") CLOCK(12000000) ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
<FlashDriverDll>UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0FlashHC32L17X_128K -FS00 -FL020000 -FP0($$Device:HC32L170JATA$Flash\FlashHC32L17X_128K.FLM))</FlashDriverDll>
<DeviceId>0</DeviceId>
<RegisterFile>$$Device:HC32L170JATA$Device\Include\HC32L170JATA.h</RegisterFile>
<MemoryEnv></MemoryEnv>
<Cmp></Cmp>
<Asm></Asm>
<Linker></Linker>
<OHString></OHString>
<InfinionOptionDll></InfinionOptionDll>
<SLE66CMisc></SLE66CMisc>
<SLE66AMisc></SLE66AMisc>
<SLE66LinkerMisc></SLE66LinkerMisc>
<SFDFile>$$Device:HC32L170JATA$SVD\HC32L170JATA.sfr</SFDFile>
<bCustSvd>1</bCustSvd>
<UseEnv>0</UseEnv>
<BinPath></BinPath>
<IncludePath></IncludePath>
<LibPath></LibPath>
<RegisterFilePath></RegisterFilePath>
<DBRegisterFilePath></DBRegisterFilePath>
<TargetStatus>
<Error>0</Error>
<ExitCodeStop>0</ExitCodeStop>
<ButtonStop>0</ButtonStop>
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>.\output\</OutputDirectory>
<OutputName>hc32l17x</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>
<DebugInformation>1</DebugInformation>
<BrowseInformation>1</BrowseInformation>
<ListingPath>.\output\release\</ListingPath>
<HexFormatSelection>1</HexFormatSelection>
<Merge32K>0</Merge32K>
<CreateBatchFile>0</CreateBatchFile>
<BeforeCompile>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopU1X>0</nStopU1X>
<nStopU2X>0</nStopU2X>
</BeforeCompile>
<BeforeMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopB1X>0</nStopB1X>
<nStopB2X>0</nStopB2X>
</BeforeMake>
<AfterMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>1</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name>D:\Keil5\ARM\ARMCC\bin\fromelf.exe --bin -o .\output\app.bin .\output\hc32l17x.axf</UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopA1X>0</nStopA1X>
<nStopA2X>0</nStopA2X>
</AfterMake>
<SelectedForBatchBuild>0</SelectedForBatchBuild>
<SVCSIdString></SVCSIdString>
</TargetCommonOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>0</AlwaysBuild>
<GenerateAssemblyFile>0</GenerateAssemblyFile>
<AssembleAssemblyFile>0</AssembleAssemblyFile>
<PublicsOnly>0</PublicsOnly>
<StopOnExitCode>3</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
</CommonProperty>
<DllOption>
<SimDllName>SARMCM3.DLL</SimDllName>
<SimDllArguments> </SimDllArguments>
<SimDlgDll>DARMCM1.DLL</SimDlgDll>
<SimDlgDllArguments>-pCM0+</SimDlgDllArguments>
<TargetDllName>SARMCM3.DLL</TargetDllName>
<TargetDllArguments> </TargetDllArguments>
<TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
<TargetDlgDllArguments>-pCM0+</TargetDlgDllArguments>
</DllOption>
<DebugOption>
<OPTHX>
<HexSelection>1</HexSelection>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
<Oh166RecLen>16</Oh166RecLen>
</OPTHX>
</DebugOption>
<Utilities>
<Flash1>
<UseTargetDll>1</UseTargetDll>
<UseExternalTool>0</UseExternalTool>
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>1</UpdateFlashBeforeDebugging>
<Capability>1</Capability>
<DriverSelection>4096</DriverSelection>
</Flash1>
<bUseTDR>1</bUseTDR>
<Flash2>BIN\UL2CM3.DLL</Flash2>
<Flash3>"" ()</Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
<pFcArmRoot></pFcArmRoot>
<FcArmLst>0</FcArmLst>
</Utilities>
<TargetArmAds>
<ArmAdsMisc>
<GenerateListings>0</GenerateListings>
<asHll>1</asHll>
<asAsm>1</asAsm>
<asMacX>1</asMacX>
<asSyms>1</asSyms>
<asFals>1</asFals>
<asDbgD>1</asDbgD>
<asForm>1</asForm>
<ldLst>0</ldLst>
<ldmm>1</ldmm>
<ldXref>1</ldXref>
<BigEnd>0</BigEnd>
<AdsALst>0</AdsALst>
<AdsACrf>0</AdsACrf>
<AdsANop>0</AdsANop>
<AdsANot>0</AdsANot>
<AdsLLst>1</AdsLLst>
<AdsLmap>1</AdsLmap>
<AdsLcgr>0</AdsLcgr>
<AdsLsym>1</AdsLsym>
<AdsLszi>1</AdsLszi>
<AdsLtoi>1</AdsLtoi>
<AdsLsun>0</AdsLsun>
<AdsLven>0</AdsLven>
<AdsLsxf>0</AdsLsxf>
<RvctClst>0</RvctClst>
<GenPPlst>0</GenPPlst>
<AdsCpuType>"Cortex-M0+"</AdsCpuType>
<RvctDeviceName></RvctDeviceName>
<mOS>0</mOS>
<uocRom>0</uocRom>
<uocRam>0</uocRam>
<hadIROM>1</hadIROM>
<hadIRAM>1</hadIRAM>
<hadXRAM>0</hadXRAM>
<uocXRam>0</uocXRam>
<RvdsVP>0</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>0</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
<useUlib>1</useUlib>
<EndSel>0</EndSel>
<uLtcg>0</uLtcg>
<nSecure>0</nSecure>
<RoSelD>3</RoSelD>
<RwSelD>3</RwSelD>
<CodeSel>0</CodeSel>
<OptFeed>0</OptFeed>
<NoZi1>0</NoZi1>
<NoZi2>0</NoZi2>
<NoZi3>0</NoZi3>
<NoZi4>0</NoZi4>
<NoZi5>0</NoZi5>
<Ro1Chk>0</Ro1Chk>
<Ro2Chk>0</Ro2Chk>
<Ro3Chk>0</Ro3Chk>
<Ir1Chk>1</Ir1Chk>
<Ir2Chk>0</Ir2Chk>
<Ra1Chk>0</Ra1Chk>
<Ra2Chk>0</Ra2Chk>
<Ra3Chk>0</Ra3Chk>
<Im1Chk>1</Im1Chk>
<Im2Chk>0</Im2Chk>
<OnChipMemories>
<Ocm1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm1>
<Ocm2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm2>
<Ocm3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm3>
<Ocm4>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm4>
<Ocm5>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm5>
<Ocm6>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm6>
<IRAM>
<Type>0</Type>
<StartAddress>0x20000000</StartAddress>
<Size>0x4000</Size>
</IRAM>
<IROM>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x20000</Size>
</IROM>
<XRAM>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRAM>
<OCR_RVCT1>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT1>
<OCR_RVCT2>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT2>
<OCR_RVCT3>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT3>
<OCR_RVCT4>
<Type>1</Type>
<StartAddress>0x2a00</StartAddress>
<Size>0x1d600</Size>
</OCR_RVCT4>
<OCR_RVCT5>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT5>
<OCR_RVCT6>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT6>
<OCR_RVCT7>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT7>
<OCR_RVCT8>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT8>
<OCR_RVCT9>
<Type>0</Type>
<StartAddress>0x20000000</StartAddress>
<Size>0x4000</Size>
</OCR_RVCT9>
<OCR_RVCT10>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</OCR_RVCT10>
</OnChipMemories>
<RvctStartVector></RvctStartVector>
</ArmAdsMisc>
<Cads>
<interw>1</interw>
<Optim>1</Optim>
<oTime>0</oTime>
<SplitLS>0</SplitLS>
<OneElfS>1</OneElfS>
<Strict>0</Strict>
<EnumInt>1</EnumInt>
<PlainCh>0</PlainCh>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<wLevel>3</wLevel>
<uThumb>0</uThumb>
<uSurpInc>0</uSurpInc>
<uC99>1</uC99>
<uGnu>0</uGnu>
<useXO>0</useXO>
<v6Lang>3</v6Lang>
<v6LangP>5</v6LangP>
<vShortEn>0</vShortEn>
<vShortWch>0</vShortWch>
<v6Lto>0</v6Lto>
<v6WtE>0</v6WtE>
<v6Rtti>0</v6Rtti>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath>..\mcu\common;..\source;..\driver\inc;..\source\inc;..\Module\Debug;..\Module\lsm6dsl;..\Module\MMC5983;..\Module\LORA;..\Module\Imu</IncludePath>
</VariousControls>
</Cads>
<Aads>
<interw>1</interw>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<thumb>0</thumb>
<SplitLS>0</SplitLS>
<SwStkChk>0</SwStkChk>
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Aads>
<LDads>
<umfTarg>1</umfTarg>
<Ropi>0</Ropi>
<Rwpi>0</Rwpi>
<noStLib>0</noStLib>
<RepFail>1</RepFail>
<useFile>0</useFile>
<TextAddressRange>0x00000000</TextAddressRange>
<DataAddressRange>0x20000000</DataAddressRange>
<pXoBase></pXoBase>
<ScatterFile>template.sct</ScatterFile>
<IncludeLibs></IncludeLibs>
<IncludeLibsPath></IncludeLibsPath>
<Misc>--keep=*Handler</Misc>
<LinkerInputFile></LinkerInputFile>
<DisabledWarnings></DisabledWarnings>
</LDads>
</TargetArmAds>
</TargetOption>
<Groups>
<Group>
<GroupName>common</GroupName>
<Files>
<File>
<FileName>startup_hc32l17x.s</FileName>
<FileType>2</FileType>
<FilePath>.\startup_hc32l17x.s</FilePath>
</File>
<File>
<FileName>system_hc32l17x.c</FileName>
<FileType>1</FileType>
<FilePath>..\mcu\common\system_hc32l17x.c</FilePath>
</File>
<File>
<FileName>interrupts_hc32l17x.c</FileName>
<FileType>1</FileType>
<FilePath>..\mcu\common\interrupts_hc32l17x.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>source</GroupName>
<Files>
<File>
<FileName>main.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\Src\main.c</FilePath>
</File>
<File>
<FileName>bsp.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\src\bsp.c</FilePath>
</File>
<File>
<FileName>Algorithm.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\src\Algorithm.c</FilePath>
</File>
<File>
<FileName>SGCP.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\src\SGCP.c</FilePath>
</File>
<File>
<FileName>Update.c</FileName>
<FileType>1</FileType>
<FilePath>..\source\src\Update.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>driver</GroupName>
<Files>
<File>
<FileName>dmac.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\dmac.c</FilePath>
</File>
<File>
<FileName>flash.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\flash.c</FilePath>
</File>
<File>
<FileName>gpio.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\gpio.c</FilePath>
</File>
<File>
<FileName>lpm.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\lpm.c</FilePath>
</File>
<File>
<FileName>lpuart.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\lpuart.c</FilePath>
</File>
<File>
<FileName>spi.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\spi.c</FilePath>
</File>
<File>
<FileName>uart.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\uart.c</FilePath>
</File>
<File>
<FileName>wdt.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\wdt.c</FilePath>
</File>
<File>
<FileName>ddl.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\ddl.c</FilePath>
</File>
<File>
<FileName>sysctrl.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\sysctrl.c</FilePath>
</File>
<File>
<FileName>reset.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\reset.c</FilePath>
</File>
<File>
<FileName>lptim.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\lptim.c</FilePath>
</File>
<File>
<FileName>rtc.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\rtc.c</FilePath>
</File>
<File>
<FileName>trim.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\trim.c</FilePath>
</File>
<File>
<FileName>i2c.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\i2c.c</FilePath>
</File>
<File>
<FileName>bt.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\bt.c</FilePath>
</File>
<File>
<FileName>adc.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\adc.c</FilePath>
</File>
<File>
<FileName>bgr.c</FileName>
<FileType>1</FileType>
<FilePath>..\driver\src\bgr.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>Debug</GroupName>
<Files>
<File>
<FileName>UartDebug.c</FileName>
<FileType>1</FileType>
<FilePath>..\Module\Debug\UartDebug.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>LSM6DSL</GroupName>
<Files>
<File>
<FileName>lsm6dsl_reg.c</FileName>
<FileType>1</FileType>
<FilePath>..\Module\lsm6dsl\lsm6dsl_reg.c</FilePath>
</File>
<File>
<FileName>lsm6dsl_app.c</FileName>
<FileType>1</FileType>
<FilePath>..\Module\lsm6dsl\lsm6dsl_app.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>MMC5893</GroupName>
<Files>
<File>
<FileName>mmc5983.c</FileName>
<FileType>1</FileType>
<FilePath>..\Module\MMC5983\mmc5983.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>LORA</GroupName>
<Files>
<File>
<FileName>sx127x.c</FileName>
<FileType>1</FileType>
<FilePath>..\Module\LORA\sx127x.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>Imu</GroupName>
<Files>
<File>
<FileName>Imu.c</FileName>
<FileType>1</FileType>
<FilePath>..\Module\Imu\Imu.c</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>ReadMe</GroupName>
<Files>
<File>
<FileName>ReadMe.txt</FileName>
<FileType>5</FileType>
<FilePath>..\ReadMe.txt</FilePath>
</File>
</Files>
</Group>
<Group>
<GroupName>::CMSIS</GroupName>
</Group>
</Groups>
</Target>
</Targets>
<RTE>
<apis/>
<components>
<component Cclass="CMSIS" Cgroup="CORE" Cvendor="ARM" Cversion="5.5.0" condition="ARMv6_7_8-M Device">
<package name="CMSIS" schemaVersion="1.3" url="http://www.keil.com/pack/" vendor="ARM" version="5.8.0"/>
<targetInfos>
<targetInfo name="HC32L17X"/>
</targetInfos>
</component>
</components>
<files>
<file attr="config" category="source" name="bsp\_template\board.c" version="3.1.5">
<instance index="0" removed="1">RTE\RTOS\board.c</instance>
<component Cbundle="RT-Thread" Cclass="RTOS" Cgroup="kernel" Cvendor="RealThread" Cversion="3.1.5" condition="CMSIS Core with RTOS"/>
<package name="RT-Thread" schemaVersion="1.4" url="https://www.rt-thread.org/download/mdk/" vendor="RealThread" version="3.1.5"/>
<targetInfos/>
</file>
<file attr="config" category="header" name="components\finsh\finsh_config.h" version="3.1.5">
<instance index="0" removed="1">RTE\RTOS\finsh_config.h</instance>
<component Cbundle="RT-Thread" Cclass="RTOS" Cgroup="shell" Cvendor="RealThread" Cversion="3.1.5" condition="shell"/>
<package name="RT-Thread" schemaVersion="1.4" url="https://www.rt-thread.org/download/mdk/" vendor="RealThread" version="3.1.5"/>
<targetInfos/>
</file>
<file attr="config" category="source" name="components\finsh\finsh_port.c" version="3.1.5">
<instance index="0" removed="1">RTE\RTOS\finsh_port.c</instance>
<component Cbundle="RT-Thread" Cclass="RTOS" Cgroup="shell" Cvendor="RealThread" Cversion="3.1.5" condition="shell"/>
<package name="RT-Thread" schemaVersion="1.4" url="https://www.rt-thread.org/download/mdk/" vendor="RealThread" version="3.1.5"/>
<targetInfos/>
</file>
<file attr="config" category="header" name="bsp\_template\rtconfig.h" version="3.1.5">
<instance index="0" removed="1">RTE\RTOS\rtconfig.h</instance>
<component Cbundle="RT-Thread" Cclass="RTOS" Cgroup="kernel" Cvendor="RealThread" Cversion="3.1.5" condition="CMSIS Core with RTOS"/>
<package name="RT-Thread" schemaVersion="1.4" url="https://www.rt-thread.org/download/mdk/" vendor="RealThread" version="3.1.5"/>
<targetInfos/>
</file>
</files>
</RTE>
<LayerInfo>
<Layers>
<Layer>
<LayName>hc32l17x</LayName>
<LayTarg>0</LayTarg>
<LayPrjMark>1</LayPrjMark>
</Layer>
</Layers>
</LayerInfo>
</Project>
+16
View File
@@ -0,0 +1,16 @@
; *************************************************************
; *** Scatter-Loading Description File generated by uVision ***
; *************************************************************
LR_IROM1 0x00002A00 0x0001D600 { ; load region size_region
ER_IROM1 0x00002A00 0x0001D600 { ; load address = execution address
*.o (RESET, +First)
*(InRoot$$Sections)
.ANY (+RO)
.ANY (+XO)
}
RW_IRAM1 0x20000000 0x00004000 { ; RW data
.ANY (+RW +ZI)
}
}
+301
View File
@@ -0,0 +1,301 @@
;/******************************************************************************
;* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
;*
;* This software is owned and published by:
;* Huada Semiconductor Co.,Ltd ("HDSC").
;*
;* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
;* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
;*
;* This software contains source code for use with HDSC
;* components. This software is licensed by HDSC to be adapted only
;* for use in systems utilizing HDSC components. HDSC shall not be
;* responsible for misuse or illegal use of this software for devices not
;* supported herein. HDSC is providing this software "AS IS" and will
;* not be responsible for issues arising from incorrect user implementation
;* of the software.
;*
;* Disclaimer:
;* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
;* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
;* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
;* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
;* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
;* WARRANTY OF NONINFRINGEMENT.
;* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
;* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
;* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
;* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
;* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
;* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
;* SAVINGS OR PROFITS,
;* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
;* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
;* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
;* FROM, THE SOFTWARE.
;*
;* This software may be replicated in part or whole for the licensed use,
;* with the restriction that this Disclaimer and Copyright notice must be
;* included with each copy of this software, whether used in part or whole,
;* at all times.
;*/
;/*****************************************************************************/
;/*****************************************************************************/
;/* Startup for ARM */
;/* Version V1.0 */
;/* Date 2019-03-01 */
;/* Target-mcu {MCU_PN_H} */
;/*****************************************************************************/
; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
Stack_Size EQU 0x00002200
new_vect_table EQU 0x00002A00 ;中断向量偏移长度
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors
DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset
DCD NMI_Handler ; NMI
DCD HardFault_Handler ; Hard Fault
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV
DCD SysTick_Handler ; SysTick
DCD PORTA_IRQHandler
DCD PORTB_IRQHandler
DCD PORTC_E_IRQHandler
DCD PORTD_F_IRQHandler
DCD DMAC_IRQHandler
DCD TIM3_IRQHandler
DCD UART0_2_IRQHandler
DCD UART1_3_IRQHandler
DCD LPUART0_IRQHandler
DCD LPUART1_IRQHandler
DCD SPI0_IRQHandler
DCD SPI1_IRQHandler
DCD I2C0_IRQHandler
DCD I2C1_IRQHandler
DCD TIM0_IRQHandler
DCD TIM1_IRQHandler
DCD TIM2_IRQHandler
DCD LPTIM0_1_IRQHandler
DCD TIM4_IRQHandler
DCD TIM5_IRQHandler
DCD TIM6_IRQHandler
DCD PCA_IRQHandler
DCD WDT_IRQHandler
DCD RTC_IRQHandler
DCD ADC_DAC_IRQHandler
DCD PCNT_IRQHandler
DCD VC0_IRQHandler
DCD VC1_2_IRQHandler
DCD LVD_IRQHandler
DCD LCD_IRQHandler
DCD FLASH_RAM_IRQHandler
DCD CLKTRIM_IRQHandler
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset Handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
;reset NVIC if in rom debug
LDR R0, =0x20000000
LDR R2, =0x0
MOVS R1, #0 ; for warning,
ADD R1, PC,#0 ; for A1609W,
CMP R1, R0
BLS RAMCODE
; ram code base address.
ADD R2, R0,R2
RAMCODE
; reset Vector table address.
LDR R0, =0xE000ED08
LDR R2, =new_vect_table ;升级时打开
STR R2, [R0]
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT PORTA_IRQHandler [WEAK]
EXPORT PORTB_IRQHandler [WEAK]
EXPORT PORTC_E_IRQHandler [WEAK]
EXPORT PORTD_F_IRQHandler [WEAK]
EXPORT DMAC_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT UART0_2_IRQHandler [WEAK]
EXPORT UART1_3_IRQHandler [WEAK]
EXPORT LPUART0_IRQHandler [WEAK]
EXPORT LPUART1_IRQHandler [WEAK]
EXPORT SPI0_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT I2C0_IRQHandler [WEAK]
EXPORT I2C1_IRQHandler [WEAK]
EXPORT TIM0_IRQHandler [WEAK]
EXPORT TIM1_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT LPTIM0_1_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT TIM6_IRQHandler [WEAK]
EXPORT PCA_IRQHandler [WEAK]
EXPORT WDT_IRQHandler [WEAK]
EXPORT RTC_IRQHandler [WEAK]
EXPORT ADC_DAC_IRQHandler [WEAK]
EXPORT PCNT_IRQHandler [WEAK]
EXPORT VC0_IRQHandler [WEAK]
EXPORT VC1_2_IRQHandler [WEAK]
EXPORT LVD_IRQHandler [WEAK]
EXPORT LCD_IRQHandler [WEAK]
EXPORT FLASH_RAM_IRQHandler [WEAK]
EXPORT CLKTRIM_IRQHandler [WEAK]
PORTA_IRQHandler
PORTB_IRQHandler
PORTC_E_IRQHandler
PORTD_F_IRQHandler
DMAC_IRQHandler
TIM3_IRQHandler
UART0_2_IRQHandler
UART1_3_IRQHandler
LPUART0_IRQHandler
LPUART1_IRQHandler
SPI0_IRQHandler
SPI1_IRQHandler
I2C0_IRQHandler
I2C1_IRQHandler
TIM0_IRQHandler
TIM1_IRQHandler
TIM2_IRQHandler
LPTIM0_1_IRQHandler
TIM4_IRQHandler
TIM5_IRQHandler
TIM6_IRQHandler
PCA_IRQHandler
WDT_IRQHandler
RTC_IRQHandler
ADC_DAC_IRQHandler
PCNT_IRQHandler
VC0_IRQHandler
VC1_2_IRQHandler
LVD_IRQHandler
LCD_IRQHandler
FLASH_RAM_IRQHandler
CLKTRIM_IRQHandler
B .
ENDP
ALIGN
; User Initial Stack & Heap
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
+298
View File
@@ -0,0 +1,298 @@
/************************************************************************************************
* 程序版本:V3.0
* 程序日期:2022-11-3
* 程序作者:
************************************************************************************************/
#include "Imu.h"
#include "main.h"
#define Kp_New 0.9f //互补滤波当前数据的权重
#define Kp_Old 0.1f //互补滤波历史数据的权重
#define Acc_Gain 0.0001220f //加速度变成G (初始化加速度满量程-+4g LSBa = 2*4/65535.0)
#define Gyro_Gain 0.0609756f //角速度变成度 (初始化陀螺仪满量程+-2000 LSBg = 2*2000/65535.0)
#define Gyro_Gr 0.0010641f //角速度变成弧度(3.1415/180 * LSBg)
//kp=ki=0 就是完全相信陀螺仪
#define Kp 1.5f // proportional gain governs rate of convergence to accelerometer/magnetometer
//比例增益控制加速度计,磁力计的收敛速率
#define Ki 0.005f // integral gain governs rate of convergence of gyroscope biases
//积分增益控制陀螺偏差的收敛速度
#define halfT 0.005f // half the sample period 采样周期的一半
static volatile float q0 = 1, q1 = 0, q2 = 0, q3 = 0; // quaternion elements representing the estimated orientation
static volatile float exInt = 0, eyInt = 0, ezInt = 0; // scaled integral error
/*
static float MedianValue(float *value_buf, unsigned int size)
{
unsigned int i,j;
float temp;
//排序采用冒泡法
for (j=0;j<=size;j++){
for (i=0;i<=size-j;i++){
if (value_buf[i] > value_buf[i+1]){
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}
return value_buf[(size-1)/2];
}
*/
static float MedianValue(float *value_buf, unsigned int size)
{
unsigned int i;
float temp = 0;
for (i=0; i<size; i++)
temp += value_buf[i];
return temp/size;
}
static float Acc_Filter_X(float in_data)
{
static float value_buf[Imu_AccFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_AccFilterSize)cnt=0;
return MedianValue(value_buf, Imu_AccFilterSize);
}
static float Acc_Filter_Y(float in_data)
{
static float value_buf[Imu_AccFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_AccFilterSize)cnt=0;
return MedianValue(value_buf, Imu_AccFilterSize);
}
static float Acc_Filter_Z(float in_data)
{
static float value_buf[Imu_AccFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_AccFilterSize)cnt=0;
return MedianValue(value_buf, Imu_AccFilterSize);
}
static float Mag_Filter_X(float in_data)
{
static float value_buf[Imu_MagFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_MagFilterSize)cnt=0;
return MedianValue(value_buf, Imu_MagFilterSize);
}
static float Mag_Filter_Y(float in_data)
{
static float value_buf[Imu_MagFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_MagFilterSize)cnt=0;
return MedianValue(value_buf, Imu_MagFilterSize);
}
static float Mag_Filter_Z(float in_data)
{
static float value_buf[Imu_MagFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_MagFilterSize)cnt=0;
return MedianValue(value_buf, Imu_MagFilterSize);
}
static float Gyro_Filter_X(float in_data)
{
static float value_buf[Imu_GyroFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_GyroFilterSize)cnt=0;
return MedianValue(value_buf, Imu_GyroFilterSize);
}
static float Gyro_Filter_Y(float in_data)
{
static float value_buf[Imu_GyroFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_GyroFilterSize)cnt=0;
return MedianValue(value_buf, Imu_GyroFilterSize);
}
static float Gyro_Filter_Z(float in_data)
{
static float value_buf[Imu_GyroFilterSize] = {0};
static unsigned char cnt = 0;
value_buf[cnt] = in_data;
cnt++;
if (cnt>=Imu_GyroFilterSize)cnt=0;
return MedianValue(value_buf, Imu_GyroFilterSize);
}
static float invSqrt(float x) {
float halfx = 0.5f * x;
float y = x;
long i = *(long*)&y;
i = 0x5f3759df - (i>>1);
y = *(float*)&i;
y = y * (1.5f - (halfx * y * y));
return y;
}
static void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)
{
float vx, vy, vz;
float ex, ey, ez;
float norm;
float q0q0 = q0*q0;
float q0q1 = q0*q1;
float q0q2 = q0*q2;
float q0q3 = q0*q3;
float q1q1 = q1*q1;
float q1q2 = q1*q2;
float q1q3 = q1*q3;
float q2q2 = q2*q2;
float q2q3 = q2*q3;
float q3q3 = q3*q3;
if(ax*ay*az==0)
return;
//加速度计<测量>的重力加速度向量(机体坐标系)
norm = invSqrt(ax*ax + ay*ay + az*az);
ax = ax * norm;
ay = ay * norm;
az = az * norm;
// printf("ax=%0.2f ay=%0.2f az=%0.2f\r\n",ax,ay,az);
//陀螺仪积分<估计>重力向量(机体坐标系)
vx = 2*(q1q3 - q0q2); //矩阵(3,1)项
vy = 2*(q0q1 + q2q3); //矩阵(3,2)项
vz = q0q0 - q1q1 - q2q2 + q3q3 ; //矩阵(3,3)项
//向量叉乘所得的值
ex = (ay*vz - az*vy);
ey = (az*vx - ax*vz);
ez = (ax*vy - ay*vx);
//用上面求出误差进行积分
exInt = exInt + ex * Ki;
eyInt = eyInt + ey * Ki;
ezInt = ezInt + ez * Ki;
//将误差PI后补偿到陀螺仪
gx = gx + Kp*ex + exInt;
gy = gy + Kp*ey + eyInt;
gz = gz + Kp*ez + ezInt;//这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减
//四元素的微分方程
q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;
q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;
q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;
q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;
//单位化四元数
norm = invSqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);
q0 = q0 * norm;
q1 = q1 * norm;
q2 = q2 * norm;
q3 = q3 * norm;
// 矩阵表达式
// matrix[0] = q0q0 + q1q1 - q2q2 - q3q3; // 11
// matrix[1] = 2.f * (q1q2 + q0q3); // 12
// matrix[2] = 2.f * (q1q3 - q0q2); // 13
// matrix[3] = 2.f * (q1q2 - q0q3); // 21
// matrix[4] = q0q0 - q1q1 + q2q2 - q3q3; // 22
// matrix[5] = 2.f * (q2q3 + q0q1); // 23
// matrix[6] = 2.f * (q1q3 + q0q2); // 31
// matrix[7] = 2.f * (q2q3 - q0q1); // 32
// matrix[8] = q0q0 - q1q1 - q2q2 + q3q3; // 33
//下一步是四元数转换成欧拉角(Z->Y->X)
}
#define ALPHA 0.01
void IMU_Update(float *gy,float *acc, float *mag, RadDp Rad, DegDp Deg)
{
static volatile double Phi,Theta, Psi, Gz2, By2, Bz2, Bx3;
volatile float Gyr[XYZ], Acc[XYZ], Mag[XYZ];
Gyr[X] = gy[X];
Gyr[Y] = gy[Y];
Gyr[Z] = gy[Z];
Acc[X] = acc[X];
Acc[Y] = acc[Y];
Acc[Z] = acc[Z];
Mag[X] = -mag[X];
Mag[Y] = -mag[Y];
Mag[Z] = -mag[Z];
// IMUupdate(Gyr[X], Gyr[Y], Gyr[Z], Acc[X], Acc[Y], Acc[Z]);
// Phi = -atan2(2.f * q0*q1 + 2.f * q2*q3, 1 - 2.f * q1*q1 - 2.f * q2*q2);
// Theta = -asin(2.f * (q0*q2 - q1*q3));
// volatile float xh = Mag[0]*cos(Theta) + Mag[1]*sin(Phi)*sin(Theta) + Mag[2]*cos(Phi)*sin(Theta);
// volatile float yh = Mag[1]*cos(Phi) - Mag[2]*sin(Phi);
// Psi = atan2(yh, xh);
Phi = atan2(Acc[Y], (Acc[Z] + Acc[X] * ALPHA));
//Phi = atan2(Acc[Y], Acc[Z]);
Gz2 = Acc[Y] * sin(Phi) + Acc[Z] * cos(Phi);
Theta = atan(-Acc[X] / Gz2);
By2 = Mag[Z] * sin(Phi) - Mag[Y] * cos(Phi);
Bz2 = Mag[Y] * sin(Phi) + Mag[Z] * cos(Phi);
Bx3 = Mag[X] * cos(Theta) + Bz2 * sin(Theta);
Psi = atan2(By2, Bx3);
Rad->roll = Phi;
Rad->pitch = Theta;
Rad->yaw = Psi;
Deg->roll = Rad->roll * RAD_TO_DEG;
Deg->pitch = Rad->pitch * RAD_TO_DEG;
Deg->yaw = Rad->yaw * RAD_TO_DEG;
}
+24
View File
@@ -0,0 +1,24 @@
#ifndef _IMU_H_
#define _IMU_H_
#include <math.h>
#define PI 3.14159265358979323846f
#define RAD_TO_DEG 57.2957795 // 弧度到度的转换系数
#define DEG_TO_RAD 0.0174533 // 度到弧度的转换系数
// 定义欧拉角结构体
typedef struct {
volatile float roll, pitch, yaw;//弧度
}Rad_T, *RadDp;
typedef struct {
volatile float roll, pitch, yaw;//角度
}Deg_T, *DegDp;
#define Imu_AccFilterSize 10
#define Imu_MagFilterSize 20
#define Imu_GyroFilterSize 10
void IMU_Update(float *gy,float *acc, float *mag, RadDp Rad, DegDp Deg);
#endif
+613
View File
@@ -0,0 +1,613 @@
#include "sx127x.h"
#include "ddl.h"
#include "Debug.h"
#include "spi.h"
#include "bsp.h"
#define LORAChannel 8
#define LORARegPreamble 10
#if (LORA_MODULE == SX1278W1)
Sx1276Type_t LoRaPara = {
.ucChannel = LORAChannel, //4 or 12
.dwFreqHz = FREQ_CENT,
.ucPower = 20,
.SignalBw = SX1276_BW_250K,
.SpreadFactor = SX1276_SF_512,
.ErrorCoding = SX1276_EC_4_6,
.RegPreamble = LORARegPreamble,//10 or 16
.ucOpModePrev = RFLR_OPMODE_STANDBY,
.bAntSwPrev = RF_ANT_RECEIVER,
.RegBuff = 0,
.State = SX1276_IDLE,
.ucRxPacketSize = 0,
.ucTxPacketSize = 0,
.RxCallBack = NULL,
};
void LoraReset(void)
{
LORA_RESET_CLR();
delay_ms(1);
LORA_RESET_SET();
}
/////////////////////////////////////////////////
void SX1276SetAntSw(Sx1276AntStatus_m Status)
{
switch(Status){
case RF_ANT_TRANSMITTER:
LORA_ANTTXEN();
break;
case RF_ANT_RECEIVER:
LORA_ANTRXEN();
break;
case RF_ANT_CLOSE:
LORA_ANTCLOSE();
break;
}
}
void SX1276ReadBuffer(uint8_t ucAddr, uint8_t *pucBuff, uint8_t ucLen)
{
uint8_t ucCnt;
LORA_SPI_NSS_CLR();
LORA_SPI_READ_WRITE(ucAddr & 0x7F);
for( ucCnt = 0; ucCnt < ucLen; ucCnt++ ){
pucBuff[ucCnt] = LORA_SPI_READ_WRITE(0);
}
LORA_SPI_NSS_SET();
}
void SX1276WriteBuffer(uint8_t ucAddr, uint8_t *pucBuff, uint8_t ucLen)
{
uint8_t ucCnt;
LORA_SPI_NSS_CLR();
LORA_SPI_READ_WRITE(ucAddr | 0x80);
for( ucCnt = 0; ucCnt < ucLen; ucCnt++ ){
LORA_SPI_READ_WRITE(pucBuff[ucCnt]);
}
LORA_SPI_NSS_SET();
}
void SX1276Write(uint8_t ucAddr, uint8_t ucData)
{
SX1276WriteBuffer(ucAddr, &ucData, 1);
}
void SX1276Read(uint8_t ucAddr, uint8_t * pucData)
{
SX1276ReadBuffer(ucAddr, pucData, 1);
}
void SX1276WriteFifo(uint8_t *pucBuff, uint8_t ucLen)
{
SX1276WriteBuffer(0, pucBuff, ucLen);
}
void SX1276ReadFifo(uint8_t *pucBuff, uint8_t ucLen)
{
SX1276ReadBuffer(0, pucBuff, ucLen);
}
/////////////////////////////////////////////////
void SX1276LoRaSetNbTrigPeaks(uint8_t ucValue)
{
SX1276Read(0x31, &(LoRaPara.RegBuff.RegTestReserved31));
LoRaPara.RegBuff.RegTestReserved31 = (LoRaPara.RegBuff.RegTestReserved31 & 0xF8) | ucValue;
SX1276Write(0x31, LoRaPara.RegBuff.RegTestReserved31 );
}
void SX1276LoRaSetSignalBandwidth(Sx1276BwType Bw)
{
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_BW_MASK) | Bw;
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1);
LoRaPara.SignalBw = Bw;
}
void SX1276LoRaSetSpreadingFactor(Sx1276SpreadFactorType Factor)
{
if (Factor > SX1276_SF_4096){
Factor = SX1276_SF_4096;
}
else if (Factor < SX1276_SF_64){
Factor = SX1276_SF_64;
}
if (Factor == SX1276_SF_64){
SX1276LoRaSetNbTrigPeaks(5);
}
else{
SX1276LoRaSetNbTrigPeaks(3);
}
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | Factor;
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
LoRaPara.SpreadFactor = Factor;
}
void SX1276LoRaSetErrorCoding(Sx1276ErrorCodingType Value){
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | Value;
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1 );
LoRaPara.ErrorCoding = Value;
}
void SX1276LoRaSetFreqHz(uint32_t dwFreqHz)
{
LoRaPara.dwFreqHz = dwFreqHz;
dwFreqHz = ( uint32_t )( ( double )dwFreqHz / ( double )FREQ_STEP );
LoRaPara.RegBuff.RegFrfMsb = ( uint8_t )( ( dwFreqHz >> 16 ) & 0xFF );
LoRaPara.RegBuff.RegFrfMid = ( uint8_t )( ( dwFreqHz >> 8 ) & 0xFF );
LoRaPara.RegBuff.RegFrfLsb = ( uint8_t )( dwFreqHz & 0xFF );
SX1276WriteBuffer(REG_LR_FRFMSB, &(LoRaPara.RegBuff.RegFrfMsb), 3);
}
void SX1276LoRaSetSymbTimeout(uint16_t ucValue)
{
SX1276ReadBuffer(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2), 2);
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK) | (( ucValue >> 8) & ~RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK );
LoRaPara.RegBuff.RegSymbTimeoutLsb = ucValue & 0xFF;
SX1276WriteBuffer(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2), 2);
}
void SX1276LoRaSetLowDatarateOptimize(boolean_t bEnable)
{
SX1276Read(REG_LR_MODEMCONFIG3, &(LoRaPara.RegBuff.RegModemConfig3));
LoRaPara.RegBuff.RegModemConfig3 = (LoRaPara.RegBuff.RegModemConfig3 & RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK ) | ( bEnable << 3 );
SX1276Write(REG_LR_MODEMCONFIG3, LoRaPara.RegBuff.RegModemConfig3);
}
void SX1276LoRaSetPAOutput(uint8_t ucOutputPin)
{
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_MASK ) | ucOutputPin;
SX1276Write(REG_LR_PACONFIG, LoRaPara.RegBuff.RegPaConfig );
}
void SX1276LoRaSetPa20dBm(boolean_t bEnable)
{
SX1276Read(REG_LR_PADAC, &(LoRaPara.RegBuff.RegPaDac));
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
if ((LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST ) {
if( bEnable == TRUE ){
LoRaPara.RegBuff.RegPaDac = 0x87;
}
}
else{
LoRaPara.RegBuff.RegPaDac = 0x84;
}
SX1276Write(REG_LR_PADAC, LoRaPara.RegBuff.RegPaDac );
}
void SX1276LoRaSetRfPower(int8_t sbPower)
{
SX1276Read(REG_LR_PACONFIG, &(LoRaPara.RegBuff.RegPaConfig));
SX1276Read(REG_LR_PADAC, &(LoRaPara.RegBuff.RegPaDac));
if ((LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_PASELECT_PABOOST ) == RFLR_PACONFIG_PASELECT_PABOOST ) {
if ((LoRaPara.RegBuff.RegPaDac & 0x87) == 0x87){
if( sbPower < 5 ){
sbPower = 5;
}
if( sbPower > 20){
sbPower = 20;
}
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
( uint8_t )( ( uint16_t )( sbPower - 5 ) & 0x0F );
}
else{
if( sbPower < 2){
sbPower = 2;
}
if( sbPower > 17){
sbPower = 17;
}
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
( uint8_t )( ( uint16_t )( sbPower - 2 ) & 0x0F );
}
}
else{
if( sbPower < -1){
sbPower = -1;
}
if( sbPower > 14){
sbPower = 14;
}
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_MAX_POWER_MASK ) | 0x70;
LoRaPara.RegBuff.RegPaConfig = (LoRaPara.RegBuff.RegPaConfig & RFLR_PACONFIG_OUTPUTPOWER_MASK ) |
( uint8_t )( ( uint16_t )( sbPower + 1 ) & 0x0F );
}
SX1276Write(REG_LR_PACONFIG, LoRaPara.RegBuff.RegPaConfig);
LoRaPara.ucPower = sbPower;
}
void SX1276LoRaSetOpMode(Sx1276OpModeType ucOpMode)
{
Sx1276AntStatus_m bAntSwStatus = RF_ANT_RECEIVER;
LoRaPara.ucOpModePrev = LoRaPara.RegBuff.RegOpMode & ~RFLR_OPMODE_MASK;
if( ucOpMode != LoRaPara.ucOpModePrev){
if(ucOpMode == RFLR_OPMODE_TRANSMITTER){
//CLR_LORA_RXEN();
//SET_LORA_TXEN();
bAntSwStatus = RF_ANT_TRANSMITTER;
}
else if(ucOpMode == RFLR_OPMODE_RECEIVER){
bAntSwStatus = RF_ANT_RECEIVER;
//CLR_LORA_TXEN();
//SET_LORA_RXEN();
}
else {
bAntSwStatus = RF_ANT_CLOSE;
}
if( bAntSwStatus != LoRaPara.bAntSwPrev ){
LoRaPara.bAntSwPrev = bAntSwStatus;
SX1276SetAntSw(bAntSwStatus);
}
LoRaPara.RegBuff.RegOpMode = (LoRaPara.RegBuff.RegOpMode & RFLR_OPMODE_MASK ) | ucOpMode;
SX1276Write( REG_LR_OPMODE, LoRaPara.RegBuff.RegOpMode);
}
}
////////////////////////////////////////////////////////////////
void Sx1276LoRaEnterRx(void)
{
uint8_t ucCnt;
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
LoRaPara.RegBuff.RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_VALIDHEADER | RFLR_IRQFLAGS_TXDONE;
SX1276Write(REG_LR_IRQFLAGSMASK, LoRaPara.RegBuff.RegIrqFlagsMask);
LoRaPara.RegBuff.RegHopPeriod = 255;
SX1276Write(REG_LR_HOPPERIOD, LoRaPara.RegBuff.RegHopPeriod );
// RxDone RxTimeout FhssChangeChannel ValidHeader
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_01 | RFLR_DIOMAPPING1_DIO3_01;
// CadDetected ModeReady
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2);
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoRxBaseAddr;
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
SX1276LoRaSetOpMode(RFLR_OPMODE_RECEIVER);
for (ucCnt=0; ucCnt< LORA_BUFF_SIZE; ucCnt++){
LoRaPara.RxTxBuff[ucCnt] = 0;
}
LoRaPara.State = SX1276_IDLE;//COMST_RX
uint8_t temp;
SX1276Read(REG_LR_IRQFLAGS, &temp);
//设置接收模式
LORA_ANTRXEN();
}
/////////////////////////////////////////////////
void Sx1276LoRaInit(void (*RxCallBack)(uint8_t *rBuff, uint8_t rlen))
{
if(RxCallBack != NULL) {
LoRaPara.RxCallBack = RxCallBack;
}
LoraReset();
SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);
LoRaPara.RegBuff.RegOpMode = (LoRaPara.RegBuff.RegOpMode & RFLR_OPMODE_LONGRANGEMODE_MASK ) | RFLR_OPMODE_LONGRANGEMODE_ON;
SX1276Write(REG_LR_OPMODE, LoRaPara.RegBuff.RegOpMode );
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
// RxDone RxTimeout FhssChangeChannel ValidHeader
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
// CadDetected ModeReady
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00;
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2 );
SX1276ReadBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
LoRaPara.State = SX1276_BUSY;
SX1276Read(REG_LR_VERSION, &(LoRaPara.RegBuff.RegVersion));
SX1276ReadBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
LoRaPara.RegBuff.RegLna = RFLR_LNA_GAIN_G1;
SX1276WriteBuffer(REG_LR_OPMODE, (uint8_t*)&(LoRaPara.RegBuff) + 1, SIZE_OF_REGISTERS);
//set the RF settings
SX1276LoRaWriteChannel(LoRaPara.ucChannel);
//SX1276LoRaSetFreqHz(LoRaPara.dwFreqHz);
//REG_LR_MODEMCONFIG1
SX1276Read(REG_LR_MODEMCONFIG1, &(LoRaPara.RegBuff.RegModemConfig1));
//SignalBandwidth
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_BW_MASK ) | LoRaPara.SignalBw;
//ErrorCoding
LoRaPara.RegBuff.RegModemConfig1 = (LoRaPara.RegBuff.RegModemConfig1 & RFLR_MODEMCONFIG1_CODINGRATE_MASK ) | LoRaPara.ErrorCoding;
//IMPLICITHEADER
LoRaPara.RegBuff.RegModemConfig1 = LoRaPara.RegBuff.RegModemConfig1 | RFLR_MODEMCONFIG1_IMPLICITHEADER_ON;
SX1276Write(REG_LR_MODEMCONFIG1, LoRaPara.RegBuff.RegModemConfig1);
//REG_LR_MODEMCONFIG2
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
//SpreadingFactor
if( LoRaPara.SpreadFactor == SX1276_SF_64){
SX1276LoRaSetNbTrigPeaks(5);
SX1276LoRaSetLowDatarateOptimize(TRUE); //低数据速率设置
}
else{
SX1276LoRaSetNbTrigPeaks(3);
SX1276LoRaSetLowDatarateOptimize(FALSE); //低数据速率设置
}
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_SF_MASK ) | LoRaPara.SpreadFactor;
//PacketCrcOn
LoRaPara.RegBuff.RegModemConfig2 = (LoRaPara.RegBuff.RegModemConfig2 & RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK ) | SX1276_CRC_ON; //SX1276_CRC_OFF
//验证寄存器操作是否成功
SX1276Write(REG_LR_MODEMCONFIG2, LoRaPara.RegBuff.RegModemConfig2);
LoRaPara.RegBuff.RegModemConfig2 = 0;
SX1276Read(REG_LR_MODEMCONFIG2, &(LoRaPara.RegBuff.RegModemConfig2));
SX1276LoRaSetSymbTimeout(0x3FF);
LoRaPara.RegBuff.RegPreambleMsb= (LoRaPara.RegPreamble >> 8) & 0x00ff;
LoRaPara.RegBuff.RegPreambleLsb= LoRaPara.RegPreamble & 0x00ff;
SX1276Write(REG_LR_PREAMBLEMSB, LoRaPara.RegBuff.RegPreambleMsb);
SX1276Write(REG_LR_PREAMBLELSB, LoRaPara.RegBuff.RegPreambleLsb);
SX1276Write(REG_LR_PAYLOADLENGTH, LORA_BUFF_SIZE);
SX1276Write(REG_LR_PAYLOADMAXLENGTH, LORA_BUFF_SIZE);
LoRaPara.RegBuff.RegPayloadLength = LORA_BUFF_SIZE;
#ifndef USE_LORA_860_PA
if(LoRaPara.dwFreqHz > 860000000 ){
SX1276LoRaSetPAOutput(RFLR_PACONFIG_PASELECT_RFO);
SX1276LoRaSetPa20dBm(FALSE);
LoRaPara.ucPower = 14;
}
else
#endif
{
SX1276LoRaSetPAOutput(RFLR_PACONFIG_PASELECT_PABOOST);
SX1276LoRaSetPa20dBm(TRUE);
LoRaPara.ucPower = 20;
}
SX1276LoRaSetRfPower(LoRaPara.ucPower);
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
Sx1276LoRaEnterRx();
}
void IsrSx1276LoRaTxRx(void){
switch (LoRaPara.State){
case SX1276_IDLE:
case SX1276_RX:
// Clear Irq
//SET_LORA_RX_LED();
do {
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_RXDONE);
SX1276Read(REG_LR_IRQFLAGS, &(LoRaPara.RegBuff.RegIrqFlags));
if((LoRaPara.RegBuff.RegIrqFlags & RFLR_IRQFLAGS_RXDONE) != RFLR_IRQFLAGS_RXDONE)
break;
}while(1);
if((LoRaPara.RegBuff.RegIrqFlags & RFLR_IRQFLAGS_PAYLOADCRCERROR ) == RFLR_IRQFLAGS_PAYLOADCRCERROR) {
// Clear Irq
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_PAYLOADCRCERROR);
LoRaPara.State = SX1276_IDLE;
break;
}
SX1276Read(REG_LR_PKTSNRVALUE, &(LoRaPara.RegBuff.RegPktSnrValue));
SX1276Read(REG_LR_RSSIVALUE, &(LoRaPara.RegBuff.RegRssiValue));
SX1276Read(REG_LR_PKTRSSIVALUE, &(LoRaPara.RegBuff.RegPktRssiValue));
SX1276Read(REG_LR_FIFORXCURRENTADDR, &(LoRaPara.RegBuff.RegFifoRxCurrentAddr));
SX1276Read(REG_LR_NBRXBYTES, &(LoRaPara.RegBuff.RegNbRxBytes));
LoRaPara.ucRxPacketSize = LoRaPara.RegBuff.RegNbRxBytes;
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoRxCurrentAddr;
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
SX1276ReadFifo(LoRaPara.RxTxBuff, (LoRaPara.ucRxPacketSize > LORA_BUFF_SIZE) ? LORA_BUFF_SIZE : LoRaPara.ucRxPacketSize);
uint8_t ucLen;
if(LoRaPara.ucRxPacketSize < LORA_BUFF_SIZE) {
ucLen= LoRaPara.ucRxPacketSize;
}
else {
ucLen= LORA_BUFF_SIZE;
}
LoRaPara.RxTxBuff[ucLen] = 0;
if(LoRaPara.RxCallBack != NULL)
LoRaPara.RxCallBack(LoRaPara.RxTxBuff, ucLen);
LoRaPara.ucRxPacketSize = 0;
LoRaPara.State = SX1276_IDLE;
//CLR_LORA_RX_LED();
break;
case SX1276_TX:
// Clear Irq
SX1276Write(REG_LR_IRQFLAGS, RFLR_IRQFLAGS_TXDONE);
//LORA_TXLED_OFF();
Sx1276LoRaEnterRx();
break;
default:
break;
}
}
void Sx1276LoRaLoopHandler(void)
{
if(LORA_GETDIO0() > 0){ // RxDone or TxDone
IsrSx1276LoRaTxRx();
}
}
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint8_t ucLen)
{
//设置发送模式
LORA_ANTTXEN();
LoRaPara.State = SX1276_BUSY;
if (ucLen > LORA_BUFF_SIZE){
ucLen = LORA_BUFF_SIZE;
}
LoRaPara.ucTxPacketSize = ucLen;
while(ucLen--){
LoRaPara.RxTxBuff[ucLen] = pucBuff[ucLen];
};
SX1276LoRaSetOpMode(RFLR_OPMODE_STANDBY);
LoRaPara.RegBuff.RegIrqFlagsMask = RFLR_IRQFLAGS_RXTIMEOUT | RFLR_IRQFLAGS_RXDONE | RFLR_IRQFLAGS_PAYLOADCRCERROR | RFLR_IRQFLAGS_VALIDHEADER;
//LoRaPara.RegBuff.RegHopPeriod = 0;
//SX1276Write(REG_LR_HOPPERIOD, LoRaPara.RegBuff.RegHopPeriod);
SX1276Write(REG_LR_IRQFLAGSMASK, LoRaPara.RegBuff.RegIrqFlagsMask);
// Initializes the payload size
LoRaPara.RegBuff.RegPayloadLength = LoRaPara.ucTxPacketSize;
SX1276Write(REG_LR_PAYLOADLENGTH, LoRaPara.RegBuff.RegPayloadLength);
LoRaPara.RegBuff.RegFifoTxBaseAddr = 0x00; // Full buffer used for Tx
SX1276Write(REG_LR_FIFOTXBASEADDR, LoRaPara.RegBuff.RegFifoTxBaseAddr);
LoRaPara.RegBuff.RegFifoAddrPtr = LoRaPara.RegBuff.RegFifoTxBaseAddr;
SX1276Write(REG_LR_FIFOADDRPTR, LoRaPara.RegBuff.RegFifoAddrPtr);
// Write payload buffer to LORA modem
SX1276WriteFifo(LoRaPara.RxTxBuff, LoRaPara.RegBuff.RegPayloadLength);
// TxDone RxTimeout FhssChangeChannel ValidHeader
LoRaPara.RegBuff.RegDioMapping1 = RFLR_DIOMAPPING1_DIO0_01 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_01;
// PllLock Mode Ready
LoRaPara.RegBuff.RegDioMapping2 = RFLR_DIOMAPPING2_DIO4_01 | RFLR_DIOMAPPING2_DIO5_00;
SX1276WriteBuffer(REG_LR_DIOMAPPING1, &(LoRaPara.RegBuff.RegDioMapping1), 2);
SX1276LoRaSetOpMode(RFLR_OPMODE_TRANSMITTER);
uint8_t temp;
SX1276Read(REG_LR_IRQFLAGS, &temp);
//LORA_TXLED_ON();
LoRaPara.State = SX1276_TX;
}
void Sx1276LoRaSleep(void)
{
SX1276LoRaSetOpMode(RFLR_OPMODE_SLEEP);//RFLR_OPMODE_STANDBY
}
void Sx1276LoRaWakeup(void)
{
Sx1276LoRaEnterRx();
}
////////////////////////////////////////
//配置本层参数的函数
//频道表
const uint32_t gdwSx1276ChannelTbl[SX1276_CHANNEL_MAX]={
FREQ_CENT-FREQ_DEV*8, FREQ_CENT-FREQ_DEV*7, FREQ_CENT-FREQ_DEV*6, FREQ_CENT-FREQ_DEV*5,
FREQ_CENT-FREQ_DEV*4, FREQ_CENT-FREQ_DEV*3, FREQ_CENT-FREQ_DEV*2, FREQ_CENT-FREQ_DEV*1,
FREQ_CENT+FREQ_DEV*0, FREQ_CENT+FREQ_DEV*1, FREQ_CENT+FREQ_DEV*2, FREQ_CENT+FREQ_DEV*3,
FREQ_CENT+FREQ_DEV*4, FREQ_CENT+FREQ_DEV*5, FREQ_CENT+FREQ_DEV*6, FREQ_CENT+FREQ_DEV*7,
FREQ_CENT+FREQ_DEV*8
};
//LORAPT_CHANNEL
uint8_t SX1276LoRaReadChannel(void)
{
return LoRaPara.ucChannel;
}
boolean_t SX1276LoRaWriteChannel(uint8_t Channel)
{
if(Channel > SX1276_CHANNEL_MAX) {
return FALSE;
}
LoRaPara.dwFreqHz = gdwSx1276ChannelTbl[Channel];
SX1276LoRaSetFreqHz(LoRaPara.dwFreqHz);
return TRUE;
}
//LORAPT_FREQ,
uint32_t SX1276LoRaReadFreq(void)
{
return LoRaPara.dwFreqHz;
}
void SX1276LoRaWriteFreq(uint32_t Freq)
{
SX1276LoRaSetFreqHz(Freq);
}
//LORAPT_BW,
uint32_t SX1276LoRaReadBw(void)
{
return LoRaPara.SignalBw;
}
void SX1276LoRaWriteBw(Sx1276BwType SignalBw)
{
LoRaPara.SignalBw = SignalBw;
SX1276LoRaSetSignalBandwidth(SignalBw);
}
//LORAPT_SF,
uint8_t SX1276LoRaReadSf(void)
{
return LoRaPara.SpreadFactor;
}
void SX1276LoRaWriteSf(Sx1276SpreadFactorType SpreadFactor)
{
LoRaPara.SpreadFactor = SpreadFactor;
SX1276LoRaSetSpreadingFactor(LoRaPara.SpreadFactor);
}
//LORAPT_EC,
uint8_t SX1276LoRaReadEc(void)
{
return LoRaPara.ErrorCoding;
}
void SX1276LoRaWriteEc(Sx1276ErrorCodingType ErrorCoding)
{
LoRaPara.ErrorCoding = ErrorCoding;
SX1276LoRaSetErrorCoding(ErrorCoding);
}
//LORAPT_RSSI,
uint32_t SX1276LoRaParaReadRssi(void)
{
uint32_t rssi;
SX1276Read(REG_LR_PKTRSSIVALUE, &(LoRaPara.RegBuff.RegPktRssiValue));
SX1276Read(REG_LR_RSSIVALUE, &(LoRaPara.RegBuff.RegRssiValue));
rssi = (uint16_t)(LoRaPara.RegBuff.RegPktSnrValue)<<16;
rssi |= (uint16_t)(LoRaPara.RegBuff.RegRssiValue)<<8;
rssi |= LoRaPara.RegBuff.RegPktRssiValue;
return rssi;
}
uint8_t SX1276LoRaReadRssiPkt(void)
{
uint8_t RssiPkt;
SX1276Read(REG_LR_PKTRSSIVALUE, &LoRaPara.RegBuff.RegPktRssiValue);
RssiPkt = LoRaPara.RegBuff.RegPktRssiValue;
return RssiPkt;
}
//LORAPT_POWER,
void SX1276LoRaWritePwr(int8_t Pwr)
{
SX1276LoRaSetRfPower(Pwr);
}
//LORAPT_SET_RX,
void SX1276LoRaWriteRx(void)
{
Sx1276LoRaEnterRx();
}
//LORAPT_SET_SLEEP,true-Sleep, false-Wakeup
void SX1276LoRaWriteSleep(boolean_t Sleep)
{
if(Sleep){
Sx1276LoRaSleep();
}
else {
Sx1276LoRaWakeup();
}
}
Sx1276StateType_t SX1276LoRaReadStatus(void)
{
return LoRaPara.State;
}
///////////////RSSI Calc///////////////
void SX1276LoCalcRssiSnr(int8_t *pswRssi, int8_t *psbSnr)
{
int8_t sbSnr= LoRaPara.RegBuff.RegPktSnrValue & 0x80 ? (-1)*((int8_t)(((~LoRaPara.RegBuff.RegPktSnrValue+ 1)& 0xFF)/4)): (~LoRaPara.RegBuff.RegPktSnrValue& 0xFF)/4;
if (sbSnr > 0) {
*pswRssi= RSSI_OFFSET_LF+ LoRaPara.RegBuff.RegPktRssiValue;
}
else {
*pswRssi= NOISE_ABSOLUTE_ZERO + 10 + SIGNAL_BW_LOG_125KHZ + NOISE_FIGURE_LF + sbSnr;
}
*psbSnr= sbSnr;
}
#endif
+826
View File
@@ -0,0 +1,826 @@
#ifndef __SX127X_H
#define __SX127X_H
#include "bsp.h"
//Constant values need to compute the RSSI value
#define RSSI_OFFSET_LF -155
#define RSSI_OFFSET_HF -150
#define NOISE_ABSOLUTE_ZERO -174
#define NOISE_FIGURE_LF 4
#define NOISE_FIGURE_HF 6
#define SIGNAL_BW_LOG_125KHZ 5
//SX1276 definitions
#define XTAL_FREQ 32000000
#define FREQ_STEP 61.03515625
//SX1276 Internal registers Address
#define REG_LR_FIFO 0x00
// Common settings
#define REG_LR_OPMODE 0x01
#define REG_LR_BANDSETTING 0x04
#define REG_LR_FRFMSB 0x06
#define REG_LR_FRFMID 0x07
#define REG_LR_FRFLSB 0x08
// Tx settings
#define REG_LR_PACONFIG 0x09
#define REG_LR_PARAMP 0x0A
#define REG_LR_OCP 0x0B
// Rx settings
#define REG_LR_LNA 0x0C
// LoRa registers
#define REG_LR_FIFOADDRPTR 0x0D
#define REG_LR_FIFOTXBASEADDR 0x0E
#define REG_LR_FIFORXBASEADDR 0x0F
#define REG_LR_FIFORXCURRENTADDR 0x10
#define REG_LR_IRQFLAGSMASK 0x11
#define REG_LR_IRQFLAGS 0x12
#define REG_LR_NBRXBYTES 0x13
#define REG_LR_RXHEADERCNTVALUEMSB 0x14
#define REG_LR_RXHEADERCNTVALUELSB 0x15
#define REG_LR_RXPACKETCNTVALUEMSB 0x16
#define REG_LR_RXPACKETCNTVALUELSB 0x17
#define REG_LR_MODEMSTAT 0x18
#define REG_LR_PKTSNRVALUE 0x19
#define REG_LR_PKTRSSIVALUE 0x1A
#define REG_LR_RSSIVALUE 0x1B
#define REG_LR_HOPCHANNEL 0x1C
#define REG_LR_MODEMCONFIG1 0x1D
#define REG_LR_MODEMCONFIG2 0x1E
#define REG_LR_SYMBTIMEOUTLSB 0x1F
#define REG_LR_PREAMBLEMSB 0x20
#define REG_LR_PREAMBLELSB 0x21
#define REG_LR_PAYLOADLENGTH 0x22
#define REG_LR_PAYLOADMAXLENGTH 0x23
#define REG_LR_HOPPERIOD 0x24
#define REG_LR_FIFORXBYTEADDR 0x25
#define REG_LR_MODEMCONFIG3 0x26
// end of documented register in datasheet
// I/O settings
#define REG_LR_DIOMAPPING1 0x40
#define REG_LR_DIOMAPPING2 0x41
// Version
#define REG_LR_VERSION 0x42
// Additional settings
#define REG_LR_PLLHOP 0x44
#define REG_LR_TCXO 0x4B
#define REG_LR_PADAC 0x4D
#define REG_LR_FORMERTEMP 0x5B
#define REG_LR_BITRATEFRAC 0x5D
#define REG_LR_AGCREF 0x61
#define REG_LR_AGCTHRESH1 0x62
#define REG_LR_AGCTHRESH2 0x63
#define REG_LR_AGCTHRESH3 0x64
//RegOpMode
typedef enum{
RFLR_OPMODE_LONGRANGEMODE_MASK =0x7F,
RFLR_OPMODE_LONGRANGEMODE_OFF =0x00, // Default
RFLR_OPMODE_LONGRANGEMODE_ON =0x80,
RFLR_OPMODE_ACCESSSHAREDREG_MASK =0xBF,
RFLR_OPMODE_ACCESSSHAREDREG_ENABLE =0x40,
RFLR_OPMODE_ACCESSSHAREDREG_DISABLE =0x00, // Default
RFLR_OPMODE_FREQMODE_ACCESS_MASK =0xF7,
RFLR_OPMODE_FREQMODE_ACCESS_LF =0x08, // Default
RFLR_OPMODE_FREQMODE_ACCESS_HF =0x00,
RFLR_OPMODE_MASK =0xF8,
RFLR_OPMODE_SLEEP =0x00,
RFLR_OPMODE_STANDBY =0x01, // Default
RFLR_OPMODE_SYNTHESIZER_TX =0x02,
RFLR_OPMODE_TRANSMITTER =0x03,
RFLR_OPMODE_SYNTHESIZER_RX =0x04,
RFLR_OPMODE_RECEIVER =0x05,
// LoRa specific modes
RFLR_OPMODE_RECEIVER_SINGLE =0x06,
RFLR_OPMODE_CAD =0x07
}Sx1276OpModeType;
//RegBandSetting
#define RFLR_BANDSETTING_MASK 0x3F
#define RFLR_BANDSETTING_AUTO 0x00 // Default
#define RFLR_BANDSETTING_DIV_BY_1 0x40
#define RFLR_BANDSETTING_DIV_BY_2 0x80
#define RFLR_BANDSETTING_DIV_BY_6 0xC0
//RegFrf (MHz)
#define RFLR_FRFMSB_434_MHZ 0x6C // Default
#define RFLR_FRFMID_434_MHZ 0x80 // Default
#define RFLR_FRFLSB_434_MHZ 0x00 // Default
#define RFLR_FRFMSB_863_MHZ 0xD7
#define RFLR_FRFMID_863_MHZ 0xC0
#define RFLR_FRFLSB_863_MHZ 0x00
#define RFLR_FRFMSB_864_MHZ 0xD8
#define RFLR_FRFMID_864_MHZ 0x00
#define RFLR_FRFLSB_864_MHZ 0x00
#define RFLR_FRFMSB_865_MHZ 0xD8
#define RFLR_FRFMID_865_MHZ 0x40
#define RFLR_FRFLSB_865_MHZ 0x00
#define RFLR_FRFMSB_866_MHZ 0xD8
#define RFLR_FRFMID_866_MHZ 0x80
#define RFLR_FRFLSB_866_MHZ 0x00
#define RFLR_FRFMSB_867_MHZ 0xD8
#define RFLR_FRFMID_867_MHZ 0xC0
#define RFLR_FRFLSB_867_MHZ 0x00
#define RFLR_FRFMSB_868_MHZ 0xD9
#define RFLR_FRFMID_868_MHZ 0x00
#define RFLR_FRFLSB_868_MHZ 0x00
#define RFLR_FRFMSB_869_MHZ 0xD9
#define RFLR_FRFMID_869_MHZ 0x40
#define RFLR_FRFLSB_869_MHZ 0x00
#define RFLR_FRFMSB_870_MHZ 0xD9
#define RFLR_FRFMID_870_MHZ 0x80
#define RFLR_FRFLSB_870_MHZ 0x00
#define RFLR_FRFMSB_902_MHZ 0xE1
#define RFLR_FRFMID_902_MHZ 0x80
#define RFLR_FRFLSB_902_MHZ 0x00
#define RFLR_FRFMSB_903_MHZ 0xE1
#define RFLR_FRFMID_903_MHZ 0xC0
#define RFLR_FRFLSB_903_MHZ 0x00
#define RFLR_FRFMSB_904_MHZ 0xE2
#define RFLR_FRFMID_904_MHZ 0x00
#define RFLR_FRFLSB_904_MHZ 0x00
#define RFLR_FRFMSB_905_MHZ 0xE2
#define RFLR_FRFMID_905_MHZ 0x40
#define RFLR_FRFLSB_905_MHZ 0x00
#define RFLR_FRFMSB_906_MHZ 0xE2
#define RFLR_FRFMID_906_MHZ 0x80
#define RFLR_FRFLSB_906_MHZ 0x00
#define RFLR_FRFMSB_907_MHZ 0xE2
#define RFLR_FRFMID_907_MHZ 0xC0
#define RFLR_FRFLSB_907_MHZ 0x00
#define RFLR_FRFMSB_908_MHZ 0xE3
#define RFLR_FRFMID_908_MHZ 0x00
#define RFLR_FRFLSB_908_MHZ 0x00
#define RFLR_FRFMSB_909_MHZ 0xE3
#define RFLR_FRFMID_909_MHZ 0x40
#define RFLR_FRFLSB_909_MHZ 0x00
#define RFLR_FRFMSB_910_MHZ 0xE3
#define RFLR_FRFMID_910_MHZ 0x80
#define RFLR_FRFLSB_910_MHZ 0x00
#define RFLR_FRFMSB_911_MHZ 0xE3
#define RFLR_FRFMID_911_MHZ 0xC0
#define RFLR_FRFLSB_911_MHZ 0x00
#define RFLR_FRFMSB_912_MHZ 0xE4
#define RFLR_FRFMID_912_MHZ 0x00
#define RFLR_FRFLSB_912_MHZ 0x00
#define RFLR_FRFMSB_913_MHZ 0xE4
#define RFLR_FRFMID_913_MHZ 0x40
#define RFLR_FRFLSB_913_MHZ 0x00
#define RFLR_FRFMSB_914_MHZ 0xE4
#define RFLR_FRFMID_914_MHZ 0x80
#define RFLR_FRFLSB_914_MHZ 0x00
#define RFLR_FRFMSB_915_MHZ 0xE4 // Default
#define RFLR_FRFMID_915_MHZ 0xC0 // Default
#define RFLR_FRFLSB_915_MHZ 0x00 // Default
#define RFLR_FRFMSB_916_MHZ 0xE5
#define RFLR_FRFMID_916_MHZ 0x00
#define RFLR_FRFLSB_916_MHZ 0x00
#define RFLR_FRFMSB_917_MHZ 0xE5
#define RFLR_FRFMID_917_MHZ 0x40
#define RFLR_FRFLSB_917_MHZ 0x00
#define RFLR_FRFMSB_918_MHZ 0xE5
#define RFLR_FRFMID_918_MHZ 0x80
#define RFLR_FRFLSB_918_MHZ 0x00
#define RFLR_FRFMSB_919_MHZ 0xE5
#define RFLR_FRFMID_919_MHZ 0xC0
#define RFLR_FRFLSB_919_MHZ 0x00
#define RFLR_FRFMSB_920_MHZ 0xE6
#define RFLR_FRFMID_920_MHZ 0x00
#define RFLR_FRFLSB_920_MHZ 0x00
#define RFLR_FRFMSB_921_MHZ 0xE6
#define RFLR_FRFMID_921_MHZ 0x40
#define RFLR_FRFLSB_921_MHZ 0x00
#define RFLR_FRFMSB_922_MHZ 0xE6
#define RFLR_FRFMID_922_MHZ 0x80
#define RFLR_FRFLSB_922_MHZ 0x00
#define RFLR_FRFMSB_923_MHZ 0xE6
#define RFLR_FRFMID_923_MHZ 0xC0
#define RFLR_FRFLSB_923_MHZ 0x00
#define RFLR_FRFMSB_924_MHZ 0xE7
#define RFLR_FRFMID_924_MHZ 0x00
#define RFLR_FRFLSB_924_MHZ 0x00
#define RFLR_FRFMSB_925_MHZ 0xE7
#define RFLR_FRFMID_925_MHZ 0x40
#define RFLR_FRFLSB_925_MHZ 0x00
#define RFLR_FRFMSB_926_MHZ 0xE7
#define RFLR_FRFMID_926_MHZ 0x80
#define RFLR_FRFLSB_926_MHZ 0x00
#define RFLR_FRFMSB_927_MHZ 0xE7
#define RFLR_FRFMID_927_MHZ 0xC0
#define RFLR_FRFLSB_927_MHZ 0x00
#define RFLR_FRFMSB_928_MHZ 0xE8
#define RFLR_FRFMID_928_MHZ 0x00
#define RFLR_FRFLSB_928_MHZ 0x00
//RegPaConfig
#define RFLR_PACONFIG_PASELECT_MASK 0x7F
#define RFLR_PACONFIG_PASELECT_PABOOST 0x80
#define RFLR_PACONFIG_PASELECT_RFO 0x00 // Default
#define RFLR_PACONFIG_MAX_POWER_MASK 0x8F
#define RFLR_PACONFIG_OUTPUTPOWER_MASK 0xF0
//RegPaRamp
#define RFLR_PARAMP_TXBANDFORCE_MASK 0xEF
#define RFLR_PARAMP_TXBANDFORCE_BAND_SEL 0x10
#define RFLR_PARAMP_TXBANDFORCE_AUTO 0x00 // Default
#define RFLR_PARAMP_MASK 0xF0
#define RFLR_PARAMP_3400_US 0x00
#define RFLR_PARAMP_2000_US 0x01
#define RFLR_PARAMP_1000_US 0x02
#define RFLR_PARAMP_0500_US 0x03
#define RFLR_PARAMP_0250_US 0x04
#define RFLR_PARAMP_0125_US 0x05
#define RFLR_PARAMP_0100_US 0x06
#define RFLR_PARAMP_0062_US 0x07
#define RFLR_PARAMP_0050_US 0x08
#define RFLR_PARAMP_0040_US 0x09 // Default
#define RFLR_PARAMP_0031_US 0x0A
#define RFLR_PARAMP_0025_US 0x0B
#define RFLR_PARAMP_0020_US 0x0C
#define RFLR_PARAMP_0015_US 0x0D
#define RFLR_PARAMP_0012_US 0x0E
#define RFLR_PARAMP_0010_US 0x0F
//RegOcp
#define RFLR_OCP_MASK 0xDF
#define RFLR_OCP_ON 0x20 // Default
#define RFLR_OCP_OFF 0x00
#define RFLR_OCP_TRIM_MASK 0xE0
#define RFLR_OCP_TRIM_045_MA 0x00
#define RFLR_OCP_TRIM_050_MA 0x01
#define RFLR_OCP_TRIM_055_MA 0x02
#define RFLR_OCP_TRIM_060_MA 0x03
#define RFLR_OCP_TRIM_065_MA 0x04
#define RFLR_OCP_TRIM_070_MA 0x05
#define RFLR_OCP_TRIM_075_MA 0x06
#define RFLR_OCP_TRIM_080_MA 0x07
#define RFLR_OCP_TRIM_085_MA 0x08
#define RFLR_OCP_TRIM_090_MA 0x09
#define RFLR_OCP_TRIM_095_MA 0x0A
#define RFLR_OCP_TRIM_100_MA 0x0B // Default
#define RFLR_OCP_TRIM_105_MA 0x0C
#define RFLR_OCP_TRIM_110_MA 0x0D
#define RFLR_OCP_TRIM_115_MA 0x0E
#define RFLR_OCP_TRIM_120_MA 0x0F
#define RFLR_OCP_TRIM_130_MA 0x10
#define RFLR_OCP_TRIM_140_MA 0x11
#define RFLR_OCP_TRIM_150_MA 0x12
#define RFLR_OCP_TRIM_160_MA 0x13
#define RFLR_OCP_TRIM_170_MA 0x14
#define RFLR_OCP_TRIM_180_MA 0x15
#define RFLR_OCP_TRIM_190_MA 0x16
#define RFLR_OCP_TRIM_200_MA 0x17
#define RFLR_OCP_TRIM_210_MA 0x18
#define RFLR_OCP_TRIM_220_MA 0x19
#define RFLR_OCP_TRIM_230_MA 0x1A
#define RFLR_OCP_TRIM_240_MA 0x1B
//RegLna
#define RFLR_LNA_GAIN_MASK 0x1F
#define RFLR_LNA_GAIN_G1 0x20 // Default
#define RFLR_LNA_GAIN_G2 0x40
#define RFLR_LNA_GAIN_G3 0x60
#define RFLR_LNA_GAIN_G4 0x80
#define RFLR_LNA_GAIN_G5 0xA0
#define RFLR_LNA_GAIN_G6 0xC0
#define RFLR_LNA_BOOST_LF_MASK 0xE7
#define RFLR_LNA_BOOST_LF_DEFAULT 0x00 // Default
#define RFLR_LNA_BOOST_LF_GAIN 0x08
#define RFLR_LNA_BOOST_LF_IP3 0x10
#define RFLR_LNA_BOOST_LF_BOOST 0x18
#define RFLR_LNA_RXBANDFORCE_MASK 0xFB
#define RFLR_LNA_RXBANDFORCE_BAND_SEL 0x04
#define RFLR_LNA_RXBANDFORCE_AUTO 0x00 // Default
#define RFLR_LNA_BOOST_HF_MASK 0xFC
#define RFLR_LNA_BOOST_HF_OFF 0x00 // Default
#define RFLR_LNA_BOOST_HF_ON 0x03
//RegFifoAddrPtr
#define RFLR_FIFOADDRPTR 0x00 // Default
//RegFifoTxBaseAddr
#define RFLR_FIFOTXBASEADDR 0x80 // Default
//RegFifoTxBaseAddr
#define RFLR_FIFORXBASEADDR 0x00 // Default
//RegFifoRxCurrentAddr (Read Only)
//RegIrqFlagsMask
#define RFLR_IRQFLAGS_RXTIMEOUT_MASK 0x80
#define RFLR_IRQFLAGS_RXDONE_MASK 0x40
#define RFLR_IRQFLAGS_PAYLOADCRCERROR_MASK 0x20
#define RFLR_IRQFLAGS_VALIDHEADER_MASK 0x10
#define RFLR_IRQFLAGS_TXDONE_MASK 0x08
#define RFLR_IRQFLAGS_CADDONE_MASK 0x04
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL_MASK 0x02
#define RFLR_IRQFLAGS_CADDETECTED_MASK 0x01
//RegIrqFlags
#define RFLR_IRQFLAGS_RXTIMEOUT 0x80
#define RFLR_IRQFLAGS_RXDONE 0x40
#define RFLR_IRQFLAGS_PAYLOADCRCERROR 0x20
#define RFLR_IRQFLAGS_VALIDHEADER 0x10
#define RFLR_IRQFLAGS_TXDONE 0x08
#define RFLR_IRQFLAGS_CADDONE 0x04
#define RFLR_IRQFLAGS_FHSSCHANGEDCHANNEL 0x02
#define RFLR_IRQFLAGS_CADDETECTED 0x01
//RegModemStat (Read Only)
#define RFLR_MODEMSTAT_RX_CR_MASK 0x1F
#define RFLR_MODEMSTAT_MODEM_STATUS_MASK 0xE0
//RegModemConfig1
#define RFLR_MODEMCONFIG1_BW_MASK 0x0F
#define RFLR_MODEMCONFIG1_BW_7_81_KHZ 0x00
#define RFLR_MODEMCONFIG1_BW_10_41_KHZ 0x10
#define RFLR_MODEMCONFIG1_BW_15_62_KHZ 0x20
#define RFLR_MODEMCONFIG1_BW_20_83_KHZ 0x30
#define RFLR_MODEMCONFIG1_BW_31_25_KHZ 0x40
#define RFLR_MODEMCONFIG1_BW_41_66_KHZ 0x50
#define RFLR_MODEMCONFIG1_BW_62_50_KHZ 0x60
#define RFLR_MODEMCONFIG1_BW_125_KHZ 0x70 // Default
#define RFLR_MODEMCONFIG1_BW_250_KHZ 0x80
#define RFLR_MODEMCONFIG1_BW_500_KHZ 0x90
#define RFLR_MODEMCONFIG1_CODINGRATE_MASK 0xF1
#define RFLR_MODEMCONFIG1_CODINGRATE_4_5 0x02
#define RFLR_MODEMCONFIG1_CODINGRATE_4_6 0x04 // Default
#define RFLR_MODEMCONFIG1_CODINGRATE_4_7 0x06
#define RFLR_MODEMCONFIG1_CODINGRATE_4_8 0x08
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_MASK 0xFE
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_ON 0x00
#define RFLR_MODEMCONFIG1_IMPLICITHEADER_OFF 0x01 // Default
//RegModemConfig2
#define RFLR_MODEMCONFIG2_SF_MASK 0x0F
#define RFLR_MODEMCONFIG2_SF_6 0x60
#define RFLR_MODEMCONFIG2_SF_7 0x70 // Default
#define RFLR_MODEMCONFIG2_SF_8 0x80
#define RFLR_MODEMCONFIG2_SF_9 0x90
#define RFLR_MODEMCONFIG2_SF_10 0xA0
#define RFLR_MODEMCONFIG2_SF_11 0xB0
#define RFLR_MODEMCONFIG2_SF_12 0xC0
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_MASK 0xF7
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_ON 0x08
#define RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF 0x00
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_MASK 0xFB
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_ON 0x04
#define RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF 0x00 // Default
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB_MASK 0xFC
#define RFLR_MODEMCONFIG2_SYMBTIMEOUTMSB 0x00 // Default
//RegHopChannel (Read Only)
#define RFLR_HOPCHANNEL_PLL_LOCK_TIMEOUT_MASK 0x7F
#define RFLR_HOPCHANNEL_PLL_LOCK_FAIL 0x80
#define RFLR_HOPCHANNEL_PLL_LOCK_SUCCEED 0x00 // Default
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_MASK 0xBF
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_ON 0x40
#define RFLR_HOPCHANNEL_PAYLOAD_CRC16_OFF 0x00 // Default
#define RFLR_HOPCHANNEL_CHANNEL_MASK 0x3F
//RegSymbTimeoutLsb
#define RFLR_SYMBTIMEOUTLSB_SYMBTIMEOUT 0x64 // Default
//RegPreambleLengthMsb
#define RFLR_PREAMBLELENGTHMSB 0x00 // Default
//RegPreambleLengthLsb
#define RFLR_PREAMBLELENGTHLSB 0x08 // Default
//RegPayloadLength
#define RFLR_PAYLOADLENGTH 0x0E // Default
//RegPayloadMaxLength
#define RFLR_PAYLOADMAXLENGTH 0xFF // Default
//RegHopPeriod
#define RFLR_HOPPERIOD_FREQFOPPINGPERIOD 0x00 // Default
//RegDioMapping1
//DIO0
#define RFLR_DIOMAPPING1_DIO0_MASK 0x3F
#define RFLR_DIOMAPPING1_DIO0_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO0_01 0x40
#define RFLR_DIOMAPPING1_DIO0_10 0x80
#define RFLR_DIOMAPPING1_DIO0_11 0xC0
//DIO1
#define RFLR_DIOMAPPING1_DIO1_MASK 0xCF
#define RFLR_DIOMAPPING1_DIO1_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO1_01 0x10
#define RFLR_DIOMAPPING1_DIO1_10 0x20
#define RFLR_DIOMAPPING1_DIO1_11 0x30
//DIO2
#define RFLR_DIOMAPPING1_DIO2_MASK 0xF3
#define RFLR_DIOMAPPING1_DIO2_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO2_01 0x04
#define RFLR_DIOMAPPING1_DIO2_10 0x08
#define RFLR_DIOMAPPING1_DIO2_11 0x0C
//DIO3
#define RFLR_DIOMAPPING1_DIO3_MASK 0xFC
#define RFLR_DIOMAPPING1_DIO3_00 0x00 // Default
#define RFLR_DIOMAPPING1_DIO3_01 0x01
#define RFLR_DIOMAPPING1_DIO3_10 0x02
#define RFLR_DIOMAPPING1_DIO3_11 0x03
//RegDioMapping2
//DIO4
#define RFLR_DIOMAPPING2_DIO4_MASK 0x3F
#define RFLR_DIOMAPPING2_DIO4_00 0x00 // Default
#define RFLR_DIOMAPPING2_DIO4_01 0x40
#define RFLR_DIOMAPPING2_DIO4_10 0x80
#define RFLR_DIOMAPPING2_DIO4_11 0xC0
//DIO5
#define RFLR_DIOMAPPING2_DIO5_MASK 0xCF
#define RFLR_DIOMAPPING2_DIO5_00 0x00 // Default
#define RFLR_DIOMAPPING2_DIO5_01 0x10
#define RFLR_DIOMAPPING2_DIO5_10 0x20
#define RFLR_DIOMAPPING2_DIO5_11 0x30
//MAP
#define RFLR_DIOMAPPING2_MAP_MASK 0xFE
#define RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT 0x01
#define RFLR_DIOMAPPING2_MAP_RSSI 0x00 // Default
// RegPllHop
#define RFLR_PLLHOP_FASTHOP_MASK 0x7F
#define RFLR_PLLHOP_FASTHOP_ON 0x80
#define RFLR_PLLHOP_FASTHOP_OFF 0x00 // Default
//RegTcxo
#define RFLR_TCXO_TCXOINPUT_MASK 0xEF
#define RFLR_TCXO_TCXOINPUT_ON 0x10
#define RFLR_TCXO_TCXOINPUT_OFF 0x00 // Default
//RegPaDac
#define RFLR_PADAC_20DBM_MASK 0xF8
#define RFLR_PADAC_20DBM_ON 0x07
#define RFLR_PADAC_20DBM_OFF 0x04 // Default
//RegPll
#define RFLR_PLL_BANDWIDTH_MASK 0x3F
#define RFLR_PLL_BANDWIDTH_75 0x00
#define RFLR_PLL_BANDWIDTH_150 0x40
#define RFLR_PLL_BANDWIDTH_225 0x80
#define RFLR_PLL_BANDWIDTH_300 0xC0 // Default
//RegPllLowPn
#define RFLR_PLLLOWPN_BANDWIDTH_MASK 0x3F
#define RFLR_PLLLOWPN_BANDWIDTH_75 0x00
#define RFLR_PLLLOWPN_BANDWIDTH_150 0x40
#define RFLR_PLLLOWPN_BANDWIDTH_225 0x80
#define RFLR_PLLLOWPN_BANDWIDTH_300 0xC0 // Default
//RegModemConfig3
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_MASK 0xF7
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_ON 0x08
#define RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF 0x00 // Default
#define RFLR_MODEMCONFIG3_AGCAUTO_MASK 0xFB
#define RFLR_MODEMCONFIG3_AGCAUTO_ON 0x04 // Default
#define RFLR_MODEMCONFIG3_AGCAUTO_OFF 0x00
//REGISTER
typedef struct _Sx1276RegType{
uint8_t RegFifo; // 0x00
// Common settings
uint8_t RegOpMode; // 0x01
uint8_t RegRes02; // 0x02
uint8_t RegRes03; // 0x03
uint8_t RegBandSetting; // 0x04
uint8_t RegRes05; // 0x05
uint8_t RegFrfMsb; // 0x06
uint8_t RegFrfMid; // 0x07
uint8_t RegFrfLsb; // 0x08
// Tx settings
uint8_t RegPaConfig; // 0x09
uint8_t RegPaRamp; // 0x0A
uint8_t RegOcp; // 0x0B
// Rx settings
uint8_t RegLna; // 0x0C
// LoRa registers
uint8_t RegFifoAddrPtr; // 0x0D
uint8_t RegFifoTxBaseAddr; // 0x0E
uint8_t RegFifoRxBaseAddr; // 0x0F
uint8_t RegFifoRxCurrentAddr; // 0x10
uint8_t RegIrqFlagsMask; // 0x11
uint8_t RegIrqFlags; // 0x12
uint8_t RegNbRxBytes; // 0x13
uint8_t RegRxHeaderCntValueMsb; // 0x14
uint8_t RegRxHeaderCntValueLsb; // 0x15
uint8_t RegRxPacketCntValueMsb; // 0x16
uint8_t RegRxPacketCntValueLsb; // 0x17
uint8_t RegModemStat; // 0x18
uint8_t RegPktSnrValue; // 0x19
uint8_t RegPktRssiValue; // 0x1A
uint8_t RegRssiValue; // 0x1B
uint8_t RegHopChannel; // 0x1C
uint8_t RegModemConfig1; // 0x1D
uint8_t RegModemConfig2; // 0x1E
uint8_t RegSymbTimeoutLsb; // 0x1F
uint8_t RegPreambleMsb; // 0x20
uint8_t RegPreambleLsb; // 0x21
uint8_t RegPayloadLength; // 0x22
uint8_t RegMaxPayloadLength; // 0x23
uint8_t RegHopPeriod; // 0x24
uint8_t RegFifoRxByteAddr; // 0x25
uint8_t RegModemConfig3; // 0x26
uint8_t RegTestReserved27[0x30 - 0x27]; // 0x27-0x30
uint8_t RegTestReserved31; // 0x31
uint8_t RegTestReserved32[0x40 - 0x32]; // 0x32-0x40
// I/O settings
uint8_t RegDioMapping1; // 0x40
uint8_t RegDioMapping2; // 0x41
// Version
uint8_t RegVersion; // 0x42
// Additional settings
uint8_t RegAgcRef; // 0x43
uint8_t RegAgcThresh1; // 0x44
uint8_t RegAgcThresh2; // 0x45
uint8_t RegAgcThresh3; // 0x46
// Test
uint8_t RegTestReserved47[0x4B - 0x47]; // 0x47-0x4A
// Additional settings
uint8_t RegPllHop; // 0x4B
uint8_t RegTestReserved4C; // 0x4C
uint8_t RegPaDac; // 0x4D
// Test
//uint8_t RegTestReserved4E[0x58-0x4E]; // 0x4E-0x57
// Additional settings
//uint8_t RegTcxo; // 0x58
// Test
//uint8_t RegTestReserved59; // 0x59
// Test
//uint8_t RegTestReserved5B; // 0x5B
// Additional settings
//uint8_t RegPll; // 0x5C
// Test
//uint8_t RegTestReserved5D; // 0x5D
// Additional settings
//uint8_t RegPllLowPn; // 0x5E
// Test
//uint8_t RegTestReserved5F[0x6C - 0x5F]; // 0x5F-0x6B
// Additional settings
//uint8_t RegFormerTemp; // 0x6C
// Test
//uint8_t RegTestReserved6D[0x71 - 0x6D]; // 0x6D-0x70
}Sx1276RegType;
#define SIZE_OF_REGISTERS (sizeof(Sx1276RegType))
//RF state machine
typedef enum{
RFLR_STATE_IDLE,
RFLR_STATE_RX_RUNNING,
RFLR_STATE_TX_RUNNING,
}LRStateType;
typedef enum{
RADIO_RESET_OFF,
RADIO_RESET_ON,
}tRadioResetState;
typedef enum{
RF_IDLE,
RF_BUSY,
RF_RX_DONE,
RF_RX_TIMEOUT,
RF_TX_DONE,
RF_TX_TIMEOUT,
RF_LEN_ERROR,
RF_CHANNEL_EMPTY,
RF_CHANNEL_ACTIVITY_DETECTED,
}Sx1276RetType;
typedef enum{
SX1276_BW_7K8= (0),
SX1276_BW_10K4= (1<<4),
SX1276_BW_15K6= (2<<4),
SX1276_BW_20K8= (3<<4),
SX1276_BW_31K2= (4<<4),
SX1276_BW_41K6= (5<<4),
SX1276_BW_62K5= (6<<4),
SX1276_BW_125K= (7<<4),
SX1276_BW_250K= (8<<4),
SX1276_BW_500K= (9<<4)
}Sx1276BwType;
typedef enum{
SX1276_SF_64= (6<<4),
SX1276_SF_128= (7<<4),
SX1276_SF_256= (8<<4),
SX1276_SF_512= (9<<4),
SX1276_SF_1024= (10<<4),
SX1276_SF_2048= (11<<4),
SX1276_SF_4096= (12<<4)
}Sx1276SpreadFactorType;
typedef enum{
SX1276_EC_4_5= (1<<1),
SX1276_EC_4_6= (2<<1),
SX1276_EC_4_7= (3<<1),
SX1276_EC_4_8= (4<<1)
}Sx1276ErrorCodingType;
typedef enum{
SX1276_CRC_OFF= (0),
SX1276_CRC_ON= (1<<2)
}Sx1276CrcOnType;
typedef enum{
SX1276_IH_OFF= (0),
SX1276_IH_ON= (1)
}Sx1276ImplicitHeaderOnType;
// ɱ
typedef struct _AutoSfType{
Sx1276SpreadFactorType Sf;
uint8_t ucRssiMin, ucRssiMax;
uint16_t wTimeout;
}AutoSfType, *PAutoSf;
//Parameter
typedef enum{
LORAPT_STATUS,
LORAPT_CHANNEL,
LORAPT_FREQ,
LORAPT_BW,
LORAPT_SF,
LORAPT_EC,
LORAPT_RSSI,
LORAPT_POWER,
LORAPT_SET_RX,
LORAPT_SET_SLEEP,
LORAPT_MAX
}Sx1276LoraParaType;
#define SX1276_CHANNEL_MAX 17
#define LORA_RESET_SET() SET_LORA_RST()
#define LORA_RESET_CLR() CLR_LORA_RST()
#define LORA_SPI_NSS_SET() Spi_SetCS(M0P_SPI0, TRUE) //取消片选
#define LORA_SPI_NSS_CLR() Spi_SetCS(M0P_SPI0, FALSE) //使能器件
#define LORA_SPI_READ_WRITE(x) Spi0SendReceive(x)
#define LORA_GETDIO0() GET_LORA_DIO0()
#define LORA_GETDIO1() GET_LORA_DIO1()
#define USE_RF_SW 0
#define USE_LORA_LED 0
#if USE_RF_SW == 1
#define LORA_ANTTXEN() { \
SET_LORA_TXEN();\
CLR_LORA_RXEN();\
}
#define LORA_ANTRXEN() { \
SET_LORA_RXEN();\
CLR_LORA_TXEN();\
}
#define LORA_ANTCLOSE() { \
CLR_LORA_RXEN();\
CLR_LORA_TXEN();\
}
#else
#define LORA_ANTTXEN()
#define LORA_ANTRXEN()
#define LORA_ANTCLOSE()
#endif
#if USE_LORA_LED == 1
#define LORA_TXLED_ON() SET_LED_PIN()
#define LORA_TXLED_OFF() CLR_LED_PIN()
#else
#define LORA_TXLED_ON() SET_LORA_TX_LED()
#define LORA_TXLED_OFF() CLR_LORA_TX_LED()
#endif
#define LORA_BUFF_SIZE 255
typedef enum {
RF_ANT_TRANSMITTER,
RF_ANT_RECEIVER,
RF_ANT_CLOSE,
}Sx1276AntStatus_m;
typedef enum {
SX1276_SLEEP,
SX1276_IDLE,
SX1276_RX,
SX1276_TX,
SX1276_BUSY,
SX1276_ERROR,
SX1276_MAX
}Sx1276StateType_t;
typedef struct {
uint8_t ucChannel;
uint32_t dwFreqHz;
int8_t ucPower;
Sx1276BwType SignalBw;
Sx1276SpreadFactorType SpreadFactor;
Sx1276ErrorCodingType ErrorCoding;
uint8_t RegPreamble;
uint8_t ucOpModePrev;
Sx1276AntStatus_m bAntSwPrev;
Sx1276RegType RegBuff;
Sx1276StateType_t State;
uint8_t ucRxPacketSize;
uint8_t ucTxPacketSize;
uint8_t RxTxBuff[LORA_BUFF_SIZE];
void (*RxCallBack)(uint8_t *rBuff, uint8_t rlen);
}Sx1276Type_t, *pSx1276Type;
//ISM Freq In China
//Up Link:
//CH0-5: 470.3-471.3MHz
//CH39-44:478.1-479.1MHz
//CH78-95:485.9-489.3MHz
//Down Link:
//CH0-47:500.3-509.7MHz
#define USE_915MHZ 0//=1ʹ 915 =0ʹ 433
#if (USE_915MHZ == 1)
// Ƶ ʣ Ĭ Ϊ449000000Hz
#define FREQ_CENT 915000000ul
//860MHz-1GHzʹ PA ţ Ĭ ϲ ʹ
//SX127x 壬HOPERFģ Ҫ
#define USE_LORA_860_PA
#endif
/*
中心频率配置:433100000ul + 200000*N
*/
#define CH0 (433100000ul + 0) //测试频率
#define CH1 (433100000ul + 200000)
#define CH2 (433100000ul + 400000)
#define CH3 (433100000ul + 600000)
#define CH4 (433100000ul + 800000)
#define CH5 (433100000ul + 1000000)
#define CH6 (433100000ul + 1200000)
#define CH7 (433100000ul + 1400000)
#define CH8 (433100000ul + 1600000)
#define CH9 (433100000ul + 1800000)
#define CH10 (433100000ul + 2000000)
#if (USE_LORA_CH == 0)
#define FREQ_CENT CH0
#elif (USE_LORA_CH == 1)
#define FREQ_CENT CH1
#elif (USE_LORA_CH == 2)
#define FREQ_CENT CH2
#elif (USE_LORA_CH == 3)
#define FREQ_CENT CH3
#elif (USE_LORA_CH == 4)
#define FREQ_CENT CH4
#elif (USE_LORA_CH == 5)
#define FREQ_CENT CH5
#elif (USE_LORA_CH == 6)
#define FREQ_CENT CH6
#elif (USE_LORA_CH == 7)
#define FREQ_CENT CH7
#elif (USE_LORA_CH == 8)
#define FREQ_CENT CH8
#elif (USE_LORA_CH == 9)
#define FREQ_CENT CH9
#elif (USE_LORA_CH == 10)
#define FREQ_CENT CH10
#endif
#if !defined FREQ_CENT
#define FREQ_CENT (433100000ul + 0)//200000
#endif
#if !defined FREQ_DEV
#define FREQ_DEV 1000000ul
#endif
//////////////////////////////////////////////////////////////////////
void Sx1276LoRaLoopHandler(void);
void Sx1276LoRaInit(void (*RxCallBack)(uint8_t *rBuff, uint8_t rlen));
void Sx1276LoRaSendBuffer(uint8_t* pucBuff, uint8_t ucLen);
uint8_t SX1276LoRaReadChannel(void);
boolean_t SX1276LoRaWriteChannel(uint8_t Channel);
uint32_t SX1276LoRaReadFreq(void);
void SX1276LoRaWriteFreq(uint32_t Freq);
void SX1276LoRaWriteBw(Sx1276BwType SignalBw);
uint32_t SX1276LoRaReadBw(void);
uint8_t SX1276LoRaReadSf(void);
void SX1276LoRaWriteSf(Sx1276SpreadFactorType SpreadFactor);
void SX1276LoRaWriteEc(Sx1276ErrorCodingType ErrorCoding);
uint8_t SX1276LoRaReadEc(void);
uint32_t SX1276LoRaParaReadRssi(void);
uint8_t SX1276LoRaReadRssiPkt(void);
void SX1276LoRaWritePwr(int8_t Pwr);
void SX1276LoRaWriteRx(void);
void SX1276LoRaWriteSleep(boolean_t Sleep);
Sx1276StateType_t SX1276LoRaReadStatus(void);
void SX1276LoCalcRssiSnr(int8_t *pswRssi, int8_t *psbSnr);
void Sx1276LoRaSleep(void);
void Sx1276LoRaWakeup(void);
#endif
+247
View File
@@ -0,0 +1,247 @@
//=====================================================================================================
// MahonyAHRS.c
//=====================================================================================================
//
// Madgwick's implementation of Mayhony's AHRS algorithm.
// See: http://www.x-io.co.uk/node/8#open_source_ahrs_and_imu_algorithms
//
// Date Author Notes
// 29/09/2011 SOH Madgwick Initial release
// 02/10/2011 SOH Madgwick Optimised for reduced CPU load
//
//=====================================================================================================
//---------------------------------------------------------------------------------------------------
// Header files
#include "MahonyAHRS.h"
#include <math.h>
//---------------------------------------------------------------------------------------------------
// Definitions
#define sampleFreq 10.0f // sample frequency in Hz
#define twoKpDef (2.0f * 1.0f) // 2 * proportional gain
#define twoKiDef (2.0f * 0.0f) // 2 * integral gain
//---------------------------------------------------------------------------------------------------
// Variable definitions
volatile float twoKp = twoKpDef; // 2 * proportional gain (Kp)
volatile float twoKi = twoKiDef; // 2 * integral gain (Ki)
volatile float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f; // quaternion of sensor frame relative to auxiliary frame
volatile float integralFBx = 0.0f, integralFBy = 0.0f, integralFBz = 0.0f; // integral error terms scaled by Ki
//---------------------------------------------------------------------------------------------------
// Function declarations
//====================================================================================================
// Functions
//---------------------------------------------------------------------------------------------------
// AHRS algorithm update
void MahonyAHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz) {
float recipNorm;
float q0q0, q0q1, q0q2, q0q3, q1q1, q1q2, q1q3, q2q2, q2q3, q3q3;
float hx, hy, bx, bz;
float halfvx, halfvy, halfvz, halfwx, halfwy, halfwz;
float halfex, halfey, halfez;
float qa, qb, qc;
// Use IMU algorithm if magnetometer measurement invalid (avoids NaN in magnetometer normalisation)
// 在磁力计数据无效时使用六轴融合算法
if((mx == 0.0f) && (my == 0.0f) && (mz == 0.0f)) {
MahonyAHRSupdateIMU(gx, gy, gz, ax, ay, az);
return;
}
// Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
// 只在加速度计数据有效时才进行运算
if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {
// Normalise accelerometer measurement
// 将加速度计得到的实际重力加速度向量v单位化
recipNorm = invSqrt(ax * ax + ay * ay + az * az);
ax *= recipNorm;
ay *= recipNorm;
az *= recipNorm;
// Normalise magnetometer measurement
// 将磁力计得到的实际磁场向量m单位化
recipNorm = invSqrt(mx * mx + my * my + mz * mz);
mx *= recipNorm;
my *= recipNorm;
mz *= recipNorm;
// Auxiliary variables to avoid repeated arithmetic
// 辅助变量,以避免重复运算
q0q0 = q0 * q0;
q0q1 = q0 * q1;
q0q2 = q0 * q2;
q0q3 = q0 * q3;
q1q1 = q1 * q1;
q1q2 = q1 * q2;
q1q3 = q1 * q3;
q2q2 = q2 * q2;
q2q3 = q2 * q3;
q3q3 = q3 * q3;
// Reference direction of Earth's magnetic field
// 通过磁力计测量值与坐标转换矩阵得到大地坐标系下的理论地磁向量
hx = 2.0f * (mx * (0.5f - q2q2 - q3q3) + my * (q1q2 - q0q3) + mz * (q1q3 + q0q2));
hy = 2.0f * (mx * (q1q2 + q0q3) + my * (0.5f - q1q1 - q3q3) + mz * (q2q3 - q0q1));
bx = sqrt(hx * hx + hy * hy);
bz = 2.0f * (mx * (q1q3 - q0q2) + my * (q2q3 + q0q1) + mz * (0.5f - q1q1 - q2q2));
// Estimated direction of gravity and magnetic field
// 将理论重力加速度向量与理论地磁向量变换至机体坐标系
halfvx = q1q3 - q0q2;
halfvy = q0q1 + q2q3;
halfvz = q0q0 - 0.5f + q3q3;
halfwx = bx * (0.5f - q2q2 - q3q3) + bz * (q1q3 - q0q2);
halfwy = bx * (q1q2 - q0q3) + bz * (q0q1 + q2q3);
halfwz = bx * (q0q2 + q1q3) + bz * (0.5f - q1q1 - q2q2);
// Error is sum of cross product between estimated direction and measured direction of field vectors
// 通过向量外积得到重力加速度向量和地磁向量的实际值与测量值之间误差
halfex = (ay * halfvz - az * halfvy) + (my * halfwz - mz * halfwy);
halfey = (az * halfvx - ax * halfvz) + (mz * halfwx - mx * halfwz);
halfez = (ax * halfvy - ay * halfvx) + (mx * halfwy - my * halfwx);
// Compute and apply integral feedback if enabled
// 在PI补偿器中积分项使能情况下计算并应用积分项
if(twoKi > 0.0f) {
integralFBx += twoKi * halfex * (1.0f / sampleFreq); // integral error scaled by Ki
integralFBy += twoKi * halfey * (1.0f / sampleFreq);
integralFBz += twoKi * halfez * (1.0f / sampleFreq);
gx += integralFBx; // apply integral feedback // 应用误差补偿中的积分项
gy += integralFBy;
gz += integralFBz;
}
else {
integralFBx = 0.0f; // prevent integral windup // 避免为负值的Ki时积分异常饱和
integralFBy = 0.0f;
integralFBz = 0.0f;
}
// Apply proportional feedback
// 应用误差补偿中的比例项
gx += twoKp * halfex;
gy += twoKp * halfey;
gz += twoKp * halfez;
}
// Integrate rate of change of quaternion
// 微分方程迭代求解
gx *= (0.5f * (1.0f / sampleFreq)); // pre-multiply common factors
gy *= (0.5f * (1.0f / sampleFreq));
gz *= (0.5f * (1.0f / sampleFreq));
qa = q0;
qb = q1;
qc = q2;
q0 += (-qb * gx - qc * gy - q3 * gz);
q1 += (qa * gx + qc * gz - q3 * gy);
q2 += (qa * gy - qb * gz + q3 * gx);
q3 += (qa * gz + qb * gy - qc * gx);
// Normalise quaternion
// 单位化四元数 保证四元数在迭代过程中保持单位性质
recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
q0 *= recipNorm;
q1 *= recipNorm;
q2 *= recipNorm;
q3 *= recipNorm;
//Mahony官方程序到此结束,使用时只需在函数外进行四元数反解欧拉角即可完成全部姿态解算过程
}
//---------------------------------------------------------------------------------------------------
// IMU algorithm update
void MahonyAHRSupdateIMU(float gx, float gy, float gz, float ax, float ay, float az) {
float recipNorm;
float halfvx, halfvy, halfvz;//1/2 重力分量
float halfex, halfey, halfez;//1/2 重力误差
float qa, qb, qc;
// Compute feedback only if accelerometer measurement valid (avoids NaN in accelerometer normalisation)
// 在磁力计数据无效时使用六轴融合算法
if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) {
// Normalise accelerometer measurement
recipNorm = invSqrt(ax * ax + ay * ay + az * az);
ax *= recipNorm;
ay *= recipNorm;
az *= recipNorm;
// Estimated direction of gravity and vector perpendicular to magnetic flux
halfvx = q1 * q3 - q0 * q2;
halfvy = q0 * q1 + q2 * q3;
halfvz = q0 * q0 - 0.5f + q3 * q3;
// Error is sum of cross product between estimated and measured direction of gravity
halfex = (ay * halfvz - az * halfvy);
halfey = (az * halfvx - ax * halfvz);
halfez = (ax * halfvy - ay * halfvx);
// Compute and apply integral feedback if enabled
if(twoKi > 0.0f) {
integralFBx += twoKi * halfex * (1.0f / sampleFreq); // integral error scaled by Ki
integralFBy += twoKi * halfey * (1.0f / sampleFreq);
integralFBz += twoKi * halfez * (1.0f / sampleFreq);
gx += integralFBx; // apply integral feedback
gy += integralFBy;
gz += integralFBz;
}
else {
integralFBx = 0.0f; // prevent integral windup
integralFBy = 0.0f;
integralFBz = 0.0f;
}
// Apply proportional feedback
gx += twoKp * halfex;
gy += twoKp * halfey;
gz += twoKp * halfez;
}
// Integrate rate of change of quaternion
gx *= (0.5f * (1.0f / sampleFreq)); // pre-multiply common factors
gy *= (0.5f * (1.0f / sampleFreq));
gz *= (0.5f * (1.0f / sampleFreq));
qa = q0;
qb = q1;
qc = q2;
q0 += (-qb * gx - qc * gy - q3 * gz);
q1 += (qa * gx + qc * gz - q3 * gy);
q2 += (qa * gy - qb * gz + q3 * gx);
q3 += (qa * gz + qb * gy - qc * gx);
// Normalise quaternion
recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
q0 *= recipNorm;
q1 *= recipNorm;
q2 *= recipNorm;
q3 *= recipNorm;
}
//---------------------------------------------------------------------------------------------------
// Fast inverse square-root
// See: http://en.wikipedia.org/wiki/Fast_inverse_square_root
float invSqrt(float x) {
float halfx = 0.5f * x;
float y = x;
long i = *(long*)&y;
i = 0x5f3759df - (i>>1);
y = *(float*)&i;
y = y * (1.5f - (halfx * y * y));
return y;
}
//====================================================================================================
// END OF CODE
//====================================================================================================
+32
View File
@@ -0,0 +1,32 @@
//=====================================================================================================
// MahonyAHRS.h
//=====================================================================================================
//
// Madgwick's implementation of Mayhony's AHRS algorithm.
// See: http://www.x-io.co.uk/node/8#open_source_ahrs_and_imu_algorithms
//
// Date Author Notes
// 29/09/2011 SOH Madgwick Initial release
// 02/10/2011 SOH Madgwick Optimised for reduced CPU load
//
//=====================================================================================================
#ifndef MahonyAHRS_h
#define MahonyAHRS_h
//----------------------------------------------------------------------------------------------------
// Variable declaration
extern volatile float twoKp; // 2 * proportional gain (Kp)
extern volatile float twoKi; // 2 * integral gain (Ki)
extern volatile float q0, q1, q2, q3; // quaternion of sensor frame relative to auxiliary frame
//---------------------------------------------------------------------------------------------------
// Function declarations
float invSqrt(float x);
void MahonyAHRSupdate(float gx, float gy, float gz, float ax, float ay, float az, float mx, float my, float mz);
void MahonyAHRSupdateIMU(float gx, float gy, float gz, float ax, float ay, float az);
#endif
//=====================================================================================================
// End of file
//=====================================================================================================
+269
View File
@@ -0,0 +1,269 @@
/* Includes ------------------------------------------------------------------*/
#include "lsm6dsl_app.h"
#include "lsm6dsl_reg.h"
#include <string.h>
#include <stdio.h>
#include "bsp.h"
#include "UartDebug.h"
#include "main.h"
#include "i2c.h"
#include "Algorithm.h"
dev_ctx_t dev_ctx;
static bool InitFlag;
#define ACC_CVTTIME (20 * 1000)
#define ACC_COLL_CNT_MAX 6
#define ACC_FIFO_WATERMASK (ACC_COLL_CNT_MAX * 6) //采集一秒数据
#define TX_BUF_DIM 1000
#define BOOT_TIME 15 //ms
typedef enum {
Acc_Idle,
Acc_Start,
Acc_Get_Data,
Acc_Wait_GetData,
Acc_Go_Bypass,
}AccStatusType_m;
static AccStatusType_m acc_status;
static uint32_t acc_cvttime;
static bool Lsm6dslWaterMarkFullIntFlag;
static bool Lsm6dslWakeupIntFlag;
static int16_t data_raw_acceleration[3];
static int16_t data_raw_angular_rate[3];
static int16_t data_raw_temperature;
static float acceleration_mg[3][ACC_COLL_CNT_MAX];
static float angular_rate_mdps[3][ACC_COLL_CNT_MAX];
static float temperature_degC;
static uint8_t whoamI, rst;
static void platform_delay(uint32_t ms)
{
delay_ms(ms);
}
static void platform_write(uint8_t reg, uint8_t *bufp, uint32_t len)
{
uint16_t Selve_Add = LSM6DSL_I2C_ADD_L >> 1;
I2C_MasterWriteData(M0P_I2C0, Selve_Add, reg, bufp, len);
}
static void platform_read(uint8_t reg, uint8_t *bufp, uint32_t len)
{
uint16_t Selve_Add = LSM6DSL_I2C_ADD_L >> 1;
I2C_MasterReadData(M0P_I2C0, Selve_Add, reg, bufp, len);
}
static void Lsm6dsl_Init(void)
{
/* Initialize mems driver interface */
dev_ctx.write_reg = platform_write;
dev_ctx.read_reg = platform_read;
dev_ctx.mdelay = platform_delay;
/* Wait sensor boot time */
platform_delay(BOOT_TIME);
/* Check device ID */
whoamI = 0;
lsm6dsl_device_id_get(&dev_ctx, &whoamI);
acc_cvttime = 100;
while(whoamI != LSM6DSL_ID){
if(acc_cvttime <= 0){
DBG_LOG("LSM6DS INIT Err...\r\n"); /*manage here device not found */
InitFlag = false;
return;
}
}
/* Restore default configuration */
lsm6dsl_reset_set(&dev_ctx, PROPERTY_ENABLE);
do {
lsm6dsl_reset_get(&dev_ctx, &rst);
} while (rst);
lsm6dsl_xl_power_mode_set(&dev_ctx, LSM6DSL_XL_NORMAL);
/* Enable Block Data Update */
lsm6dsl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
/* Set Output Data Rate */
lsm6dsl_xl_data_rate_set(&dev_ctx, LSM6DSL_XL_ODR_12Hz5);
lsm6dsl_gy_data_rate_set(&dev_ctx, LSM6DSL_GY_ODR_12Hz5);
//lsm6dsl_gy_data_rate_set(&left_dev_ctx, LSM6DSL_GY_ODR_OFF); //关闭地磁
/* Set full scale */
lsm6dsl_xl_full_scale_set(&dev_ctx, LSM6DSL_2g);
lsm6dsl_gy_full_scale_set(&dev_ctx, LSM6DSL_2000dps);
/* Configure filtering chain(No aux interface) */
/* Accelerometer - analog filter */
lsm6dsl_xl_filter_analog_set(&dev_ctx, LSM6DSL_XL_ANA_BW_400Hz);
/* Accelerometer - LPF1 path ( LPF2 not used )*/
/*lsm6dsl_xl_lp1_bandwidth_set(&left_dev_ctx, LSM6DSL_XL_LP1_ODR_DIV_4);*/
/* Accelerometer - LPF1 + LPF2 path */
lsm6dsl_xl_lp2_bandwidth_set(&dev_ctx, LSM6DSL_XL_LOW_NOISE_LP_ODR_DIV_9);
/* Accelerometer - High Pass / Slope path */
/*lsm6dsl_xl_reference_mode_set(&left_dev_ctx, PROPERTY_DISABLE);*/
/*lsm6dsl_xl_hp_bandwidth_set(&left_dev_ctx, LSM6DSL_XL_HP_ODR_DIV_100);*/
/* Gyroscope - filtering chain */
lsm6dsl_gy_band_pass_set(&dev_ctx, LSM6DSL_HP_260mHz_LP1_STRONG);
//fifo模式设置
lsm6dsl_fifo_xl_batch_set(&dev_ctx, LSM6DSL_FIFO_XL_NO_DEC);//fifo加速度写入频率设置
lsm6dsl_fifo_gy_batch_set(&dev_ctx, LSM6DSL_FIFO_GY_NO_DEC);//fifo陀螺仪写入频率设置
lsm6dsl_fifo_data_rate_set(&dev_ctx, LSM6DSL_FIFO_12Hz5);//FIFO ODR选择
//中断1设置,watermark full中断
lsm6dsl_int1_route_t int1val ={0, 0, 0};
int1val.int1_full_flag = 1; //开阀值中断,fifo存储到缓存深度时触发
lsm6dsl_pin_int1_route_set(&dev_ctx, int1val);
lsm6dsl_fifo_watermark_set(&dev_ctx, ACC_FIFO_WATERMASK);//FIFO水印电平设置,阈值设置,缓存深度
lsm6dsl_fifo_stop_on_wtm_set(&dev_ctx, 1);//fifo缓存深度存满时,不再存储
//lsm6dsl_fifo_xl_gy_8bit_format_set(&left_dev_ctx, 1);//在FIFO中为XL和陀螺启用MSByte记忆,缓存宽度
lsm6dsl_block_data_update_set(&dev_ctx, 1); //fifo模式ctrl3_c bdu必须为1,直到读取MSB和LSB后才更新输出寄存器
lsm6dsl_auto_increment_set(&dev_ctx, 1); //fifo模式ctrl3_c if_inc必须为1,通过串行接口(I2C或SPI)进行多字节访问时自动增加寄存器地址。
lsm6dsl_ctrl3_c_t ctrl3_c;
platform_read(LSM6DSL_CTRL3_C, (uint8_t *)&ctrl3_c, 1);
//lsm6dsl_fifo_mode_set(&dev_ctx, LSM6DSL_FIFO_MODE);
//中断2设置,唤醒中断
// uint8_t temp = 0x90; //唤醒中断
// platform_write(LSM6DSL_TAP_CFG, &temp, 1);
// temp = 0;
// platform_write(LSM6DSL_WAKE_UP_DUR, &temp, 1);
// lsm6dsl_wkup_threshold_set(&left_dev_ctx, 0x20);
// lsm6dsl_int2_route_t int2val ={0, 0, 0};
// int2val.int2_wu = 1;
// lsm6dsl_pin_int2_route_set(&left_dev_ctx, int2val);
if(InitFlag == false){
DBG_LOG("LSM6DS INIT OK...\r\n");
InitFlag = true;
}
}
extern void Lsm6dDataProcessCallBack(float *Acc, float *Gy);
static void Acc_IntHandler(void)
{
uint16_t DiffFifo;
AccGyData_t AccGy;
AccData_t Acc;
float VectorG;
float AverageAcc[XYZ], AverageGy[XYZ];
lsm6dsl_fifo_data_level_get(&dev_ctx, &DiffFifo);
if(DiffFifo == 0) {
return;
}
if(DiffFifo > ACC_FIFO_WATERMASK)
DiffFifo = ACC_FIFO_WATERMASK;
for(int i = 0; i < DiffFifo / 6; i++) {
lsm6dsl_fifo_raw_data_get(&dev_ctx, (uint8_t *)&AccGy, sizeof(AccGy));
angular_rate_mdps[X][i] = lsm6dsl_from_fs2000dps_to_mdps(AccGy.GyX);
angular_rate_mdps[Y][i] = lsm6dsl_from_fs2000dps_to_mdps(AccGy.GyY);
angular_rate_mdps[Z][i] = lsm6dsl_from_fs2000dps_to_mdps(AccGy.GyZ);
acceleration_mg[X][i] = lsm6dsl_from_fs2g_to_mg(AccGy.AccX);
acceleration_mg[Y][i] = lsm6dsl_from_fs2g_to_mg(AccGy.AccY);
acceleration_mg[Z][i] = lsm6dsl_from_fs2g_to_mg(AccGy.AccZ);
}
AverageGy[X] = IntFilter_Float(angular_rate_mdps[0], DiffFifo / 6, 2);
AverageGy[Y] = IntFilter_Float(angular_rate_mdps[1], DiffFifo / 6, 2);
AverageGy[Z] = IntFilter_Float(angular_rate_mdps[2], DiffFifo / 6, 2);
AverageAcc[X] = IntFilter_Float(acceleration_mg[0], DiffFifo / 6, 2);
AverageAcc[Y] = IntFilter_Float(acceleration_mg[1], DiffFifo / 6, 2);
AverageAcc[Z] = IntFilter_Float(acceleration_mg[2], DiffFifo / 6, 2);
Lsm6dDataProcessCallBack(AverageAcc, AverageGy);
acc_status = Acc_Go_Bypass;
}
static void ReadWakeUpIntStatus(void)
{
lsm6dsl_wake_up_src_t wake_up_src;
if(Lsm6dslWakeupIntFlag) {
Lsm6dslWakeupIntFlag = false;
platform_read(LSM6DSL_WAKE_UP_SRC, (uint8_t *)&wake_up_src, sizeof(lsm6dsl_wake_up_src_t));
}
}
void Lsm6dslLoopHandler(void)
{
ReadWakeUpIntStatus();
switch(acc_status)
{
case Acc_Idle:
break;
case Acc_Start:
if(acc_cvttime > 0)
break;
lsm6dsl_fifo_mode_set(&dev_ctx, LSM6DSL_FIFO_MODE);
acc_status = Acc_Get_Data;
acc_cvttime = ACC_CVTTIME;
break;
case Acc_Get_Data:
acc_cvttime = 1000;
acc_status = Acc_Wait_GetData;
break;
case Acc_Wait_GetData:
if(acc_cvttime <= 0){
acc_status = Acc_Go_Bypass;
}
else if(Lsm6dslWaterMarkFullIntFlag) {
Lsm6dslWaterMarkFullIntFlag = false;
uint8_t wtm_flag;
lsm6dsl_fifo_wtm_flag_get(&dev_ctx, &wtm_flag);
Acc_IntHandler();
acc_status = Acc_Go_Bypass;
}
break;
case Acc_Go_Bypass:
lsm6dsl_fifo_mode_set(&dev_ctx, LSM6DSL_BYPASS_MODE);
Lsm6dsStop();
acc_status = Acc_Idle;
acc_cvttime = 1;
break;
}
}
void Lsm6dsl1mSRoutine(void)
{
if(acc_cvttime > 0)
acc_cvttime--;
}
void Lsm6dslInit(void)
{
Lsm6dsl_Init();
}
void Lsm6dsStart(void)
{
Lsm6dsl_Init();
acc_status = Acc_Start;
}
void Lsm6dsStop(void)
{
lsm6dsl_xl_data_rate_set(&dev_ctx, LSM6DSL_XL_ODR_OFF);
lsm6dsl_gy_data_rate_set(&dev_ctx, LSM6DSL_GY_ODR_OFF);
lsm6dsl_fifo_data_rate_set(&dev_ctx, LSM6DSL_FIFO_DISABLE);
acc_status = Acc_Idle;
}
void Lsm6dsInt1CallBack(void)
{
Lsm6dslWaterMarkFullIntFlag = true;
}
void Lsm6dsInt2CallBack(void)
{
Lsm6dslWakeupIntFlag = true;
//Tilt.Acc_IRQ_Status = true;
}
+36
View File
@@ -0,0 +1,36 @@
#ifndef __LSM6DSL_APP_H__
#define __LSM6DSL_APP_H__
#include "bsp.h"
#define X 0
#define Y 1
#define Z 2
#define XYZ 3
typedef struct {
uint16_t GyX;
uint16_t GyY;
uint16_t GyZ;
uint16_t AccX;
uint16_t AccY;
uint16_t AccZ;
}AccGyData_t;
typedef struct {
uint16_t AccX;
uint16_t AccY;
uint16_t AccZ;
}AccData_t;
void Lsm6dslInit(void);
void Lsm6dslLoopHandler(void);
void Lsm6dsl1mSRoutine(void);
void Lsm6dsStart(void);
void Lsm6dsStop(void);
void Lsm6dsInt1CallBack(void);
void Lsm6dsInt2CallBack(void);
#endif
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+343
View File
@@ -0,0 +1,343 @@
#include "main.h"
#include "mmc5983.h"
#include "UartDebug.h"
#include "i2c.h"
#include "Algorithm.h"
static int32_t max_in[XYZ];
static int32_t min_in[XYZ];
static bool InitFlag;
static bool MMC5983IntFlag;
static MMC5983Var_t MMC5983Var;
/*****************************************************************************************
* 函数名称: MMC5983_Write_Reg
* 功能描述: MMC5983写寄存器
* 参 数: reg 寄存器地址
val 寄存器数据
* 返 回 值: 成功返回true,失败返回false
*****************************************************************************************/
static bool MMC5983_Write_Reg(uint8_t reg, uint8_t val)
{
return I2C_MasterWriteData(M0P_I2C0, MMC5983_ADDRESS, reg, &val, 1);
}
/*****************************************************************************************
* 函数名称: MMC5983_Read_Reg
* 功能描述: MMC5983读寄存器
* 参 数: reg 寄存器地址
* 返 回 值: 返回寄存器值
*****************************************************************************************/
static uint8_t MMC5983_Read_Reg(uint8_t reg)
{
uint8_t res;
if(I2C_MasterReadData(M0P_I2C0, MMC5983_ADDRESS, reg, &res, 1) == false)
res = 0;
return res;
}
/*****************************************************************************************
* 函数名称: MMC5983_Read_Buffer
* 功能描述: MMC5983读数据
* 参 数: reg 寄存器地址
buffer 读取数据输出缓存入口
len 读取长度
* 返 回 值: 成功返回true,失败返回false
*****************************************************************************************/
static bool MMC5983_Read_Buffer(uint8_t reg, void *buffer, uint8_t len)
{
return I2C_MasterReadData(M0P_I2C0, MMC5983_ADDRESS, reg, buffer, len);
}
/*****************************************************************************************
* 函数名称: MMC5983StartCov
* 功能描述: MMC5983开启连续转换
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void MMC5983StartCov(void)
{
MMC5983RegCtrl2 Ctrl2Reg; //开启/关闭连续转换
Ctrl2Reg.Byte = 0x00;
Ctrl2Reg.Bit.Cm_freq = 0x04;
Ctrl2Reg.Bit.Cmm_en = 1; //连续设1,单次设0
Ctrl2Reg.Bit.Prd_set = 3;
Ctrl2Reg.Bit.En_prd_set = 1; //连续设1,单次设0
MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte);
}
/*****************************************************************************************
* 函数名称: MMC5983_Init
* 功能描述: MMC5983初始化
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
static void MMC5983_Init(void)
{
uint8_t id;
id = MMC5983_Read_Reg(MMC5983_ID);
//DBG_LOG("MMC5983 id=0x%x\r\n",id);
MMC5983Var.MMC5983Delay1mSCnt = 100;
while(id != 0x30){
if(MMC5983Var.MMC5983Delay1mSCnt <= 0) {
DBG_LOG("LEFT MMC5983 INIT Err...\r\n");
InitFlag = false;
return;
}
}
MMC5983RegCtrl1 Ctrl1Reg;
Ctrl1Reg.Byte = 0x00;
Ctrl1Reg.Bit.SW_RST = 1;
MMC5983_Write_Reg(MMC5983_CTRL_1, Ctrl1Reg.Byte);
MMC5983Delay(15);
MMC5983RegCtrl2 Ctrl2Reg; //开启/关闭连续转换
Ctrl2Reg.Byte = 0x00;
Ctrl2Reg.Bit.Cm_freq = 0x04;
Ctrl2Reg.Bit.Cmm_en = 0; //连续设1,单次设0
Ctrl2Reg.Bit.Prd_set = 3;
Ctrl2Reg.Bit.En_prd_set = 0; //连续设1,单次设0
MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte);
MMC5983RegCtrl3 Ctrl3Reg;
Ctrl3Reg.Byte = 0x00;
Ctrl3Reg.Bit.St_enm = 1;
Ctrl3Reg.Bit.St_enp = 1;
MMC5983_Write_Reg(MMC5983_CTRL_3, Ctrl3Reg.Byte);
MMC5983RegCtrl0 Ctrl0Reg;
Ctrl0Reg.Byte = 0x00;
Ctrl0Reg.Bit.TM_M = 1;
Ctrl0Reg.Bit.Auto_SR_en = 1;
Ctrl0Reg.Bit.NT_meas_done_en = 1;
MMC5983_Write_Reg(MMC5983_CTRL_0, Ctrl0Reg.Byte);
if(InitFlag == false){
DBG_LOG("MMC5983 INIT OK...\r\n");
InitFlag = true;
}
}
/*****************************************************************************************
* 函数名称: MMC5983_Read
* 功能描述: MMC5983读取原始数据
* 参 数: MagAdcX X轴数据
MagAdcY Y轴数据
MagAdcZ Z轴数据
* 返 回 值: 成功返回true,失败返回false
*****************************************************************************************/
static bool MMC5983_Read(int32_t *MagAdcX, int32_t *MagAdcY, int32_t *MagAdcZ)
{
static uint8_t buff[7];
if (MMC5983_Read_Buffer(MMC5983_X_OUT_H, buff, 7) == false)
return false;
*MagAdcX = (buff[0] << 10) | (buff[1] << 2) | ((buff[6] & 0xC0) >> 6);
*MagAdcY = (buff[2] << 10) | (buff[3] << 2) | ((buff[6] & 0x30) >> 4);
*MagAdcZ = (buff[4] << 10) | (buff[5] << 2) | ((buff[6] & 0x0C) >> 2);// Turn the 18 bits into unsigned 32-bit value
return true;
}
/*****************************************************************************************
* 函数名称: MMC5983_Get_Mag
* 功能描述: 外部获取MMC5983磁场强度数据
* 参 数: mag 读取数据输出缓存入口
* 返 回 值: 无
*****************************************************************************************/
void MMC5983_Get_Mag(float *mag)
{
if(mag == NULL)
return;
float ADVal[XYZ];
ADVal[X] = MMC5983Var.Mag_Original[X] - 131072.0f;
ADVal[Y] = MMC5983Var.Mag_Original[Y] - 131072.0f;
ADVal[Z] = MMC5983Var.Mag_Original[Z] - 131072.0f;
mag[0] = (float) (ADVal[X] * MMC5983_MAG_SCALE_18BIT);
mag[1] = (float) (ADVal[Y] * MMC5983_MAG_SCALE_18BIT);
mag[2] = (float) (ADVal[Z] * MMC5983_MAG_SCALE_18BIT);
}
/*****************************************************************************************
* 函数名称: MMC5983LoopHandler
* 功能描述: MMC5983循环处理函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
extern void MmcDataProcessCallBack(float *Mag);
void MMC5983LoopHandler(void)
{
static int32_t mag_array[XYZ][10];
static uint8_t magcnt;
static uint8_t TimeOutMagcnt;
switch(MMC5983Var.Status) {
case MMC5983_STATUS_IDLE:{
break;}
case MMC5983_STATUS_START:{
for(int i = 0; i < 10; i++) {
mag_array[X][i] = 0;
mag_array[Y][i] = 0;
mag_array[Z][i] = 0;
}
magcnt = 0;
TimeOutMagcnt = 0;
memset(&MMC5983Var, NULL, sizeof(MMC5983Var));
MMC5983Var.Status = MMC5983_STATUS_DELAY;
break;}
case MMC5983_STATUS_DELAY:{
MMC5983StartRead();
MMC5983Var.MMC5983Delay1mSCnt = 50;
MMC5983Var.Status = MMC5983_STATUS_WAIT_DELAY;
break;}
case MMC5983_STATUS_WAIT_DELAY:{
if(MMC5983Var.MMC5983Delay1mSCnt <= 0){
MMC5983Var.Status = MMC5983_STATUS_READ;
}
break;}
case MMC5983_STATUS_READ:{
MMC5983Var.MMC5983Delay1mSCnt = 50;
MMC5983Var.Status = MMC5983_STATUS_WAIT_READ;
break;}
case MMC5983_STATUS_WAIT_READ:{
if(MMC5983Var.MMC5983Delay1mSCnt <= 0){
MMC5983Var.Status = MMC5983_STATUS_DELAY;
TimeOutMagcnt++;
}
if(MMC5983IntFlag == true){
MMC5983IntFlag = false;
MMC5983_Read(&mag_array[X][magcnt], &mag_array[Y][magcnt], &mag_array[Z][magcnt]);
magcnt++;
MMC5983Var.Status = MMC5983_STATUS_DELAY;
}
if(TimeOutMagcnt >= 10){
TimeOutMagcnt = 0;
if(magcnt > 0){
MMC5983Var.Mag_Original[X] = AverageFilter_32t(mag_array[X], magcnt);
MMC5983Var.Mag_Original[Y] = AverageFilter_32t(mag_array[Y], magcnt);
MMC5983Var.Mag_Original[Z] = AverageFilter_32t(mag_array[Z], magcnt);
magcnt = 0;
MMC5983_Get_Mag(MMC5983Var.Mag);
MmcDataProcessCallBack(MMC5983Var.Mag);
MMC5983Var.Status = MMC5983_STATUS_STOP;
}
else{
MMC5983Var.Status = MMC5983_STATUS_STOP;
// DBG_LOG("LEFT MMC5983 TimeOut...\r\n");
}
}
if(magcnt >= 10){
MMC5983Var.Mag_Original[X] = AverageFilter_32t(mag_array[X], magcnt);
MMC5983Var.Mag_Original[Y] = AverageFilter_32t(mag_array[Y], magcnt);
MMC5983Var.Mag_Original[Z] = AverageFilter_32t(mag_array[Z], magcnt);
magcnt = 0;
MMC5983_Get_Mag(MMC5983Var.Mag);
MmcDataProcessCallBack(MMC5983Var.Mag);
MMC5983Var.Status = MMC5983_STATUS_STOP;
}
break;}
case MMC5983_STATUS_STOP:{
MMC5983Stop();
MMC5983Var.Status = MMC5983_STATUS_IDLE;
//MMC5983Var.Status = MMC5983_STATUS_START;//持续工作
break;}
}
}
/*****************************************************************************************
* 函数名称: LeftMMC59831mSRoutine
* 功能描述: MMC59831ms时基循环处理函数
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void MMC59831mSRoutine(void)
{
if(MMC5983Var.MMC5983Delay1mSCnt > 0)
MMC5983Var.MMC5983Delay1mSCnt--;
}
/*****************************************************************************************
* 函数名称: LeftMMC5983Init
* 功能描述: MMC5983初始化
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void MMC5983Init(void)
{
if(!InitFlag){
MMC5983_Init();
return;
}
MMC5983Var.Status = MMC5983_STATUS_START;
}
/*****************************************************************************************
* 函数名称: LeftMMC5983Start
* 功能描述: MMC5983启动
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void MMC5983Start(void)
{
if(!InitFlag){
MMC5983_Init();
return;
}
MMC5983Var.Status = MMC5983_STATUS_START;
}
/*****************************************************************************************
* 函数名称: LeftMMC5983StartRead
* 功能描述: MMC5983启动读取
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void MMC5983StartRead(void)
{
MMC5983_Init();//读取时重新初始化
}
/*****************************************************************************************
* 函数名称: MMC5983Stop
* 功能描述: MMC5983停止
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void MMC5983Stop(void)
{
MMC5983RegCtrl0 Ctrl0Reg;
Ctrl0Reg.Byte = 0x00;
MMC5983_Write_Reg(MMC5983_CTRL_0, Ctrl0Reg.Byte);
MMC5983RegStatus StatusReg;
StatusReg.Byte = MMC5983_Read_Reg(MMC5983_STATUS);
if(StatusReg.Bit.Meas_M_Done == 1){
MMC5983_Write_Reg(MMC5983_STATUS, StatusReg.Byte);
}
}
/*****************************************************************************************
* 函数名称: LeftMMC5983IntCallBack
* 功能描述: MMC5983中断回调
* 参 数: 无
* 返 回 值: 无
*****************************************************************************************/
void MMC5983IntCallBack(void)
{
MMC5983IntFlag = true;
}
+140
View File
@@ -0,0 +1,140 @@
/**
*****************************************************************************
* @file ak8975.h
* @author WWJ
* @version v1.0
* @date 2019/04/09
* @environment stm32f407
* @brief
*****************************************************************************
**/
#ifndef _MMC5983_H
#define _MMC5983_H
#include "bsp.h"
#define X 0
#define Y 1
#define Z 2
#define XYZ 3
#define MAX(A, B) (A > B) ? A : B;
#define MIN(A, B) (A < B) ? A : B;
#define MMC5983_X_OUT_H 0X00 //Device ID = 0x48
#define MMC5983_X_OUT_L 0X01
#define MMC5983_Y_OUT_H 0X02
#define MMC5983_Y_OUT_L 0X03
#define MMC5983_Z_OUT_H 0X04
#define MMC5983_Z_OUT_L 0X05
#define MMC5983_XYZ_OUT 0X06
#define MMC5983_TMP_OUT 0X07
#define MMC5983_STATUS 0X08
#define MMC5983_CTRL_0 0X09
#define MMC5983_CTRL_1 0X0A
#define MMC5983_CTRL_2 0X0B
#define MMC5983_CTRL_3 0X0C
#define MMC5983_ID 0X2F
#define MMC5983_ADDRESS 0x30
#define MMC5983_MAG_SCALE_16BIT 0.24414f
#define MMC5983_MAG_SCALE_18BIT 0.061035f
#define MMC5983Delay(x) delay_ms(x)
typedef union {
struct {
uint8_t Meas_M_Done: 1;
uint8_t Meas_T_Done: 1;
uint8_t Res0: 2;
uint8_t OTP_Read_Done: 1;
uint8_t Res1: 3;
}Bit;
uint8_t Byte;
}MMC5983RegStatus;
typedef union {
struct {
uint8_t TM_M: 1;
uint8_t TM_T: 1;
uint8_t NT_meas_done_en: 1;
uint8_t Set: 1;
uint8_t Reset: 1;
uint8_t Auto_SR_en: 1;
uint8_t OTP_Read: 1;
uint8_t Res0: 1;
}Bit;
uint8_t Byte;
}MMC5983RegCtrl0;
typedef union {
struct {
uint8_t BW: 2;
uint8_t X_Inhibit: 1;
uint8_t YZ_Inhibit: 2;
uint8_t Res0: 2;
uint8_t SW_RST: 1;
}Bit;
uint8_t Byte;
}MMC5983RegCtrl1;
typedef union {
struct {
uint8_t Cm_freq: 3;
uint8_t Cmm_en: 1;
uint8_t Prd_set: 3;
uint8_t En_prd_set: 1;
}Bit;
uint8_t Byte;
}MMC5983RegCtrl2;
typedef union {
struct {
uint8_t Res0: 1;
uint8_t St_enp: 1;
uint8_t St_enm: 1;
uint8_t Res1: 3;
uint8_t Spi_3w: 1;
uint8_t Res2: 1;
}Bit;
uint8_t Byte;
}MMC5983RegCtrl3;
typedef enum{
MMC5983_STATUS_IDLE,
MMC5983_STATUS_START,
MMC5983_STATUS_DELAY,
MMC5983_STATUS_WAIT_DELAY,
MMC5983_STATUS_READ,
MMC5983_STATUS_WAIT_READ,
MMC5983_STATUS_STOP,
}MMC5983Status_m;
typedef struct {
MMC5983Status_m Status;
uint16_t MMC5983Delay1mSCnt;
float Mag[3];
int32_t Mag_Original[XYZ];
}MMC5983Var_t;
void MMC5983LoopHandler(void);
void MMC59831mSRoutine(void);
void MMC5983Init(void);
void MMC5983Start(void);
void MMC5983Stop(void);
void MMC5983IntCallBack(void);
void MMC5983Calib(void);
void MMC5983GetADValue(int32_t *Mag);
void MMC5983_Get_Mag(float *mag);
MMC5983Status_m GetMMC5983Status(void);
void MMC5983StartRead(void);
bool GetMMC5983CalibStatus(void);
#endif
/* end of ak8975.h */
+31
View File
@@ -0,0 +1,31 @@
设备前述:建议长时间供电,送检样机不需要进入低功耗,避免设备重复性差的问题。
该版本为低功耗版本,采用12V供电,休眠电流380uA,工作电流18mA
硬件版本记录:HV4.x系列
==>>Crack_Left_HV4.0 and Crack_Right_HV4.0
1、H7233-1LDO,输出稳定的3.3V,最大输入15V
2、HC32L170JATA-LQ48:设备的MCU主控芯片
3、LSM6DSLTR:六轴加速度芯片
4、MMC5983MA:三轴地磁芯片
5、MAX3471EUA+:串口转485芯片
6、Ra-02LORA通信芯片
硬件版本变更记录:
Crack_Left_HV4.0 ==> Crack_Left_HV4.1 Release 2024-06-21
Crack_Right_HV4.0 ==> Crack_Right_HV4.1 Release 2024-06-21
1、调整了主副板FPC母座位置
==> Crack_Left_HV4.0 Release 2024-06-12
==> Crack_Right_HV4.0 Release 2024-06-12
1、板框改大
2、连接座子换成5P+4P的FPC座子
3、传感器中断脚修改
代码版本变更记录:
CrackUnit_Active_SV1.0 ==>> CrackUnit_Active_SV1.1 Release 2024-08-08
1、使用了MMC5983中断引脚,修复了驱动bug
2、修复了均值滤波函数bug
==>>CrackUnit_Active_SV1.0 Release 2024-08-01
该版本为低功耗版本
+470
View File
@@ -0,0 +1,470 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file adc.h
**
** Header file for AD Converter functions
** @link ADC Group Some description @endlink
**
** - 2017-06-28 Alex First Version
**
******************************************************************************/
#ifndef __ADC_H__
#define __ADC_H__
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup AdcGroup AD Converter (ADC)
**
******************************************************************************/
//@{
/******************************************************************************
* Global definitions
******************************************************************************/
#define ADC_SCAN_CH0_EN (0x1u) /*!< SCAN模式使用ADC CH0 */
#define ADC_SCAN_CH1_EN (0x1u<<1) /*!< SCAN模式使用ADC CH1 */
#define ADC_SCAN_CH2_EN (0x1u<<2) /*!< SCAN模式使用ADC CH2 */
#define ADC_SCAN_CH3_EN (0x1u<<3) /*!< SCAN模式使用ADC CH3 */
#define ADC_SCAN_CH4_EN (0x1u<<4) /*!< SCAN模式使用ADC CH4 */
#define ADC_SCAN_CH5_EN (0x1u<<5) /*!< SCAN模式使用ADC CH5 */
#define ADC_SCAN_CH6_EN (0x1u<<6) /*!< SCAN模式使用ADC CH6 */
#define ADC_SCAN_CH7_EN (0x1u<<7) /*!< SCAN模式使用ADC CH7 */
/******************************************************************************
** Global type definitions
*****************************************************************************/
/**
******************************************************************************
** \brief ADC转换模式
*****************************************************************************/
typedef enum en_adc_mode
{
AdcSglMode = 0u, /*!< 单输入通道单次转换模式 */
AdcScanMode = 1u, /*!< 多输入通道顺序/插队扫描转换模式*/
}en_adc_mode_t;
/**
******************************************************************************
** \brief ADC时钟分频选择
*****************************************************************************/
typedef enum en_adc_clk_sel
{
AdcMskClkDiv1 = 0u<<2, /*!< PCLK */
AdcMskClkDiv2 = 1u<<2, /*!< 1/2 PCLK */
AdcMskClkDiv4 = 2u<<2, /*!< 1/4 PCLK */
AdcMskClkDiv8 = 3u<<2, /*!< 1/8 PCLK */
} en_adc_clk_div_t;
/**
******************************************************************************
** \brief ADC参考电压
*****************************************************************************/
typedef enum en_adc_ref_vol_sel
{
AdcMskRefVolSelInBgr1p5 = 0u<<9, /*!<内部参考电压1.5V(SPS<=200kHz)*/
AdcMskRefVolSelInBgr2p5 = 1u<<9, /*!<内部参考电压2.5V(avdd>3V,SPS<=200kHz)*/
AdcMskRefVolSelExtern1 = 2u<<9, /*!<外部输入(max avdd) PB01*/
AdcMskRefVolSelAVDD = 3u<<9, /*!<AVDD*/
}en_adc_ref_vol_sel_t;
/**
******************************************************************************
** \brief ADC转换通道选择
*****************************************************************************/
typedef enum en_adc_samp_ch_sel
{
AdcExInputCH0 = 0u, /*!<使用PA00*/
AdcExInputCH1 = 1u, /*!<使用PA01*/
AdcExInputCH2 = 2u, /*!<使用PA02*/
AdcExInputCH3 = 3u, /*!<使用PA03*/
AdcExInputCH4 = 4u, /*!<使用PA04*/
AdcExInputCH5 = 5u, /*!<使用PA05*/
AdcExInputCH6 = 6u, /*!<使用PA06*/
AdcExInputCH7 = 7u, /*!<使用PA07*/
AdcExInputCH8 = 8u, /*!<使用PB00*/
AdcExInputCH9 = 9u, /*!<使用PB01*/
AdcExInputCH10 = 10u, /*!<使用PC00*/
AdcExInputCH11 = 11u, /*!<使用PC01*/
AdcExInputCH12 = 12u, /*!<使用PC02*/
AdcExInputCH13 = 13u, /*!<使用PC03*/
AdcExInputCH14 = 14u, /*!<使用PC04*/
AdcExInputCH15 = 15u, /*!<使用PC05*/
AdcExInputCH16 = 16u, /*!<使用PB02*/
AdcExInputCH17 = 17u, /*!<使用PB10*/
AdcExInputCH18 = 18u, /*!<使用PB11*/
AdcExInputCH19 = 19u, /*!<使用PB12*/
AdcExInputCH20 = 20u, /*!<使用PB13*/
AdcExInputCH21 = 21u, /*!<使用PB14*/
AdcExInputCH22 = 22u, /*!<使用PB15*/
AdcExInputCH23 = 23u, /*!<使用PE15*/
AdcExInputCH24 = 24u, /*!<使用PE14*/
AdcExInputCH25 = 25u, /*!<使用PE13*/
AdcDacInput = 26u, /*!<使用DAC输出(必须使用输入增益)*/
AdcAVccdiv3Input = 27u, /*!<使用1/3 AVCC(必须使用输入增益)*/
AdcAiTsInput = 28u, /*!<使用内置温度传感器BGR_TS(必须使用输入增益)*/
AdcVref1_2Input = 29u, /*!<使用内部基准1.2V(必须使用输入增益)*/
}en_adc_samp_ch_sel_t;
/**
******************************************************************************
** \brief ADC输入信号放大器控制
*****************************************************************************/
typedef enum en_adc_op_buf
{
AdcMskBufEnable = 1u<<11, /*!< 打开放大器BUF */
AdcMskBufDisable = 0u, /*!< 关闭放大器BUF */
} en_adc_op_buf_t;
/**
******************************************************************************
** \brief ADC采样周期选择
*****************************************************************************/
typedef enum en_adc_samp_cycle_sel
{
AdcMskSampCycle4Clk = 0u<<12, /*!<4个采样时钟*/
AdcMskSampCycle6Clk = 1u<<12, /*!<6个采样时钟*/
AdcMskSampCycle8Clk = 2u<<12, /*!<8个采样时钟*/
AdcMskSampCycle12Clk = 3u<<12, /*!<12个采样时钟*/
}en_adc_samp_cycle_sel_t;
/**
******************************************************************************
** \brief ADC内部参考电压使能控制
*****************************************************************************/
typedef enum en_adc_in_ref
{
AdcMskInRefEnable = 1u<<14, /*!< 内部参考电压使能 */
AdcMskInRefDisable = 0u, /*!< 内部参考电压关闭 */
}en_adc_in_ref_t;
/**
******************************************************************************
** \brief ADC周边模块反射源选择
*****************************************************************************/
typedef enum en_adc_trig_sel
{
AdcMskTrigTimer0 = 1u<<0, /*!<选择timer0中断源,自动触发ADC采样*/
AdcMskTrigTimer1 = 1u<<1, /*!<选择timer1中断源,自动触发ADC采样*/
AdcMskTrigTimer2 = 1u<<2, /*!<选择timer2中断源,自动触发ADC采样*/
AdcMskTrigTimer3 = 1u<<3, /*!<选择timer3中断源,自动触发ADC采样*/
AdcMskTrigTimer4 = 1u<<4, /*!<选择timer4中断源,自动触发ADC采样*/
AdcMskTrigTimer5 = 1u<<5, /*!<选择timer5中断源,自动触发ADC采样*/
AdcMskTrigTimer6 = 1u<<6, /*!<选择timer6中断源,自动触发ADC采样*/
AdcMskTrigUart0 = 1u<<7, /*!<选择uart0中断源,自动触发ADC采样*/
AdcMskTrigUart1 = 1u<<8, /*!<选择uart1中断源,自动触发ADC采样*/
AdcMskTrigLpuart0 = 1u<<9, /*!<选择lpuart0中断源,自动触发ADC采样*/
AdcMskTrigLpuart1 = 1u<<10, /*!<选择lpuart1中断源,自动触发ADC采样*/
AdcMskTrigVC0 = 1u<<11, /*!<选择VC0中断源,自动触发ADC采样*/
AdcMskTrigVC1 = 1u<<12, /*!<选择VC1中断源,自动触发ADC采样*/
AdcMskTrigRTC = 1u<<13, /*!<选择RTC中断源,自动触发ADC采样*/
AdcMskTrigPCA = 1u<<14, /*!<选择PCA中断源,自动触发ADC采样*/
AdcMskTrigSPI0 = 1u<<15, /*!<选择SPI0中断源,自动触发ADC采样*/
AdcMskTrigSPI1 = 1u<<16, /*!<选择SPI1中断源,自动触发ADC采样*/
AdcMskTrigDMA = 1u<<17, /*!<选择DMA中断源,自动触发ADC采样*/
AdcMskTrigPA03 = 1u<<18, /*!<选择PA03中断源,自动触发ADC采样*/
AdcMskTrigPB03 = 1u<<19, /*!<选择PB03中断源,自动触发ADC采样*/
AdcMskTrigPC03 = 1u<<20, /*!<选择PC03中断源,自动触发ADC采样*/
AdcMskTrigPD03 = 1u<<21, /*!<选择PD03中断源,自动触发ADC采样*/
AdcMskTrigPA07 = 1u<<22, /*!<选择PA07中断源,自动触发ADC采样*/
AdcMskTrigPB07 = 1u<<23, /*!<选择PB07中断源,自动触发ADC采样*/
AdcMskTrigPC07 = 1u<<24, /*!<选择PC07中断源,自动触发ADC采样*/
AdcMskTrigPD07 = 1u<<25, /*!<选择PD07中断源,自动触发ADC采样*/
AdcMskTrigPA11 = 1u<<26, /*!<选择PA11中断源,自动触发ADC采样*/
AdcMskTrigPB11 = 1u<<27, /*!<选择PB11中断源,自动触发ADC采样*/
AdcMskTrigPC11 = 1u<<28, /*!<选择PC11中断源,自动触发ADC采样*/
AdcMskTrigPA15 = 1u<<29, /*!<选择PA15中断源,自动触发ADC采样*/
AdcMskTrigPB15 = 1u<<30, /*!<选择PB15中断源,自动触发ADC采样*/
AdcMskTrigPC15 = 1u<<31, /*!<选择PC15中断源,自动触发ADC采样*/
}en_adc_trig_sel_t;
/**
******************************************************************************
** \brief ADC外部触发源寄存器选择
*****************************************************************************/
typedef enum en_adc_ext_trig_sel
{
AdcExtTrig0 = 0u, /*!<单次及顺序扫描转换 外部触发源选择寄存器*/
AdcExtTrig1 = 1u, /*!<插队扫描转换 外部触发源选择寄存器*/
}en_adc_ext_trig_sel_t;
/**
******************************************************************************
** \brief ADC顺序转换通道
*****************************************************************************/
typedef enum en_adc_sqr_chmux
{
AdcSQRCH0MUX = 0u, /*!<顺序扫描模式转换通道0*/
AdcSQRCH1MUX = 1u, /*!<顺序扫描模式转换通道1*/
AdcSQRCH2MUX = 2u, /*!<顺序扫描模式转换通道2*/
AdcSQRCH3MUX = 3u, /*!<顺序扫描模式转换通道3*/
AdcSQRCH4MUX = 4u, /*!<顺序扫描模式转换通道4*/
AdcSQRCH5MUX = 5u, /*!<顺序扫描模式转换通道5*/
AdcSQRCH6MUX = 6u, /*!<顺序扫描模式转换通道6*/
AdcSQRCH7MUX = 7u, /*!<顺序扫描模式转换通道7*/
AdcSQRCH8MUX = 8u, /*!<顺序扫描模式转换通道8*/
AdcSQRCH9MUX = 9u, /*!<顺序扫描模式转换通道9*/
AdcSQRCH10MUX = 10u, /*!<顺序扫描模式转换通道10*/
AdcSQRCH11MUX = 11u, /*!<顺序扫描模式转换通道11*/
AdcSQRCH12MUX = 12u, /*!<顺序扫描模式转换通道12*/
AdcSQRCH13MUX = 13u, /*!<顺序扫描模式转换通道13*/
AdcSQRCH14MUX = 14u, /*!<顺序扫描模式转换通道14*/
AdcSQRCH15MUX = 15u, /*!<顺序扫描模式转换通道15*/
}en_adc_sqr_chmux_t;
/**
******************************************************************************
** \brief ADC插队转换通道
*****************************************************************************/
typedef enum en_adc_jqr_chmux
{
AdcJQRCH0MUX = 0u, /*!<转换通道0*/
AdcJQRCH1MUX = 1u, /*!<转换通道1*/
AdcJQRCH2MUX = 2u, /*!<转换通道2*/
AdcJQRCH3MUX = 3u, /*!<转换通道3*/
}en_adc_jqr_chmux_t;
/**
******************************************************************************
** \brief ADC结果对齐方式
*****************************************************************************/
typedef enum en_adc_align
{
AdcAlignRight = 0u,
AdcAlignLeft = 1u,
}en_adc_align_t;
/**
******************************************************************************
** \brief ADC转换结果自动累加功能
*****************************************************************************/
typedef enum en_adc_result_acc
{
AdcResultAccEnable = 1u,
AdcResultAccDisable = 0u,
}en_adc_result_acc_t;
/**
******************************************************************************
** \brief ADC中断类型定义
*****************************************************************************/
typedef enum en_adc_irq_type
{
AdcMskIrqJqr = 1u<<5, /*!<ADC插队扫描转换完成*/
AdcMskIrqSqr = 1u<<4, /*!<ADC顺序扫描转换完成*/
AdcMskIrqReg = 1u<<3, /*!<ADC转换结果比较区间内*/
AdcMskIrqHt = 1u<<2, /*!<ADC转换结果高于HT*/
AdcMskIrqLt = 1u<<1, /*!<ADC转换结果低于LT*/
AdcMskIrqSgl = 1u<<0, /*!<ADC单次转换完成*/
}en_adc_irq_type_t;
/******************************************************************************
** Extern type definitions ('typedef')
******************************************************************************/
/**
******************************************************************************
** \brief ADC初始化配置结构体
*****************************************************************************/
typedef struct stc_adc_cfg
{
en_adc_mode_t enAdcMode; /*! ADC转换模式*/
en_adc_clk_div_t enAdcClkDiv; /*! ADC时钟选择*/
en_adc_samp_cycle_sel_t enAdcSampCycleSel; /*! ADC采样周期选择*/
en_adc_ref_vol_sel_t enAdcRefVolSel; /*! ADC参考电压选择*/
en_adc_op_buf_t enAdcOpBuf; /*! ADC输入信号放大器控制使能*/
en_adc_in_ref_t enInRef; /*! ADC内部参考电压使能*/
en_adc_align_t enAdcAlign; /*! ADC转换结果对齐控制*/
}stc_adc_cfg_t;
/**
******************************************************************************
** \brief ADC顺序扫描模式配置结构体
*****************************************************************************/
typedef struct stc_adc_sqr_cfg
{
uint8_t u8SqrCnt; /*! ADC顺序扫描转换次数*/
en_adc_result_acc_t enResultAcc; /*! ADC转换结果自动累加功能*/
boolean_t bSqrDmaTrig; /*! ADC顺序扫描转换完成DMA触发使能*/
}stc_adc_sqr_cfg_t;
/**
******************************************************************************
** \brief ADC插队扫描模式配置结构体
*****************************************************************************/
typedef struct stc_adc_jqr_cfg
{
uint8_t u8JqrCnt; /*! ADC顺序扫描转换次数*/
boolean_t bJqrDmaTrig; /*! ADC插队扫描转换完成DMA触发使能*/
}stc_adc_jqr_cfg_t;
/**
******************************************************************************
** \brief ADC比较功能配置结构体
*****************************************************************************/
typedef struct stc_adc_threshold_cfg
{
boolean_t bAdcRegCmp ; /*!ADC区间使能*/
boolean_t bAdcHtCmp ; /*!ADC上超出区间使能*/
boolean_t bAdcLtCmp ; /*!ADC下超出区间使能*/
uint32_t u32AdcHighThd; /*!ADC比较上阈值*/
uint32_t u32AdcLowThd; /*!ADC比较下阈值*/
en_adc_samp_ch_sel_t enSampChSel; /*!ADC采样通道选择*/
}stc_adc_threshold_cfg_t;
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
//ADC 初始化
en_result_t Adc_Init(stc_adc_cfg_t* pstcAdcCfg);
//ADC 中断使能
void Adc_EnableIrq(void);
//ADC 中断禁止
void Adc_DisableIrq(void);
//ADC 中断/采样完成状态获取
boolean_t Adc_GetIrqStatus(en_adc_irq_type_t enAdcIrq);
//ADC 中断/采样完成状态清除
void Adc_ClrIrqStatus(en_adc_irq_type_t enAdcIrq);
//ADC 使能
void Adc_Enable(void);
//ADC 禁止
void Adc_Disable(void);
//ADC 顺序扫描模式配置
en_result_t Adc_SqrModeCfg(stc_adc_sqr_cfg_t* pstcAdcSqrCfg);
//ADC 插队扫描模式配置
en_result_t Adc_JqrModeCfg(stc_adc_jqr_cfg_t* pstcAdcJqrCfg);
//ADC Sgl 单次转换模式通道选择配置
en_result_t Adc_CfgSglChannel( en_adc_samp_ch_sel_t enstcAdcSampCh);
//ADC SQR 顺序扫描转换模式通道选择配置
en_result_t Adc_CfgSqrChannel(en_adc_sqr_chmux_t enstcAdcSqrChMux, en_adc_samp_ch_sel_t enstcAdcSampCh);
//ADC JQR 插队扫描转换模式通道选择配置
en_result_t Adc_CfgJqrChannel(en_adc_jqr_chmux_t enstcAdcJqrChMux, en_adc_samp_ch_sel_t enstcAdcSampCh);
///<ADC 单次转换外部触发源配置
void Adc_SglExtTrigCfg(en_adc_trig_sel_t enAdcTrigSel, boolean_t bValue);
///<ADC 顺序扫描转换外部触发源配置
void Adc_SqrExtTrigCfg(en_adc_trig_sel_t enAdcTrigSel, boolean_t bValue);
///<ADC 插队扫描转换外部触发源配置
void Adc_JqrExtTrigCfg(en_adc_trig_sel_t enAdcTrigSel, boolean_t bValue);
//ADC 阈值比较功能配置
void Adc_ThresholdCfg(stc_adc_threshold_cfg_t* pstcAdcThrCfg);
//ADC 单次转换模式启动
void Adc_SGL_Start(void);
//ADC 单次转换模式停止
void Adc_SGL_Stop(void);
//ADC 单次转换模式一直转换模式启动
void Adc_SGL_Always_Start(void);
//ADC 单次转换模式一直转换模式停止
void Adc_SGL_Always_Stop(void);
//ADC 顺序扫描转换模式启动
void Adc_SQR_Start(void);
//ADC 顺序扫描转换模式停止
void Adc_SQR_Stop(void);
//ADC 插队扫描转换模式启动
void Adc_JQR_Start(void);
//ADC 插队扫描转换模式停止
void Adc_JQR_Stop(void);
//获取单次转换采样值
uint32_t Adc_GetSglResult(void);
//获取顺序扫描采样值
uint32_t Adc_GetSqrResult(en_adc_sqr_chmux_t enstcAdcSqrChMux);
//获取插队扫描采样值
uint32_t Adc_GetJqrResult(en_adc_jqr_chmux_t enstcAdcJqrChMux);
//获取累加采样值
uint32_t Adc_GetAccResult(void);
//clear ADC 累加寄存器结果清除
void Adc_ClrAccResult(void);
//@}
#ifdef __cplusplus
}
#endif
#endif /* __ADC_H__ */
/******************************************************************************/
/* EOF (not truncated) */
/******************************************************************************/
+878
View File
@@ -0,0 +1,878 @@
/*******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file adt.h
**
** Headerfile for Advance Timer functions
** @link ADT Group Some description @endlink
**
** - 2018-04-19 Husj First Version
**
******************************************************************************/
#ifndef __ADT_H__
#define __ADT_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup AdtGroup Advance Timer (ADT)
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief ADT CHx通道定义
*****************************************************************************/
typedef enum en_adt_CHxX_port
{
AdtCHxA = 0u, ///< CHx A通道
AdtCHxB = 1u, ///< CHx B通道
}en_adt_CHxX_port_t;
/**
******************************************************************************
** \brief ADT TRIG端口定义
*****************************************************************************/
typedef enum en_adt_trig_port
{
AdtTrigA = 0u, ///< TIMx 触发A端口
AdtTrigB = 1u, ///< TIMx 触发B端口
AdtTrigC = 2u, ///< TIMx 触发C端口
AdtTrigD = 3u, ///< TIMx 触发D端口
}en_adt_trig_port_t;
/**
******************************************************************************
** \brief ADT通用控制 - Z相输入屏蔽周期数
**
** \note
******************************************************************************/
typedef enum en_adt_gconr_zmsk
{
AdtZMaskDis = 0u, ///< Z相输入屏蔽功能无效
AdtZMask4Cyl = 1u, ///< 位置计数上溢后或下溢后的4个计数周期内的Z相输入被屏蔽
AdtZMask8Cyl = 2u, ///< 位置计数上溢后或下溢后的8个计数周期内的Z相输入被屏蔽
AdtZMask16Cyl = 3u, ///< 位置计数上溢后或下溢后的16个计数周期内的Z相输入被屏蔽
}en_adt_gconr_zmsk_t;
/**
******************************************************************************
** \brief ADT通用控制 - 计数时钟选择
**
** \note
******************************************************************************/
typedef enum en_adt_cnt_ckdiv
{
AdtClkPClk0 = 0u, ///< PCLK0
AdtClkPClk0Div2 = 1u, ///< PCLK0/2
AdtClkPClk0Div4 = 2u, ///< PCLK0/4
AdtClkPClk0Div8 = 3u, ///< PCLK0/8
AdtClkPClk0Div16 = 4u, ///< PCLK0/16
AdtClkPClk0Div64 = 5u, ///< PCLK0/64
AdtClkPClk0Div256 = 6u, ///< PCLK0/256
AdtClkPClk0Div1024 = 7u, ///< PCLK0/1024
}en_adt_cnt_ckdiv_t;
/**
******************************************************************************
** \brief ADT计数模式
**
** \note
******************************************************************************/
typedef enum en_adt_cnt_mode
{
AdtSawtoothMode = 0u, ///< 锯齿波模式
AdtTriangleModeA = 4u, ///< 三角波A模式
AdtTriangleModeB = 5u, ///< 三角波B模式
}en_adt_cnt_mode_t;
/**
******************************************************************************
** \brief ADT计数方向
**
** \note
******************************************************************************/
typedef enum en_adt_cnt_dir
{
AdtCntDown = 0u, ///< 递减计数
AdtCntUp = 1u, ///< 递加计数
}en_adt_cnt_dir_t;
/**
******************************************************************************
** \brief ADT通用比较基准
**
** \note
******************************************************************************/
typedef enum en_adt_compare
{
AdtCompareA = 0u, ///< 通用比较基准A
AdtCompareB = 1u, ///< 通用比较基准B
AdtCompareC = 2u, ///< 通用比较基准C
AdtCompareD = 3u, ///< 通用比较基准D
}en_adt_compare_t;
/**
******************************************************************************
** \brief ADT专用比较基准
**
** \note
******************************************************************************/
typedef enum en_adt_special_compare
{
AdtSpclCompA = 0u, ///< 专用比较基准A
AdtSpclCompB = 1u, ///< 专用比较基准B
}en_adt_special_compare_t;
/**
******************************************************************************
** \brief ADT端口控制 - TIMx输出状态控制
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_disval
{
AdtTIMxDisValNorm = 0u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口正常输出
AdtTIMxDisValHiZ = 1u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口输出高阻态
AdtTIMxDisValLow = 2u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口输出低电平
AdtTIMxDisValHigh = 3u, ///< 强制输出无效条件0~3中被选择的条件成立时,CHx端口输出高电平
}en_adt_pconr_disval_t;
/**
******************************************************************************
** \brief ADT端口控制 - CHx强制输出无效条件选择
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_dissel
{
AdtCHxDisSel0 = 0u, ///< 选择强制输出无效条件0
AdtCHxDisSel1 = 1u, ///< 选择强制输出无效条件1
AdtCHxDisSel2 = 2u, ///< 选择强制输出无效条件2
AdtCHxDisSel3 = 3u, ///< 选择强制输出无效条件3
}en_adt_pconr_dissel_t;
/**
******************************************************************************
** \brief ADT端口控制 - CHx周期值匹配时端口状态设定
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_perc
{
AdtCHxPeriodLow = 0u, ///< 计数器计数值与周期值相等时,CHx端口输出保持为低电平
AdtCHxPeriodHigh = 1u, ///< 计数器计数值与周期值相等时,CHx端口输出设定为高电平
AdtCHxPeriodKeep = 2u, ///< 计数器计数值与周期值相等时,CHx端口输出设定为先前状态
AdtCHxPeriodInv = 3u, ///< 计数器计数值与周期值相等时,CHx端口输出设定为反转电平
}en_adt_pconr_perc_t;
/**
******************************************************************************
** \brief ADT端口控制 - CHx比较值匹配时端口状态设定
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_cmpc
{
AdtCHxCompareLow = 0u, ///< 计数器计数值与GCMxR相等时,CHx端口输出保持为低电平
AdtCHxCompareHigh = 1u, ///< 计数器计数值与GCMxR相等时,CHx端口输出设定为高电平
AdtCHxCompareKeep = 2u, ///< 计数器计数值与GCMxR相等时,CHx端口输出设定为先前状态
AdtCHxCompareInv = 3u, ///< 计数器计数值与GCMxR相等时,CHx端口输出设定为反转电平
}en_adt_pconr_cmpc_t;
/**
******************************************************************************
** \brief ADT端口控制 - CHx端口输出
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_port_out
{
AdtCHxPortOutLow = 0u, ///< CHx端口输出设定为低电平
AdtCHxPortOutHigh = 1u, ///< CHx端口输出设定为高电平
}en_adt_pconr_port_out_t;
/**
******************************************************************************
** \brief ADT端口控制 - CHx端口功能模式选择
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_capc
{
AdtCHxCompareOutput = 0u, ///< CHx端口设定为比较输出功能
AdtCHxCompareInput = 1u, ///< CHx端口设定为捕获输入功能
}en_adt_pconr_capc_t;
/**
******************************************************************************
** \brief ADT端口控制 - CHx计数开始停止端口状态选择
**
** \note
******************************************************************************/
typedef enum en_adt_pconr_stastps
{
AdtCHxStateSelSS = 0u, ///< 计数开始或停止时,CHx端口输出由STACB、STPCB决定
AdtCHxStateSelKeep = 1u, ///< 计数开始或停止时,CHx端口输出设定为先前状态
}en_adt_pconr_stastps_t;
/**
******************************************************************************
** \brief ADT死区控制 - CHx死区分离设定
**
** \note
******************************************************************************/
typedef enum en_adt_dconr_sepa
{
AdtCHxDtSeperate = 0u, ///< DTUAR和DTDAR分别设定
AdtCHxDtEqual = 1u, ///< DTDAR的值和DTUAR的值自动相等
}en_adt_dconr_sepa_t;
/**
******************************************************************************
** \brief ADT滤波控制 - TRIx/TIMxIx端口滤波采样基准时钟选择
**
** \note
******************************************************************************/
typedef enum en_adt_fconr_nofick
{
AdtFltClkPclk0 = 0u, ///< PCLK0
AdtFltClkPclk0Div4 = 1u, ///< PCLK0/4
AdtFltClkPclk0Div16 = 2u, ///< PCLK0/16
AdtFltClkPclk0Div64 = 3u, ///< PCLK0/64
}en_adt_fconr_nofick_t;
/**
******************************************************************************
** \brief ADT有效周期 - TIMx有效周期选择
**
** \note
******************************************************************************/
typedef enum en_adt_vperr_pcnts
{
AdtPeriodCnts0 = 0u, ///< 有效周期选择功能无效
AdtPeriodCnts1 = 1u, ///< 每隔1个周期有效一次
AdtPeriodCnts2 = 2u, ///< 每隔2个周期有效一次
AdtPeriodCnts3 = 3u, ///< 每隔3个周期有效一次
AdtPeriodCnts4 = 4u, ///< 每隔4个周期有效一次
AdtPeriodCnts5 = 5u, ///< 每隔5个周期有效一次
AdtPeriodCnts6 = 6u, ///< 每隔6个周期有效一次
AdtPeriodCnts7 = 7u, ///< 每隔7个周期有效一次
}en_adt_vperr_pcnts_t;
/**
******************************************************************************
** \brief ADT有效周期 - 计数条件选择
**
** \note
******************************************************************************/
typedef enum en_adt_vperr_pcnte
{
AdtPeriodCnteDisable = 0u, ///< 有效周期选择功能无效
AdtPeriodCnteMin = 1u, ///< 锯齿波计数上、下溢点或三角波波谷做为计数条件
AdtPeriodCnteMax = 2u, ///< 锯齿波计数上、下溢点或三角波波峰做为计数条件
AdtPeriodCnteBoth = 3u, ///< 锯齿波计数上、下溢点或三角波波峰,波谷做为计数条件
}en_adt_vperr_pcnte_t;
/**
******************************************************************************
** \brief ADT端口触发控制 - 触发源选择
**
** \note
******************************************************************************/
typedef enum en_adt_ttrig_trigxs
{
AdtTrigxSelPA3 = 0u, ///< PA3
AdtTrigxSelPB3 = 1u, ///< PB3
AdtTrigxSelPC3 = 2u, ///< PC3
AdtTrigxSelPD3 = 3u, ///< PD3
AdtTrigxSelPA7 = 4u, ///< PA7
AdtTrigxSelPB7 = 5u, ///< PB7
AdtTrigxSelPC7 = 6u, ///< PC7
AdtTrigxSelPD7 = 7u, ///< PD7
AdtTrigxSelPA11 = 8u, ///< PA11
AdtTrigxSelPB11 = 9u, ///< PB11
AdtTrigxSelPC11 = 10u, ///< PC11
AdtTrigxSelPD1 = 11u, ///< PD1
AdtTrigxSelPA15 = 12u, ///< PA15
AdtTrigxSelPB15 = 13u, ///< PB15
AdtTrigxSelPC5 = 14u, ///< PC5
AdtTrigxSelPD5 = 15u, ///< PD5
}en_adt_ttrig_trigxs_t;
/**
******************************************************************************
** \brief ADT AOS触发控制 - AOSx触发源选择
**
** \note
******************************************************************************/
typedef enum en_adt_itrig_iaosxs
{
AdtAosxTrigSelTim0Int = 0u, ///< TIM0_INT
AdtAosxTrigSelTim1Int = 1u, ///< TIM1_INT
AdtAosxTrigSelTim2Int = 2u, ///< TIM2_INT
AdtAosxTrigSelLpTimInt = 3u, ///< LPTIMER_INT
AdtAosxTrigSelTim4Int = 4u, ///< TIM4_INT
AdtAosxTrigSelTim5Int = 5u, ///< TIM5_INT
AdtAosxTrigSelTim6Int = 6u, ///< TIM6_INT
AdtAosxTrigSelUart0Int = 7u, ///< UART0_INT
AdtAosxTrigSelUart1Int = 8u, ///< UART1_INT
AdtAosxTrigSelLpUartInt = 9u, ///< LPUART_INT
AdtAosxTrigSelVc0Int = 10u, ///< VC0_INT
AdtAosxTrigSelVc1Int = 11u, ///< VC1_INT
AdtAosxTrigSelRtcInt = 12u, ///< RTC_INT
AdtAosxTrigSelPcaInt = 13u, ///< PCA_INT
AdtAosxTrigSelSpiInt = 14u, ///< SPI_INT
AdtAosxTrigSelAdcInt = 15u, ///< ADC_INT
}en_adt_itrig_iaosxs_t;
/**
******************************************************************************
** \brief ADT硬件(启动/停止/清零/捕获)事件触发选择
**
** \note
******************************************************************************/
typedef enum en_adt_hw_trig
{
AdtHwTrigAos0 = 0u, ///< 从AOS来的事件触发0有效
AdtHwTrigAos1 = 1u, ///< 从AOS来的事件触发1有效
AdtHwTrigAos2 = 2u, ///< 从AOS来的事件触发2有效
AdtHwTrigAos3 = 3u, ///< 从AOS来的事件触发3有效
AdtHwTrigCHxARise = 4u, ///< CHxA端口上采样到上升沿
AdtHwTrigCHxAFall = 5u, ///< CHxA端口上采样到下降沿
AdtHwTrigCHxBRise = 6u, ///< CHxB端口上采样到上升沿
AdtHwTrigCHxBFall = 7u, ///< CHxB端口上采样到下降沿
AdtHwTrigTimTriARise = 8u, ///< TIMTRIA端口上采样到上升沿
AdtHwTrigTimTriAFall = 9u, ///< TIMTRIA端口上采样到下降沿
AdtHwTrigTimTriBRise = 10u, ///< TIMTRIB端口上采样到上升沿
AdtHwTrigTimTriBFall = 11u, ///< TIMTRIB端口上采样到下降沿
AdtHwTrigTimTriCRise = 12u, ///< TIMTRIC端口上采样到上升沿
AdtHwTrigTimTriCFall = 13u, ///< TIMTRIC端口上采样到下降沿
AdtHwTrigTimTriDRise = 14u, ///< TIMTRID端口上采样到上升沿
AdtHwTrigTimTriDFall = 15u, ///< TIMTRID端口上采样到下降沿
AdtHwTrigEnd = 16u,
}en_adt_hw_trig_t;
/**
******************************************************************************
** \brief ADT硬件(递加/递减)事件触发选择
**
** \note
******************************************************************************/
typedef enum en_adt_hw_cnt
{
AdtHwCntCHxALowCHxBRise = 0u, ///< CHxA端口为低电平时,CHxB端口上采样到上升沿
AdtHwCntCHxALowCHxBFall = 1u, ///< CHxA端口为低电平时,CHxB端口上采样到下降沿
AdtHwCntCHxAHighCHxBRise = 2u, ///< CHxA端口为高电平时,CHxB端口上采样到上升沿
AdtHwCntCHxAHighCHxBFall = 3u, ///< CHxA端口为高电平时,CHxB端口上采样到下降沿
AdtHwCntCHxBLowCHxARise = 4u, ///< CHxB端口为低电平时,CHxA端口上采样到上升沿
AdtHwCntCHxBLowCHxAFall = 5u, ///< CHxB端口为低电平时,CHxA端口上采样到下降沿
AdtHwCntCHxBHighChxARise = 6u, ///< CHxB端口为高电平时,CHxA端口上采样到上升沿
AdtHwCntCHxBHighCHxAFall = 7u, ///< CHxB端口为高电平时,CHxA端口上采样到下降沿
AdtHwCntTimTriARise = 8u, ///< TIMTRIA端口上采样到上升沿
AdtHwCntTimTriAFall = 9u, ///< TIMTRIA端口上采样到下降沿
AdtHwCntTimTriBRise = 10u, ///< TIMTRIB端口上采样到上升沿
AdtHwCntTimTriBFall = 11u, ///< TIMTRIB端口上采样到下降沿
AdtHwCntTimTriCRise = 12u, ///< TIMTRIC端口上采样到上升沿
AdtHwCntTimTriCFall = 13u, ///< TIMTRIC端口上采样到下降沿
AdtHwCntTimTriDRise = 14u, ///< TIMTRID端口上采样到上升沿
AdtHwCntTimTriDFall = 15u, ///< TIMTRID端口上采样到下降沿
AdtHwCntAos0 = 16u, ///< 从AOS来的事件触发0有效
AdtHwCntAos1 = 17u, ///< 从AOS来的事件触发1有效
AdtHwCntAos2 = 18u, ///< 从AOS来的事件触发2有效
AdtHwCntAos3 = 19u, ///< 从AOS来的事件触发3有效
AdtHwCntMax = 20u,
}en_adt_hw_cnt_t;
/**
******************************************************************************
** \brief ADT端口刹车极性控制
**
** \note
******************************************************************************/
typedef enum en_adt_ptbrk_polarity
{
AdtPtBrkHigh = 0u, ///< 端口刹车极性高电平有效
AdtPtBrkLow = 1u, ///< 端口刹车极性低电平有效
}en_adt_ptbrk_polarity_t;
/**
******************************************************************************
** \brief ADT PWM展频计数选择
**
** \note
******************************************************************************/
typedef enum en_adt_pwm_dither_type
{
AdtPwmDitherUnderFlow = 0u, ///< PWM展频计数下溢出
AdtPwmDitherOverFlow = 1u, ///< PWM展频计数上溢出
}en_adt_pwm_dither_type_t;
/**
******************************************************************************
** \brief ADT中断类型
**
** \note
******************************************************************************/
typedef enum en_adt_irq_type
{
AdtCMAIrq = 0u, ///< 计数匹配A(或捕获输入)中断
AdtCMBIrq = 1u, ///< 计数匹配B(或捕获输入)中断
AdtCMCIrq = 2u, ///< 计数匹配C中断
AdtCMDIrq = 3u, ///< 计数匹配D中断
AdtOVFIrq = 6u, ///< 上溢匹配中断
AdtUDFIrq = 7u, ///< 下溢匹配中断
AdtDTEIrq = 8u, ///< 死区时间错误中断
AdtSAMLIrq = 14u, ///< 同低中断
AdtSAMHIrq = 15u, ///< 同高中断
}en_adt_irq_type_t;
typedef enum en_adt_state_type
{
AdtCMAF = 0, ///< 计数匹配A标志
AdtCMBF = 1, ///< 计数匹配B标志
AdtCMCF = 2, ///< 计数匹配C标志
AdtCMDF = 3, ///< 计数匹配D标志
AdtOVFF = 6, ///< 上溢匹配标志
AdtUDFF = 7, ///< 下溢匹配标志
AdtDTEF = 8, ///< 死区时间错误标志
AdtCMSAUF = 9, ///< 向上计数专用比较基准值匹配A标志
AdtCMSADF = 10, ///< 向下计数专用比较基准值匹配B标志
AdtCMSBUF = 11, ///< 向上计数专用比较基准值匹配A标志
AdtCMSBDF = 12, ///< 向下计数专用比较基准值匹配B标志
AdtCntDir = 31, ///< 计数方向
}en_adt_state_type_t;
/**
******************************************************************************
** \brief ADT软件同步配置
** \note
******************************************************************************/
typedef struct stc_adt_sw_sync
{
boolean_t bAdTim4; ///< Timer 4
boolean_t bAdTim5; ///< Timer 5
boolean_t bAdTim6; ///< Timer 6
}stc_adt_sw_sync_t;
/**
******************************************************************************
** \brief ADT AOS触发配置
** \note
******************************************************************************/
typedef struct stc_adt_aos_trig_cfg
{
en_adt_itrig_iaosxs_t enAos0TrigSrc; ///< AOS0触发源选择
en_adt_itrig_iaosxs_t enAos1TrigSrc; ///< AOS1触发源选择
en_adt_itrig_iaosxs_t enAos2TrigSrc; ///< AOS2触发源选择
en_adt_itrig_iaosxs_t enAos3TrigSrc; ///< AOS3触发源选择
}stc_adt_aos_trig_cfg_t;
/**
******************************************************************************
** \brief ADT 中断触发配置
** \note
******************************************************************************/
typedef struct stc_adt_irq_trig_cfg
{
boolean_t bAdtSpecilMatchBTrigDmaEn; ///< 专用比较基准值匹配B使能触发DMA
boolean_t bAdtSpecilMatchATrigDmaEn; ///< 专用比较基准值匹配A使能触发DMA
boolean_t bAdtUnderFlowTrigDmaEn; ///< 下溢匹配使能触发DMA
boolean_t bAdtOverFlowTrigDmaEn; ///< 上溢匹配使能触发DMA
boolean_t bAdtCntMatchDTrigDmaEn; ///< 计数匹配D使能触发DMA
boolean_t bAdtCntMatchCTrigDmaEn; ///< 计数匹配C使能触发DMA
boolean_t bAdtCntMatchBTrigDmaEn; ///< 计数匹配B使能触发DMA
boolean_t bAdtCntMatchATrigDmaEn; ///< 计数匹配A使能触发DMA
boolean_t bAdtSpecilMatchBTrigEn; ///< 专用比较基准值匹配B使能触发ADC
boolean_t bAdtSpecilMatchATrigEn; ///< 专用比较基准值匹配A使能触发ADC
boolean_t bAdtUnderFlowTrigEn; ///< 下溢匹配使能触发ADC
boolean_t bAdtOverFlowTrigEn; ///< 上溢匹配使能触发ADC
boolean_t bAdtCntMatchDTrigEn; ///< 计数匹配D使能触发ADC
boolean_t bAdtCntMatchCTrigEn; ///< 计数匹配C使能触发ADC
boolean_t bAdtCntMatchBTrigEn; ///< 计数匹配B使能触发ADC
boolean_t bAdtCntMatchATrigEn; ///< 计数匹配A使能触发ADC
}stc_adt_irq_trig_cfg_t;
/**
******************************************************************************
** \brief ADT Trig端口配置
** \note
******************************************************************************/
typedef struct stc_adt_port_trig_cfg
{
en_adt_ttrig_trigxs_t enTrigSrc; ///< 触发源选择
boolean_t bFltEn; ///< 触发源捕获输入滤波使能
en_adt_fconr_nofick_t enFltClk; ///< 滤波采样基准时钟
}stc_adt_port_trig_cfg_t;
/**
******************************************************************************
** \brief ADT Z相输入屏蔽功能配置
** \note
******************************************************************************/
typedef struct stc_adt_zmask_cfg
{
en_adt_gconr_zmsk_t enZMaskCycle; ///< Z相输入屏蔽计数周期选择
boolean_t bFltPosCntMaksEn; ///< Z相输入时的屏蔽周期内,位置计数器的清零功能不屏蔽(FALSE)或屏蔽(TRUE)
boolean_t bFltRevCntMaksEn; ///< Z相输入时的屏蔽周期内,公转计数器的计数功能不屏蔽(FALSE)或屏蔽(TRUE)
}stc_adt_zmask_cfg_t;
/**
******************************************************************************
** \brief ADT TIMxX端口配置
** \note
******************************************************************************/
typedef struct stc_adt_TIMxX_port_cfg
{
en_adt_pconr_capc_t enCap; ///< 端口功能模式
boolean_t bOutEn; ///< 输出使能
en_adt_pconr_perc_t enPerc; ///< 周期值匹配时端口状态
en_adt_pconr_cmpc_t enCmpc; ///< 比较值匹配时端口状态
en_adt_pconr_stastps_t enStaStp; ///< 计数开始停止端口状态选择
en_adt_pconr_port_out_t enStaOut; ///< 计数开始端口输出状态
en_adt_pconr_port_out_t enStpOut; ///< 计数停止端口输出状态
en_adt_pconr_disval_t enDisVal; ///< 强制输出无效时输出状态控制
en_adt_pconr_dissel_t enDisSel; ///< 强制输出无效条件选择
boolean_t bFltEn; ///< 端口捕获输入滤波使能
en_adt_fconr_nofick_t enFltClk; ///< 端口滤波采样基准时钟
}stc_adt_CHxX_port_cfg_t;
/**
******************************************************************************
** \brief ADT刹车端口配置
** \note
******************************************************************************/
typedef struct stc_adt_break_port_cfg
{
boolean_t bPortEn; ///< 端口使能
en_adt_ptbrk_polarity_t enPol; ///< 极性选择
}stc_adt_break_port_cfg_t;
/**
******************************************************************************
** \brief ADT无效条件3配置
** \note
******************************************************************************/
typedef struct stc_adt_disable_3_cfg
{
stc_adt_break_port_cfg_t stcBrkPtCfg[16]; ///< 刹车端口配置
boolean_t bFltEn; ///< 刹车端口滤波使能
en_adt_fconr_nofick_t enFltClk; ///< 滤波采样基准时钟
}stc_adt_disable_3_cfg_t;
/**
******************************************************************************
** \brief ADT无效条件1配置
** \note
******************************************************************************/
typedef struct stc_adt_disable_1_cfg
{
boolean_t bTim6OutSH; ///< TIM6输出同高
boolean_t bTim5OutSH; ///< TIM5输出同高
boolean_t bTim4OutSH; ///< TIM4输出同高
boolean_t bTim6OutSL; ///< TIM6输出同低
boolean_t bTim5OutSL; ///< TIM5输出同低
boolean_t bTim4OutSL; ///< TIM4输出同低
}stc_adt_disable_1_cfg_t;
/**
******************************************************************************
** \brief ADT PWM展频计数配置
** \note
******************************************************************************/
typedef struct stc_adt_pwm_dither_cfg
{
en_adt_pwm_dither_type_t enAdtPDType; ///< PWM展频计数选择
boolean_t bTimxBPDEn; ///< PWM通道B展频使能
boolean_t bTimxAPDEn; ///< PWM通道A展频使能
}stc_adt_pwm_dither_cfg_t;
/**
******************************************************************************
** \brief ADT基本计数配置
** \note
******************************************************************************/
typedef struct stc_adt_basecnt_cfg
{
en_adt_cnt_mode_t enCntMode; ///< 计数模式
en_adt_cnt_dir_t enCntDir; ///< 计数方向
en_adt_cnt_ckdiv_t enCntClkDiv; ///< 计数时钟选择
}stc_adt_basecnt_cfg_t;
/**
******************************************************************************
** \brief ADT计数状态
** \note
******************************************************************************/
typedef struct stc_adt_cntstate_cfg
{
uint16_t u16Counter; ///< 当前计数器的计数值
boolean_t enCntDir; ///< 计数方向
uint8_t u8ValidPeriod; ///< 有效周期计数
boolean_t bCMSBDF; ///< 向下计数专用比较基准值匹配B标志
boolean_t bCMSBUF; ///< 向上计数专用比较基准值匹配A标志
boolean_t bCMSADF; ///< 向下计数专用比较基准值匹配B标志
boolean_t bCMSAUF; ///< 向上计数专用比较基准值匹配A标志
boolean_t bDTEF; ///< 死区时间错误标志
boolean_t bUDFF; ///< 下溢匹配标志
boolean_t bOVFF; ///< 上溢匹配标志
boolean_t bCMDF; ///< 计数匹配D标志
boolean_t bCMCF; ///< 计数匹配C标志
boolean_t bCMBF; ///< 计数匹配B标志
boolean_t bCMAF; ///< 计数匹配A标志
}stc_adt_cntstate_cfg_t;
/**
******************************************************************************
** \brief ADT有效计数周期
** \note
******************************************************************************/
typedef struct stc_adt_validper_cfg
{
en_adt_vperr_pcnts_t enValidCnt; ///< 有效周期选择
en_adt_vperr_pcnte_t enValidCdt; ///< 有效周期计数条件
boolean_t bPeriodD; ///< 通用信号有效周期选择D
boolean_t bPeriodC; ///< 通用信号有效周期选择C
boolean_t bPeriodB; ///< 通用信号有效周期选择B
boolean_t bPeriodA; ///< 通用信号有效周期选择A
}stc_adt_validper_cfg_t;
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
//配置硬件递加事件
en_result_t Adt_CfgHwCntUp(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_cnt_t enAdtHwCntUp);
//清除硬件递加事件
en_result_t Adt_ClearHwCntUp(M0P_ADTIM_TypeDef *ADTx);
//配置硬件递减事件
en_result_t Adt_CfgHwCntDwn(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_cnt_t enAdtHwCntDwn);
//清除硬件递减事件
en_result_t Adt_ClearHwCntDwn(M0P_ADTIM_TypeDef *ADTx);
//配置硬件启动事件
en_result_t Adt_CfgHwStart(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwStart);
//清除硬件启动事件
en_result_t Adt_ClearHwStart(M0P_ADTIM_TypeDef *ADTx);
//使能硬件启动事件
en_result_t Adt_EnableHwStart(M0P_ADTIM_TypeDef *ADTx);
//禁止硬件启动事件
en_result_t Adt_DisableHwStart(M0P_ADTIM_TypeDef *ADTx);
//配置硬件停止事件
en_result_t Adt_CfgHwStop(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwStop);
//清除硬件停止事件
en_result_t Adt_ClearHwStop(M0P_ADTIM_TypeDef *ADTx);
//使能硬件停止事件
en_result_t Adt_EnableHwStop(M0P_ADTIM_TypeDef *ADTx);
//禁止硬件停止事件
en_result_t Adt_DisableHwStop(M0P_ADTIM_TypeDef *ADTx);
//配置硬件清零事件
en_result_t Adt_CfgHwClear(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwClear);
//清除硬件清零事件
en_result_t Adt_ClearHwClear(M0P_ADTIM_TypeDef *ADTx);
//使能硬件清零事件
en_result_t Adt_EnableHwClear(M0P_ADTIM_TypeDef *ADTx);
//禁止硬件清零事件
en_result_t Adt_DisableHwClear(M0P_ADTIM_TypeDef *ADTx);
//配置A通道硬件捕获事件
en_result_t Adt_CfgHwCaptureA(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwCaptureA);
//清除A通道硬件捕获事件
en_result_t Adt_ClearHwCaptureA(M0P_ADTIM_TypeDef *ADTx);
//配置B通道硬件捕获事件
en_result_t Adt_CfgHwCaptureB(M0P_ADTIM_TypeDef *ADTx, en_adt_hw_trig_t enAdtHwCaptureB);
//清除B通道硬件捕获事件
en_result_t Adt_ClearHwCaptureB(M0P_ADTIM_TypeDef *ADTx);
//软件同步启动
en_result_t Adt_SwSyncStart(stc_adt_sw_sync_t* pstcAdtSwSyncStart);
//软件同步停止
en_result_t Adt_SwSyncStop(stc_adt_sw_sync_t* pstcAdtSwSyncStop);
//软件同步清零
en_result_t Adt_SwSyncClear(stc_adt_sw_sync_t* pstcAdtSwSyncClear);
//获取软件同步状态
en_result_t Adt_GetSwSyncState(stc_adt_sw_sync_t* pstcAdtSwSyncState);
//AOS触发配置
en_result_t Adt_AosTrigCfg(stc_adt_aos_trig_cfg_t* pstcAdtAosTrigCfg);
//中断触发配置
en_result_t Adt_IrqTrigCfg(M0P_ADTIM_TypeDef *ADTx,
stc_adt_irq_trig_cfg_t* pstcAdtIrqTrigCfg);
//端口触发配置
en_result_t Adt_PortTrigCfg(en_adt_trig_port_t enAdtTrigPort,
stc_adt_port_trig_cfg_t* pstcAdtPortTrigCfg);
//CHxX端口配置
en_result_t Adt_CHxXPortCfg(M0P_ADTIM_TypeDef *ADTx,
en_adt_CHxX_port_t enAdtCHxXPort,
stc_adt_CHxX_port_cfg_t* pstcAdtCHxXCfg);
//使能端口刹车
en_result_t Adt_EnableBrakePort(uint8_t port, stc_adt_break_port_cfg_t* pstcAdtBrkPtCfg);
//清除端口刹车
void Adt_ClearBrakePort(void);
//无效条件3配置(端口刹车)
en_result_t Adt_Disable3Cfg(stc_adt_disable_3_cfg_t* pstcAdtDisable3);
//软件刹车 Enable/Disable(仅适用于无效条件3使能的情况下)
en_result_t Adt_SwBrake(boolean_t bSwBrk);
//获取端口刹车标志
boolean_t Adt_GetPortBrakeFlag(void);
//清除端口刹车标志
void Adt_ClearPortBrakeFlag(void);
//无效条件1配置(同高同低刹车)
en_result_t Adt_Disable1Cfg(stc_adt_disable_1_cfg_t* pstcAdtDisable1);
//获取同高同低刹车标志
boolean_t Adt_GetSameBrakeFlag(void);
//清除同高同低刹车标志
void Adt_ClearSameBrakeFlag(void);
//PWM展频配置
en_result_t Adt_PwmDitherCfg(M0P_ADTIM_TypeDef *ADTx, stc_adt_pwm_dither_cfg_t* pstcAdtPwmDitherCfg);
//AdvTimer初始化
en_result_t Adt_Init(M0P_ADTIM_TypeDef *ADTx, stc_adt_basecnt_cfg_t* pstcAdtBaseCntCfg);
//AdvTimer去初始化
en_result_t Adt_DeInit(M0P_ADTIM_TypeDef *ADTx);
//AdvTimert启动
en_result_t Adt_StartCount(M0P_ADTIM_TypeDef *ADTx);
//AdvTimert停止
en_result_t Adt_StopCount(M0P_ADTIM_TypeDef *ADTx);
//设置计数值
en_result_t Adt_SetCount(M0P_ADTIM_TypeDef *ADTx, uint16_t u16Value);
//获取计数值
uint16_t Adt_GetCount(M0P_ADTIM_TypeDef *ADTx);
//清除计数值
en_result_t Adt_ClearCount(M0P_ADTIM_TypeDef *ADTx);
//获取有效周期计数值
uint8_t Adt_GetVperNum(M0P_ADTIM_TypeDef *ADTx);
//获取状态标志
boolean_t Adt_GetState(M0P_ADTIM_TypeDef *ADTx, en_adt_state_type_t enstate);
//配置计数周期
en_result_t Adt_SetPeriod(M0P_ADTIM_TypeDef *ADTx, uint16_t u16Period);
//配置计数周期缓冲
en_result_t Adt_SetPeriodBuf(M0P_ADTIM_TypeDef *ADTx, uint16_t u16PeriodBuf);
//清除计数周期缓冲
en_result_t Adt_ClearPeriodBuf(M0P_ADTIM_TypeDef *ADTx);
//配置有效计数周期
en_result_t Adt_SetValidPeriod(M0P_ADTIM_TypeDef *ADTx,
stc_adt_validper_cfg_t* pstcAdtValidPerCfg);
//配置比较输出计数基准值
en_result_t Adt_SetCompareValue(M0P_ADTIM_TypeDef *ADTx,
en_adt_compare_t enAdtCompare,
uint16_t u16Compare);
//配置通用比较值/捕获值的缓存传送
en_result_t Adt_EnableValueBuf(M0P_ADTIM_TypeDef *ADTx,
en_adt_CHxX_port_t enAdtCHxXPort,
boolean_t bCompareBufEn);
//清除比较输出计数值/捕获值缓存
en_result_t Adt_ClearValueBuf(M0P_ADTIM_TypeDef *ADTx,
en_adt_CHxX_port_t enAdtCHxXPort);
//获取捕获值
en_result_t Adt_GetCaptureValue(M0P_ADTIM_TypeDef *ADTx,
en_adt_CHxX_port_t enAdtCHxXPort,
uint16_t* pu16Capture);
//获取捕获缓存值
en_result_t Adt_GetCaptureBuf(M0P_ADTIM_TypeDef *ADTx,
en_adt_CHxX_port_t enAdtCHxXPort,
uint16_t* pu16CaptureBuf);
//设置死区时间上基准值
en_result_t Adt_SetDTUA(M0P_ADTIM_TypeDef *ADTx,
uint16_t u16Value);
//设置死区时间下基准值
en_result_t Adt_SetDTDA(M0P_ADTIM_TypeDef *ADTx,
uint16_t u16Value);
//配置死区时间功能
en_result_t Adt_CfgDT(M0P_ADTIM_TypeDef *ADTx,
boolean_t bDTEn,
boolean_t bEqual);
//配置中断
en_result_t Adt_CfgIrq(M0P_ADTIM_TypeDef *ADTx,
en_adt_irq_type_t enAdtIrq,
boolean_t bEn);
//获取中断标志
boolean_t Adt_GetIrqFlag(M0P_ADTIM_TypeDef *ADTx,
en_adt_irq_type_t enAdtIrq);
//清除中断标志
en_result_t Adt_ClearIrqFlag(M0P_ADTIM_TypeDef *ADTx,
en_adt_irq_type_t enAdtIrq);
//清除所有中断标志
en_result_t Adt_ClearAllIrqFlag(M0P_ADTIM_TypeDef *ADTx);
//Z相输入屏蔽设置
en_result_t Adt_CfgZMask(M0P_ADTIM_TypeDef *ADTx,
stc_adt_zmask_cfg_t* pstcAdtZMaskCfg);
//@} // ADT Group
#ifdef __cplusplus
}
#endif
#endif /* __ADT_H__ */
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+132
View File
@@ -0,0 +1,132 @@
/******************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file aes.h
**
** AES 数据结构及API声明.
**
** - 2016-05-04 LuX V1.0.
**
******************************************************************************/
#ifndef __AES_H__
#define __AES_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup AESGroup AES
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
*******************************************************************************
** \brief AES密钥长度类型定义
** \note
******************************************************************************/
typedef enum en_aes_key_type
{
AesKey128 = 0u, ///< 128 bits
AesKey192 = 1u, ///< 192 bits
AesKey256 = 2u, ///< 256 bits
}en_aes_key_type_t;
/**
*******************************************************************************
** \brief AES配置结构体
** \note
******************************************************************************/
typedef struct
{
uint32_t* pu32Cipher; ///< AES 密文指针
uint32_t* pu32Plaintext; ///< AES 明文指针
uint32_t* pu32Key; ///< AES 密钥指针
en_aes_key_type_t enKeyLen; ///< AES 密钥长度类型
}stc_aes_cfg_t;
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
//AES 加密
en_result_t AES_Encrypt(stc_aes_cfg_t* pstcAesCfg);
//AES 解密
en_result_t AES_Decrypt(stc_aes_cfg_t* pstcAesCfg);
//@} // AES Group
#ifdef __cplusplus
}
#endif
#endif /* __AES_H__ */
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+109
View File
@@ -0,0 +1,109 @@
/******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file bgr.h
**
** BGR 数据结构及API声明.
**
** - 2018-04-21 LuX V1.0.
**
******************************************************************************/
#ifndef __CRC_H__
#define __CRC_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup BGR
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///<内部温度传感器使能/关闭
void Bgr_TempSensorEnable(void);
void Bgr_TempSensorDisable(void);
///<BGR使能/关闭
void Bgr_BgrEnable(void);
void Bgr_BgrDisable(void);
//@} // BGR Group
#ifdef __cplusplus
}
#endif
#endif /* __BGR_H__ */
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+771
View File
@@ -0,0 +1,771 @@
/*******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file bt.h
**
** 基本定时器数据结构及API声明
** @link BT Group Some description @endlink
**
** History:
** - 2018-04-18 Husj First Version
**
*****************************************************************************/
#ifndef __BT_H__
#define __BT_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup BtGroup Base Timer (BT)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief 定时器选择数据类型重定义
*****************************************************************************/
typedef enum en_bt_unit
{
TIM0 = 0u, ///< Timer 0
TIM1 = 1u, ///< Timer 1
TIM2 = 2u, ///< Timer 2
}en_bt_unit_t;
/**
******************************************************************************
** \brief 工作模式选择数据类型重定义 (MODE)(模式0/1/23)
*****************************************************************************/
typedef enum en_bt_work_mode
{
BtWorkMode0 = 0u, ///< 定时器模式
BtWorkMode1 = 1u, ///< PWC模式
BtWorkMode2 = 2u, ///< 锯齿波模式
BtWorkMode3 = 3u, ///< 三角波模式
}en_bt_work_mode_t;
/**
******************************************************************************
** \brief 极性控制数据类型重定义 (GATE_P)(模式0)
*****************************************************************************/
typedef enum en_bt_m0_gatep
{
BtGatePositive = 0u, ///< 高电平有效
BtGateOpposite = 1u, ///< 低电平有效
}en_bt_m0_gatep_t;
/**
******************************************************************************
** \brief TIM 预除频选择 (PRS)(模式0/1/23)
*****************************************************************************/
typedef enum en_bt_cr_timclkdiv
{
BtPCLKDiv1 = 0u, ///< Div 1
BtPCLKDiv2 = 1u, ///< Div 2
BtPCLKDiv4 = 2u, ///< Div 4
BtPCLKDiv8 = 3u, ///< Div 8
BtPCLKDiv16 = 4u, ///< Div 16
BtPCLKDiv32 = 5u, ///< Div 32
BtPCLKDiv64 = 6u, ///< Div 64
BtPCLKDiv256 = 7u, ///< Div 256
}en_bt_cr_timclkdiv_t;
/**
******************************************************************************
** \brief 计数/定时器功能选择数据类型重定义 (CT)(模式0/1/23)
*****************************************************************************/
typedef enum en_bt_cr_ct
{
BtTimer = 0u, ///< 定时器功能,计数时钟为内部PCLK
BtCounter = 1u, ///< 计数器功能,计数时钟为外部ETR
}en_bt_cr_ct_t;
/**
******************************************************************************
** \brief 定时器工作模式数据类型重定义 (MD)(模式0)
*****************************************************************************/
typedef enum en_bt_m0cr_md
{
Bt32bitFreeMode = 0u, ///< 32位计数器/定时器
Bt16bitArrMode = 1u, ///< 自动重载16位计数器/定时器
}en_bt_m0cr_md_t;
/**
******************************************************************************
** \brief BT0/BT1/BT2中断类型数据类型重定义(模式0/1/23)
*****************************************************************************/
typedef enum en_bt_irq_type
{
BtUevIrq = 0u, ///< 溢出/事件更新中断
BtCA0Irq = 2u, ///< 捕获/比较中断A(仅模式1/23存在)
BtCB0Irq = 5u, ///< 捕获/比较中断B(仅模式23存在)
BtCA0E = 8u, ///< CH0A捕获数据丢失标志(仅模式23存在),不是中断
BtCB0E = 11u, ///< CH0B捕获数据丢失标志(仅模式23存在),不是中断
BtBkIrq = 14u, ///< 刹车中断(仅模式23存在)
BtTrigIrq = 15u, ///< 触发中断(仅模式23存在)
}en_bt_irq_type_t;
/**
******************************************************************************
** \brief 测量开始结束数据类型重定义 (Edg1stEdg2nd)(模式1)
*****************************************************************************/
typedef enum en_bt_m1cr_Edge
{
BtPwcRiseToRise = 0u, ///< 上升沿到上升沿(周期)
BtPwcFallToRise = 1u, ///< 下降沿到上升沿(低电平)
BtPwcRiseToFall = 2u, ///< 上升沿到下降沿(高电平)
BtPwcFallToFall = 3u, ///< 下降沿到下降沿(周期)
}en_bt_m1cr_Edge_t;
/**
******************************************************************************
** \brief PWC测量测试模式选择数据类型重定义 (Oneshot)(模式1)
*****************************************************************************/
typedef enum en_bt_m1cr_oneshot
{
BtPwcCycleDetect = 0u, ///< PWC循环测量
BtPwcOneShotDetect = 1u, ///< PWC单次测量
}en_bt_m1cr_oneshot_t;
/**
******************************************************************************
** \brief PWC IA0选择数据类型重定义 (IA0S)(模式1)
*****************************************************************************/
typedef enum en_bt_m1_mscr_ia0s
{
BtIA0Input = 0u, ///< IAO输入
BtXORInput = 1u, ///< IA0 ETR GATE XOR(TIM0/1/2)/IA0 IA1 IA2 XOR(TIM3)
}en_bt_m1_mscr_ia0s_t;
/**
******************************************************************************
** \brief PWC IB0选择数据类型重定义 (IA0S)(模式1)
*****************************************************************************/
typedef enum en_bt_m1_mscr_ib0s
{
BtIB0Input = 0u, ///< IBO输入
BtTsInput = 1u, ///< 内部触发TS选择信号
}en_bt_m1_mscr_ib0s_t;
/**
******************************************************************************
** \brief 输出极性、输入相位 数据类型重定义 (CCPA0/CCPB0/ETP/BKP)(模式1/23)
*****************************************************************************/
typedef enum en_bt_port_polarity
{
BtPortPositive = 0u, ///< 正常输入输出
BtPortOpposite = 1u, ///< 反向输入输出
}en_bt_port_polarity_t;
/**
******************************************************************************
** \brief 滤波选择数据类型重定义 (FLTET/FLTA0/FLAB0)(模式1/23)
*****************************************************************************/
typedef enum en_bt_flt
{
BtFltNone = 0u, ///< 无滤波
BtFltPCLKCnt3 = 4u, ///< PCLK 3个连续有效
BtFltPCLKDiv4Cnt3 = 5u, ///< PCLK/4 3个连续有效
BtFltPCLKDiv16Cnt3 = 6u, ///< PCLK/16 3个连续有效
BtFltPCLKDiv64Cnt3 = 7u, ///< PCLK/64 3个连续有效
}en_bt_flt_t;
/**
******************************************************************************
** \brief 通道比较控制 数据类型重定义 (OCMA/OCMB)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_fltr_ocm
{
BtForceLow = 0u, ///< 强制为0
BtForceHigh = 1u, ///< 强制为1
BtCMPForceLow = 2u, ///< 比较匹配时强制为0
BtCMPForceHigh = 3u, ///< 比较匹配时强制为1
BtCMPInverse = 4u, ///< 比较匹配时翻转电平
BtCMPOnePrdHigh = 5u, ///< 比较匹配时输出一个计数周期的高电平
BtPWMMode1 = 6u, ///< 通道控制为PWM mode 1
BtPWMMode2 = 7u, ///< 通道控制为PWM mode 2
}en_bt_m23_fltr_ocm_t;
/**
******************************************************************************
** \brief 主从模式TS数据类型重定义 (TS)(模式1/23)
*****************************************************************************/
typedef enum en_bt_mscr_ts
{
BtTs0ETR = 0u, ///< ETR外部输入滤波后的相位选择信号
BtTs1TIM0TRGO = 1u, ///< Timer0的TRGO输出信号
BtTs2TIM1TRGO = 2u, ///< Timer1的TRGO输出信号
BtTs3TIM2TRGO = 3u, ///< Timer2的TRGO输出信号
BtTs4TIM3TRGO = 4u, ///< Timer3的TRGO输出信号
//BtTs5IA0ED = 5u, ///< 无效
BtTs6IAFP = 6u, ///< CH0A 外部输输入滤波后的相位选择信号
BtTs7IBFP = 7u, ///< CH0B 外部输输入滤波后的相位选择信
}en_bt_mscr_ts_t;
/**
******************************************************************************
** \brief PWM输出模式选择数据类型重定义 (COMP)(模式23)
*****************************************************************************/
typedef enum en_bt_m23cr_comp
{
BtIndependentPWM = 0u, ///< 独立PWM输出
BtComplementaryPWM = 1u, ///< 互补PWM输出
}en_bt_m23cr_comp_t;
/**
******************************************************************************
** \brief 计数方向选择数据类型重定义 (DIR)(模式23)
*****************************************************************************/
typedef enum en_bt_m23cr_dir
{
BtCntUp = 0u, ///< 向上计数
BtCntDown = 1u, ///< 向下计数
}en_bt_m23cr_dir_t;
/**
******************************************************************************
** \brief 计数方向选择数据类型重定义 (PWM2S)(模式23)
*****************************************************************************/
typedef enum en_bt_m23cr_pwm2s
{
BtDoublePointCmp = 0u, ///< 双点比较使能,使用CCRA,CCRB比较控制OCREFA输出
BtSinglePointCmp = 1u, ///< 单点比较使能,使用CCRA比较控制OCREFA输出
}en_bt_m23cr_pwm2s_t;
/**
******************************************************************************
** \brief GATE在PWM互补模式下捕获或比较功能 选择数据类型重定义 (CSG)(模式23)
*****************************************************************************/
typedef enum en_bt_m23cr_csg
{
BtPWMCompGateCmpOut = 0u, ///< 在PWM互补模式下,Gate作为比较输出
BtPWMCompGateCapIn = 1u, ///< 在PWM互补模式下,Gate作为捕获输入
}en_bt_m23cr_csg_t;
/**
******************************************************************************
** \brief 比较捕获寄存器 数据类型重定义 (CCR0A,CCR0B)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_ccrx
{
BtCCR0A = 0u, ///< CCR0A比较捕获寄存器
BtCCR0B = 1u, ///< CCR0B比较捕获寄存器
}en_bt_m23_ccrx_t;
/**
******************************************************************************
** \brief OCREF清除源 选择数据类型重定义 (OCCS)(模式23)
*****************************************************************************/
typedef enum en_bt_m23ce_occs
{
BtOC_Ref_Clr = 0u, ///< 来自VC的OC_Ref_Clr
BtETRf = 1u, ///< 外部ETRf
}en_bt_m23ce_occs_t;
/**
******************************************************************************
** \brief 比较匹配中断模式 选择数据类型重定义 (CIS/CISB)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_cisa_cisb
{
BtCmpIntNone = 0u, ///< 无比较匹配中断
BtCmpIntRise = 1u, ///< 比较匹配上升沿中断
BtCmpIntFall = 2u, ///< 比较匹配下降沿中断
BtCmpIntRiseFall = 3u, ///< 比较匹配上升沿下降沿中断
}en_bt_m23_cisa_cisb_t;
/**
******************************************************************************
** \brief BT端口控制 - 刹车时CHx输出状态控制(BKSA/BKSB)(模式23)
**
** \note
******************************************************************************/
typedef enum en_bt_m23_crch0_bks
{
BtCHxBksHiZ = 0u, ///< 刹车使能时,CHx端口输出高阻态
BtCHxBksNorm = 1u, ///< 刹车使能时,CHx端口正常输出
BtCHxBksLow = 2u, ///< 刹车使能时,CHx端口输出低电平
BtCHxBksHigh = 3u, ///< 刹车使能时,CHx端口输出高电平
}en_bt_m23_crch0_bks_t;
/**
******************************************************************************
** \brief BT端口控制 - CHx上升沿下降沿捕获(CRx/CFx)(模式23)
**
** \note
******************************************************************************/
typedef enum en_bt_m23_crch0_cfx_crx
{
BtCHxCapNone = 0u, ///< CHx通道捕获禁止
BtCHxCapRise = 1u, ///< CHx通道上升沿捕获使能
BtCHxCapFall = 2u, ///< CHx通道下降沿捕获使能
BtCHxCapFallRise = 3u, ///< CHx通道上升沿下降沿捕获都使能
}en_bt_m23_crch0_cfx_crx_t;
/**
******************************************************************************
** \brief BT端口控制 - CHx比较捕获模式(CSA/CSB)(模式23)
**
** \note
******************************************************************************/
typedef enum en_bt_m23_crch0_csa_csb
{
BtCHxCmpMode = 0u, ///< CHx通道设置为比较模式
BtCHxCapMode = 1u, ///< CHx通道设置为捕获模式
}en_bt_m23_crch0_csa_csb_t;
/**
******************************************************************************
** \brief 比较模式下 DMA比较触发选择 数据类型重定义 (CCDS)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_mscr_ccds
{
BtCmpTrigDMA = 0u, ///< 比较匹配触发DMA
BtUEVTrigDMA = 1u, ///< 事件更新代替比较匹配触发DMA
}en_bt_m23_mscr_ccds_t;
/**
******************************************************************************
** \brief 主从模式选择 数据类型重定义 (MSM)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_mscr_msm
{
BtSlaveMode = 0u, ///< 从模式
BtMasterMode = 1u, ///< 主模式
}en_bt_m23_mscr_msm_t;
/**
******************************************************************************
** \brief 触发主模式输出源 数据类型重定义 (MMS)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_mscr_mms
{
BtMasterUG = 0u, ///< UG(软件更新)源
BtMasterCTEN = 1u, ///< CTEN源
BtMasterUEV = 2u, ///< UEV更新源
BtMasterCMPSO = 3u, ///< 比较匹配选择输出源
BtMasterOCA0Ref = 4u, ///< OCA0_Ref源
BtMasterOCB0Ref = 5u, ///< OCB0_Ref源
//BtMasterOCB0Ref = 6u,
//BtMasterOCB0Ref = 7u,
}en_bt_m23_mscr_mms_t;
/**
******************************************************************************
** \brief 触发从模式选择 数据类型重定义 (SMS)(模式23)
*****************************************************************************/
typedef enum en_bt_m23_mscr_sms
{
BtSlaveIClk = 0u, ///< 使用内部时钟
BtSlaveResetTIM = 1u, ///< 复位功能
BtSlaveTrigMode = 2u, ///< 触发模式
BtSlaveEClk = 3u, ///< 外部时钟模式
BtSlaveCodeCnt1 = 4u, ///< 正交编码计数模式1
BtSlaveCodeCnt2 = 5u, ///< 正交编码计数模式2
BtSlaveCodeCnt3 = 6u, ///< 正交编码计数模式3
BtSlaveGateCtrl = 7u, ///< 门控功能
}en_bt_m23_mscr_sms_t;
/**
******************************************************************************
** \brief 定时器运行控制数据类型重定义 (CTEN)
*****************************************************************************/
typedef enum en_bt_start
{
BtCTENDisable = 0u, ///< 停止
BtCTENEnable = 1u, ///< 运行
}en_bt_start_t;
/**
******************************************************************************
** \brief BaseTimer mode0 配置结构体定义(模式0)
*****************************************************************************/
typedef struct stc_bt_mode0_cfg
{
en_bt_work_mode_t enWorkMode; ///< 工作模式设置
en_bt_m0_gatep_t enGateP; ///< 门控极性控制
boolean_t bEnGate; ///< 门控使能
en_bt_cr_timclkdiv_t enPRS; ///< 预除频配置
boolean_t bEnTog; ///< 翻转输出使能
en_bt_cr_ct_t enCT; ///< 定时/计数功能选择
en_bt_m0cr_md_t enCntMode; ///< 计数模式配置
func_ptr_t pfnTim0Cb; ///< Timer0中断服务回调函数[void function(void)]
func_ptr_t pfnTim1Cb; ///< Timer1中断服务回调函数[void function(void)]
func_ptr_t pfnTim2Cb; ///< Timer2中断服务回调函数[void function(void)]
}stc_bt_mode0_cfg_t;
/**
******************************************************************************
** \brief BaseTimer mode1 配置结构体定义(模式1)
*****************************************************************************/
typedef struct stc_bt_mode1_cfg
{
en_bt_work_mode_t enWorkMode; ///< 工作模式设置
en_bt_cr_timclkdiv_t enPRS; ///< 预除频配置
en_bt_cr_ct_t enCT; ///< 定时/计数功能选择
en_bt_m1cr_oneshot_t enOneShot; ///< 单次测量/循环测量选择
func_ptr_t pfnTim0Cb; ///< Timer0中断服务回调函数[void function(void)]
func_ptr_t pfnTim1Cb; ///< Timer1中断服务回调函数[void function(void)]
func_ptr_t pfnTim2Cb; ///< Timer2中断服务回调函数[void function(void)]
}stc_bt_mode1_cfg_t;
/**
******************************************************************************
** \brief PWC输入配置结构体定义(模式1)
*****************************************************************************/
typedef struct stc_bt_pwc_input_cfg
{
en_bt_mscr_ts_t enTsSel; ///< 触发输入源选择
en_bt_m1_mscr_ia0s_t enIA0Sel; ///< CHA0输入选择
en_bt_m1_mscr_ib0s_t enIB0Sel; ///< CHB0输入选择
en_bt_port_polarity_t enETRPhase; ///< ETR相位选择
en_bt_flt_t enFltETR; ///< ETR滤波设置
en_bt_flt_t enFltIA0; ///< CHA0滤波设置
en_bt_flt_t enFltIB0; ///< CHB0滤波设置
}stc_bt_pwc_input_cfg_t;
/**
******************************************************************************
** \brief BaseTimer mode23 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_mode23_cfg
{
en_bt_work_mode_t enWorkMode; ///< 工作模式设置
en_bt_m23cr_dir_t enCntDir; ///< 计数方向
en_bt_cr_timclkdiv_t enPRS; ///< 时钟预除频配置
en_bt_cr_ct_t enCT; ///< 定时/计数功能选择
en_bt_m23cr_comp_t enPWMTypeSel; ///< PWM模式选择(独立/互补)
en_bt_m23cr_pwm2s_t enPWM2sSel; ///< OCREFA双点比较功能选择
boolean_t bOneShot; ///< 单次触发模式使能/禁止
boolean_t bURSSel; ///< 更新源选择
func_ptr_t pfnTim0Cb; ///< Timer0中断服务回调函数[void function(void)]
func_ptr_t pfnTim1Cb; ///< Timer1中断服务回调函数[void function(void)]
func_ptr_t pfnTim2Cb; ///< Timer2中断服务回调函数[void function(void)]
}stc_bt_mode23_cfg_t;
/**
******************************************************************************
** \brief GATE在PWM互补模式下捕获或比较功能 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_gate_cfg
{
en_bt_m23cr_csg_t enGateFuncSel; ///< Gate比较、捕获功能选择
boolean_t bGateRiseCap; ///< GATE作为捕获功能时,上沿捕获有效控制
boolean_t bGateFallCap; ///< GATE作为捕获功能时,下沿捕获有效控制
}stc_bt_m23_gate_cfg_t;
/**
******************************************************************************
** \brief CHA/CHB通道比较控制 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_compare_cfg
{
en_bt_m23_crch0_csa_csb_t enCh0ACmpCap; ///< CH0A比较/捕获功能选择
en_bt_m23_fltr_ocm_t enCH0ACmpCtrl; ///< CH0A通道比较控制
en_bt_port_polarity_t enCH0APolarity; ///< CH0A输出极性控制
boolean_t bCh0ACmpBufEn; ///< 比较A缓存功能 使能/禁止
en_bt_m23_cisa_cisb_t enCh0ACmpIntSel; ///< CHA比较匹配中断选择
en_bt_m23_crch0_csa_csb_t enCh0BCmpCap; ///< CH0B比较/捕获功能选择
en_bt_m23_fltr_ocm_t enCH0BCmpCtrl; ///< CH0B通道比较控制
en_bt_port_polarity_t enCH0BPolarity; ///< CH0B输出极性控制
boolean_t bCH0BCmpBufEn; ///< 比较B缓存功能 使能/禁止
en_bt_m23_cisa_cisb_t enCH0BCmpIntSel; ///< CHB0比较匹配中断选择
}stc_bt_m23_compare_cfg_t;
/**
******************************************************************************
** \brief CHA/CHB通道捕获控制 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_input_cfg
{
en_bt_m23_crch0_csa_csb_t enCh0ACmpCap; ///< CH0A比较/捕获功能选择
en_bt_m23_crch0_cfx_crx_t enCH0ACapSel; ///< CH0A捕获边沿选择
en_bt_flt_t enCH0AInFlt; ///< CH0A通道捕获滤波控制
en_bt_port_polarity_t enCH0APolarity; ///< CH0A输入相位
en_bt_m23_crch0_csa_csb_t enCh0BCmpCap; ///< CH0B比较/捕获功能选择
en_bt_m23_crch0_cfx_crx_t enCH0BCapSel; ///< HC0B捕获边沿选择
en_bt_flt_t enCH0BInFlt; ///< CH0B通道捕获滤波控制
en_bt_port_polarity_t enCH0BPolarity; ///< CH0B输入相位
}stc_bt_m23_input_cfg_t;
/**
******************************************************************************
** \brief ETR输入相位滤波配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_etr_input_cfg
{
en_bt_port_polarity_t enETRPolarity; ///< ETR输入极性设置
en_bt_flt_t enETRFlt; ///< ETR滤波设置
}stc_bt_m23_etr_input_cfg_t;
/**
******************************************************************************
** \brief 刹车BK输入相位滤波配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_bk_input_cfg
{
boolean_t bEnBrake; ///< 刹车使能
boolean_t bEnVCBrake; ///< 使能VC0刹车
boolean_t bEnSafetyBk; ///< 使能safety刹车
boolean_t bEnBKSync; ///< TIM0/TIM1/TIM2刹车同步使能
en_bt_m23_crch0_bks_t enBkCH0AStat; ///< 刹车时CHA端口状态设置
en_bt_m23_crch0_bks_t enBkCH0BStat; ///< 刹车时CHB端口状态设置
en_bt_port_polarity_t enBrakePolarity; ///< 刹车BK输入极性设置
en_bt_flt_t enBrakeFlt; ///< 刹车BK滤波设置
}stc_bt_m23_bk_input_cfg_t;
/**
******************************************************************************
** \brief 死区功能配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_dt_cfg
{
boolean_t bEnDeadTime; ///< 刹车时CHA端口状态设置
uint8_t u8DeadTimeValue; ///< 刹车时CHA端口状态设置
}stc_bt_m23_dt_cfg_t;
/**
******************************************************************************
** \brief 触发ADC配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_adc_trig_cfg
{
boolean_t bEnTrigADC; ///< 触发ADC全局控制
boolean_t bEnUevTrigADC; ///< 事件更新触发ADC
boolean_t bEnCH0ACmpTrigADC; ///< CH0A比较匹配触发ADC
boolean_t bEnCH0BCmpTrigADC; ///< CH0B比较匹配触发ADC
}stc_bt_m23_adc_trig_cfg_t;
/**
******************************************************************************
** \brief DMA触发 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_trig_dma_cfg
{
boolean_t bUevTrigDMA; ///< 更新 触发DMA使能
boolean_t bTITrigDMA; ///< Trig 触发DMA功能
boolean_t bCmpATrigDMA; ///< A捕获比较触发DMA使能
boolean_t bCmpBTrigDMA; ///< B捕获比较触发DMA使能
en_bt_m23_mscr_ccds_t enCmpUevTrigDMA; ///< 比较模式下DMA比较触发选择
}stc_bt_m23_trig_dma_cfg_t;
/**
******************************************************************************
** \brief 主从模式 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_master_slave_cfg
{
en_bt_m23_mscr_msm_t enMasterSlaveSel; ///< 主从模式选择
en_bt_m23_mscr_mms_t enMasterSrc; ///< 主模式触发源选择
en_bt_m23_mscr_sms_t enSlaveModeSel; ///< 从模式选择
en_bt_mscr_ts_t enTsSel; ///< 触发输入源选择
}stc_bt_m23_master_slave_cfg_t;
/**
******************************************************************************
** \brief OCREF清除功能 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_bt_m23_OCREF_Clr_cfg
{
en_bt_m23ce_occs_t enOCRefClrSrcSel; ///< OCREF清除源选择
boolean_t bVCClrEn; ///< 是否使能来自VC的OCREF_Clr
}stc_bt_m23_OCREF_Clr_cfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
//中断相关函数
//中断标志获取
boolean_t Bt_GetIntFlag(en_bt_unit_t enUnit, en_bt_irq_type_t enBtIrq);
//中断标志清除
en_result_t Bt_ClearIntFlag(en_bt_unit_t enUnit, en_bt_irq_type_t enBtIrq);
//所有中断标志清除
en_result_t Bt_ClearAllIntFlag(en_bt_unit_t enUnit);
//模式0中断使能
en_result_t Bt_Mode0_EnableIrq(en_bt_unit_t enUnit);
//模式1中断使能
en_result_t Bt_Mode1_EnableIrq (en_bt_unit_t enUnit, en_bt_irq_type_t enBtIrq);
//模式2中断使能
en_result_t Bt_Mode23_EnableIrq (en_bt_unit_t enUnit, en_bt_irq_type_t enBtIrq);
//模式0中断禁止
en_result_t Bt_Mode0_DisableIrq(en_bt_unit_t enUnit);
//模式1中断禁止
en_result_t Bt_Mode1_DisableIrq (en_bt_unit_t enUnit, en_bt_irq_type_t enBtIrq);
//模式2中断禁止
en_result_t Bt_Mode23_DisableIrq (en_bt_unit_t enUnit, en_bt_irq_type_t enBtIrq);
//模式0初始化及相关功能操作
//timer配置及初始化
en_result_t Bt_Mode0_Init(en_bt_unit_t enUnit, stc_bt_mode0_cfg_t* pstcCfg);
//timer 启动/停止
en_result_t Bt_M0_Run(en_bt_unit_t enUnit);
en_result_t Bt_M0_Stop(en_bt_unit_t enUnit);
//重载值设置
en_result_t Bt_M0_ARRSet(en_bt_unit_t enUnit, uint16_t u16Data);
//16位计数值设置/获取
en_result_t Bt_M0_Cnt16Set(en_bt_unit_t enUnit, uint16_t u16Data);
uint16_t Bt_M0_Cnt16Get(en_bt_unit_t enUnit);
//32位计数值设置/获取
en_result_t Bt_M0_Cnt32Set(en_bt_unit_t enUnit, uint32_t u32Data);
uint32_t Bt_M0_Cnt32Get(en_bt_unit_t enUnit);
//翻转输出使能/禁止(低电平)设定
en_result_t Bt_M0_EnTOG_Output(en_bt_unit_t enUnit, boolean_t bEnTOG);
//端口输出使能/禁止设定
en_result_t Bt_M0_Enable_Output(en_bt_unit_t enUnit, boolean_t bEnOutput);
//模式1初始化及相关功能操作
//timer配置及初始化
en_result_t Bt_Mode1_Init(en_bt_unit_t enUnit, stc_bt_mode1_cfg_t* pstcCfg);
//PWC 输入配置
en_result_t Bt_M1_Input_Cfg(en_bt_unit_t enUnit, stc_bt_pwc_input_cfg_t* pstcCfg);
//PWC测量边沿起始结束选择
en_result_t Bt_M1_PWC_Edge_Sel(en_bt_unit_t enUnit,en_bt_m1cr_Edge_t enEdgeSel);
//timer 启动/停止
en_result_t Bt_M1_Run(en_bt_unit_t enUnit);
en_result_t Bt_M1_Stop(en_bt_unit_t enUnit);
//16位计数值设置/获取
en_result_t Bt_M1_Cnt16Set(en_bt_unit_t enUnit, uint16_t u16Data);
uint16_t Bt_M1_Cnt16Get(en_bt_unit_t enUnit);
//脉冲宽度测量结果数值获取
uint16_t Bt_M1_PWC_CapValueGet(en_bt_unit_t enUnit);
//模式23初始化及相关功能操作
//timer配置及初始化
en_result_t Bt_Mode23_Init(en_bt_unit_t enUnit, stc_bt_mode23_cfg_t* pstcCfg);
//timer 启动/停止
en_result_t Bt_M23_Run(en_bt_unit_t enUnit);
en_result_t Bt_M23_Stop(en_bt_unit_t enUnit);
//PWM输出使能
en_result_t Bt_M23_EnPWM_Output(en_bt_unit_t enUnit, boolean_t bEnOutput, boolean_t bEnAutoOutput);
//重载值设置
en_result_t Bt_M23_ARRSet(en_bt_unit_t enUnit, uint16_t u16Data, boolean_t bArrBufEn);
//16位计数值设置/获取
en_result_t Bt_M23_Cnt16Set(en_bt_unit_t enUnit, uint16_t u16Data);
uint16_t Bt_M23_Cnt16Get(en_bt_unit_t enUnit);
//比较捕获寄存器CCR0A/CCR0B设置/读取
en_result_t Bt_M23_CCR_Set(en_bt_unit_t enUnit, en_bt_m23_ccrx_t enCCRSel, uint16_t u16Data);
uint16_t Bt_M23_CCR_Get(en_bt_unit_t enUnit, en_bt_m23_ccrx_t enCCRSel);
//PWM互补输出模式下,GATE功能选择
en_result_t Bt_M23_GateFuncSel(en_bt_unit_t enUnit,stc_bt_m23_gate_cfg_t* pstcCfg);
//主从模式配置
en_result_t Bt_M23_MasterSlave_Set(en_bt_unit_t enUnit, stc_bt_m23_master_slave_cfg_t* pstcCfg);
//CH0A/CH0B比较通道控制
en_result_t Bt_M23_PortOutput_Cfg(en_bt_unit_t enUnit, stc_bt_m23_compare_cfg_t* pstcCfg);
//CH0A/CH0B输入控制
en_result_t Bt_M23_PortInput_Cfg(en_bt_unit_t enUnit, stc_bt_m23_input_cfg_t* pstcCfg);
//ERT输入控制
en_result_t Bt_M23_ETRInput_Cfg(en_bt_unit_t enUnit, stc_bt_m23_etr_input_cfg_t* pstcCfg);
//刹车BK输入控制
en_result_t Bt_M23_BrakeInput_Cfg(en_bt_unit_t enUnit, stc_bt_m23_bk_input_cfg_t* pstcCfg);
//触发ADC控制
en_result_t Bt_M23_TrigADC_Cfg(en_bt_unit_t enUnit, stc_bt_m23_adc_trig_cfg_t* pstcCfg);
//死区功能
en_result_t Bt_M23_DT_Cfg(en_bt_unit_t enUnit, stc_bt_m23_dt_cfg_t* pstcCfg);
//重复周期设置
en_result_t Bt_M23_SetValidPeriod(en_bt_unit_t enUnit, uint8_t u8ValidPeriod);
//OCREF清除功能
en_result_t Bt_M23_OCRefClr(en_bt_unit_t enUnit, stc_bt_m23_OCREF_Clr_cfg_t* pstcCfg);
//使能DMA传输
en_result_t Bt_M23_EnDMA(en_bt_unit_t enUnit, stc_bt_m23_trig_dma_cfg_t* pstcCfg);
//捕获比较A软件触发
en_result_t Bt_M23_EnSwTrigCapCmpA(en_bt_unit_t enUnit);
//捕获比较B软件触发
en_result_t Bt_M23_EnSwTrigCapCmpB(en_bt_unit_t enUnit);
//软件更新使能
en_result_t Bt_M23_EnSwUev(en_bt_unit_t enUnit);
//软件触发使能
en_result_t Bt_M23_EnSwTrig(en_bt_unit_t enUnit);
//软件刹车使能
en_result_t Bt_M23_EnSwBk(en_bt_unit_t enUnit);
//@} // BtGroup
#ifdef __cplusplus
#endif
#endif /* __BT_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+120
View File
@@ -0,0 +1,120 @@
/******************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file crc.h
**
** CRC 数据结构及API声明.
**
** - 2016-05-04 LuX V1.0.
**
******************************************************************************/
#ifndef __CRC_H__
#define __CRC_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "sysctrl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup CrcGroup Cyclic Redundancy Check (CRC)
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
//CRC16 编码值获取
uint16_t CRC16_Get8(uint8_t* pu8Data, uint32_t u32Len);
uint16_t CRC16_Get16(uint16_t* pu16Data, uint32_t u32Len);
uint16_t CRC16_Get32(uint32_t* pu32Data, uint32_t u32Len);
//CRC16 校验
en_result_t CRC16_Check8(uint8_t* pu8Data, uint32_t u32Len, uint16_t u16CRC);
en_result_t CRC16_Check16(uint16_t* pu16Data, uint32_t u32Len, uint16_t u16CRC);
en_result_t CRC16_Check32(uint32_t* pu32Data, uint32_t u32Len, uint16_t u16CRC);
//CRC32 编码值获取
uint32_t CRC32_Get8(uint8_t* pu8Data, uint32_t u32Len);
uint32_t CRC32_Get16(uint16_t* pu16Data, uint32_t u32Len);
uint32_t CRC32_Get32(uint32_t* pu32Data, uint32_t u32Len);
//CRC32 校验
en_result_t CRC32_Check8(uint8_t* pu8Data, uint32_t u32Len, uint32_t u32CRC);
en_result_t CRC32_Check16(uint16_t* pu16Data, uint32_t u32Len, uint32_t u32CRC);
en_result_t CRC32_Check32(uint32_t* pu32Data, uint32_t u32Len, uint32_t u32CRC);
//@} // CRC Group
#ifdef __cplusplus
}
#endif
#endif /* __CRC_H__ */
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+234
View File
@@ -0,0 +1,234 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file dac.h
**
** Header file for dac Converter functions
** @link DAC Group Some description @endlink
**
** - 2019-04-10 First Version
**
******************************************************************************/
#ifndef __DAC_H__
#define __DAC_H__
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \brief 使能或者禁止指令
******************************************************************************/
typedef enum
{
DacDisable = 0u, //禁止
DacEnable = 1u //使能
}en_en_state_t;
/**
******************************************************************************
** \brief 使能或者禁止DAC0通道输出缓冲器 DAC_CR0BOFF0
******************************************************************************/
typedef enum
{
DacBoffDisable = 1u,
DacBoffEnable = 0u
}en_dac_boff_t;
/**
******************************************************************************
** \brief 使能或者禁止DAC0通道触发使能 DAC_CR0: TEN0
******************************************************************************/
typedef enum
{
DacTenDisable = 0u,
DacTenEnable = 1u
}en_dac_ten_t;
/**
******************************************************************************
** \brief DAC0通道触发选择 DAC_CR0: TSEL0
******************************************************************************/
typedef enum
{
DacTim0Tradc = 0u, //TIM0_TRADC触发
DacTim1Tradc = 1u, //TIM1_TRADC触发
DacTim2Tradc = 2u, //TIM2_TRADC触发
DacTim3Tradc = 3u, //TIM3_TRADC触发
DacTim4Tradc = 4u, //TIM4_TRADC触发
DacTim5Tradc = 5u, //TIM5_TRADC触发
DacSwTriger = 6u, //软件触发
DacExPortTriger = 7u //外部端口触发
}en_dac_tsel_t;
/**
******************************************************************************
** \brief DAC0通道噪声/三角波生产使能或禁止 DAC_CR0: WAVE0
******************************************************************************/
typedef enum
{
DacWaveDisable = 0u, //禁止生产波
DacNoiseEnable = 1u, //使能生成噪声波
DacTrWaveEnable = 2u //使能生产三角波
}en_dac_wave_t;
/**
******************************************************************************
** \brief DACx通道掩码/振幅选择器 DAC_CR0: MAMP0 & MAMP1
******************************************************************************/
typedef enum
{
DacMemp01 = 0u,
DacMenp03 = 1u,
DacMenp07 = 2u,
DacMenp15 = 3u,
DacMenp31 = 4u,
DacMenp63 = 5u,
DacMenp127 = 6u,
DacMenp255 = 7u,
DacMenp511 = 8u,
DacMenp1023 = 9u,
DacMenp2047 = 10u,
DacMenp4095 = 11u
}en_dac_mamp_t;
/**
******************************************************************************
** \brief DACx通道DMA使能或禁止 DAC_CR0: DMAEN0 & DMAEN1
******************************************************************************/
/**
******************************************************************************
** \brief DACx通道DMA下溢中断使能或禁止 DAC_CR0: DMAUDRIE0 & DMAUDRIE1
******************************************************************************/
/**
******************************************************************************
** \brief DACx参考电压选择 DAC_CR0: SREF0 & SREF1
******************************************************************************/
typedef enum
{
DacVoltage1V5 = 0u, //内部1.5V
DacVoltage2V5 = 1u, //内部2.5V
DacVoltageExRef = 2u, //外部参考电压ExRef(PB01)
DacVoltageAvcc = 3u //AVCC电压
}en_dac_sref_t;
/**
******************************************************************************
** \brief DACx触发选择寄存器DAC_ETRS DAC_ETRS
******************************************************************************/
typedef enum
{
DacPortTrigPA9 = 0u, //触发端口为PA9
DacPortTrigPB9 = 1u, //触发端口为PB9
DacPortTrigPC9 = 2u, //触发端口为PC9
DacPortTrigPD9 = 3u, //触发端口为PD9
DacPortTrigPE9 = 4u, //触发端口为PE9
DacPortTrigPF9 = 5u //触发端口为PF9
}en_port_trig_t;
/**
******************************************************************************
** \brief 对齐方式
******************************************************************************/
typedef enum
{
DacRightAlign = 0u, //右对齐
DacLeftAlign = 1u //左对齐
}en_align_t;
/**
******************************************************************************
** \brief 数据位数
******************************************************************************/
typedef enum
{
DacBit8 = 0u, //8位
DacBit12 = 1u //12位
}en_bitno_t;
/**
******************************************************************************
** \brief 初始化配置结构体
******************************************************************************/
typedef struct
{
en_dac_boff_t boff_t;
en_dac_ten_t ten_t;
en_dac_tsel_t tsel_t;
en_dac_wave_t wave_t;
en_dac_mamp_t mamp_t;
en_dac_sref_t sref_t;
en_port_trig_t port_trig_t;
en_align_t align;
uint16_t dhr12;
uint8_t dhr8;
}stc_dac_cfg_t;
extern void Dac_DmaCmd(boolean_t NewState);
extern void Dac_DmaITCfg(boolean_t NewState);
extern boolean_t Dac_GetITStatus(void);
extern void Dac_Cmd(boolean_t NewState);
extern void Dac_SoftwareTriggerCmd(void);
extern void Dac_Init(stc_dac_cfg_t* DAC_InitStruct);
extern void Dac_SetChannelData(en_align_t DAC_Align, en_bitno_t DAC_Bit, uint16_t Data);
extern uint16_t Dac_GetDataOutputValue(void);
#ifdef __cplusplus
}
#endif
#endif //__DAC_H__
/******************************************************************************/
/* EOF (not truncated) */
/******************************************************************************/
+174
View File
@@ -0,0 +1,174 @@
/*******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file ddl.h
**
** DDL common define.
** @link SampleGroup Some description @endlink
**
** - 2019-10-17 1.1 Lux
**
******************************************************************************/
#ifndef __DDL_H__
#define __DDL_H__
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "base_types.h"
#include "board_stkhc32l17x.h"
#include "hc32l17x.h"
#include "system_hc32l17x.h"
#include "sysctrl.h"
#include "interrupts_hc32l17x.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/* Macro for initializing local structures to zero */
/******************************************************************************/
#define DDL_ZERO_STRUCT(x) ddl_memclr((uint8_t*)&(x), (uint32_t)(sizeof(x)))
#define DEC2BCD(x) ((((x)/10)<<4) + ((x)%10))
#define BCD2DEC(x) ((((x)>>4)*10) + ((x)&0x0F))
#define SET_BIT(REG, BIT) ((REG) |= (BIT))
#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT))
#define READ_BIT(REG, BIT) ((REG) & (BIT))
#define CLEAR_REG(REG) ((REG) = (0x0))
#define WRITE_REG(REG, VAL) ((REG) = (VAL))
#define READ_REG(REG) ((REG))
#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SETMASK)))
/**
******************************************************************************
** Global Device Series List
******************************************************************************/
#define DDL_DEVICE_SERIES_HC32L17X (0u)
/**
******************************************************************************
** Global Device Package List
******************************************************************************/
// package definitions of HC device.
#define DDL_DEVICE_PACKAGE_HC_C (0x00u)
#define DDL_DEVICE_PACKAGE_HC_F (0x10u)
#define DDL_DEVICE_PACKAGE_HC_J (0x20u)
#define DDL_DEVICE_PACKAGE_HC_K (0x30u)
/******************************************************************************/
/* User Device Setting Include file */
/******************************************************************************/
#include "ddl_device.h" // MUST be included here!
/******************************************************************************/
/* Global type definitions ('typedef') */
/******************************************************************************/
/**
******************************************************************************
** \brief Level
**
** Specifies levels.
**
******************************************************************************/
typedef enum en_level
{
DdlLow = 0u, ///< Low level '0'
DdlHigh = 1u ///< High level '1'
} en_level_t;
/**
******************************************************************************
** \brief Generic Flag Code
**
** Specifies flags.
**
******************************************************************************/
typedef enum en_flag
{
DdlClr = 0u, ///< Flag clr '0'
DdlSet = 1u ///< Flag set '1'
} en_stat_flag_t, en_irq_flag_t;
/******************************************************************************/
/* Global variable declarations ('extern', definition in C source) */
/******************************************************************************/
/******************************************************************************/
/* Global function prototypes ('extern', definition in C source) */
/******************************************************************************/
/*******************************************************************************
* Global function prototypes
******************************************************************************/
extern void ddl_memclr(void* pu8Address, uint32_t u32Count);
uint32_t Log2(uint32_t u32Val);
/**
*******************************************************************************
** This hook is part of wait loops.
******************************************************************************/
void delay1ms(uint32_t u32Cnt);
void delay100us(uint32_t u32Cnt);
void delay10us(uint32_t u32Cnt);
void SetBit(uint32_t addr, uint32_t offset, boolean_t bFlag);
void ClrBit(uint32_t addr, uint32_t offset);
boolean_t GetBit(uint32_t addr, uint32_t offset);
#ifdef __cplusplus
}
#endif
#endif /* __DDL_H__ */
/******************************************************************************/
/* EOF (not truncated) */
/******************************************************************************/
+129
View File
@@ -0,0 +1,129 @@
/*******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file debug.h
**
** Headerfile for DEBUG functions
** @link Debug Group Some description @endlink
**
** History:
** - 2018-04-15 Lux First Version
**
******************************************************************************/
#ifndef __DEBUG_H__
#define __DEBUG_H__
/*******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup DebugGroup (DEBUG)
**
******************************************************************************/
//@{
/**
*******************************************************************************
** function prototypes.
******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
*******************************************************************************
** \brief 调试模式下各模块工作状态类型定义
** \note
******************************************************************************/
typedef enum en_debug_module_active
{
DebugMskTim0 = 0x0001u, ///< TIM0
DebugMskTim1 = 0x0002u, ///< TIM1
DebugMskTim2 = 0x0004u, ///< TIM2
DebugMskLpTim0 = 0x0008u, ///< LPTIM0
DebugMskTim4 = 0x0010u, ///< TIM4
DebugMskTim5 = 0x0020u, ///< TIM5
DebugMskTim6 = 0x0040u, ///< TIM6
DebugMskPca = 0x0080u, ///< PCA
DebugMskWdt = 0x0100u, ///< WDT
DebugMskRtc = 0x0200u, ///< RTC
DebugMskTim3 = 0x0800u, ///< TIM3
DebugMskLpTim1 = 0x1000u, ///< LPTIM1
}en_debug_module_active_t;
/*******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///< 在SWD调试模式下,使能模块计数功能
en_result_t Debug_ActiveEnable(en_debug_module_active_t enModule);
///< 在SWD调试模式下,暂停模块计数功能
en_result_t Debug_ActiveDisable(en_debug_module_active_t enModule);
//@} // Debug Group
#ifdef __cplusplus
#endif
#endif /* __DEBUG_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+356
View File
@@ -0,0 +1,356 @@
/*****************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file dma.h
**
** A detailed description is available at
** @link DmacGroup Dmac description @endlink
**
** - 2018-03-09 1.0 Hongjh First version for Device Driver Library of Dmac.
**
******************************************************************************/
#ifndef __DMAC_H__
#define __DMAC_H__
/*******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
*******************************************************************************
** \defgroup DmacGroup Direct Memory Access Control(DMAC)
**
******************************************************************************/
//@{
/*******************************************************************************
* Global type definitions ('typedef')
******************************************************************************/
/**
*******************************************************************************
** \brief DMA 通道
**
******************************************************************************/
typedef enum en_dma_channel
{
DmaCh0 = 0x00, ///< DMA 通道0
DmaCh1 = 0x04, ///< DMA 通道1
} en_dma_channel_t;
/**
*******************************************************************************
** \brief DMA 优先级
**
******************************************************************************/
typedef enum en_dma_priority
{
DmaMskPriorityFix = 0x00000000, ///< DMA 各通道优先级固定 (CH0>CH1)
DmaMskPriorityLoop = 0x10000000, ///< DMA 各通道优先级采用轮询方式
} en_dma_priority_t;
/**
*******************************************************************************
** \brief DMA 传输数据宽度
**
******************************************************************************/
typedef enum en_dma_transfer_width
{
DmaMsk8Bit = 0x00000000, ///< 8 bit 字节传输
DmaMsk16Bit = 0x04000000, ///< 16 bit 半字传输
DmaMsk32Bit = 0x08000000 ///< 32 bit 字传输
} en_dma_transfer_width_t;
/**
*******************************************************************************
** \brief DMA 传输模式:块(Block)传输或者突发(Burst)传输
**
******************************************************************************/
typedef enum en_dma_transfer_mode
{
DmaMskBlock = 0x00000000, ///< 块(Block)传输
DmaMskBurst = 0x10000000, ///< 突发(Burst)传输
} en_dma_transfer_mode_t;
/**
*******************************************************************************
** \brief DMA传输当前状态
**
******************************************************************************/
typedef enum en_dma_stat
{
DmaDefault = 0U, ///< 初始值
DmaAddOverflow = 1U, ///< 传输错误引起中止(地址溢出)
DmaHALT = 2U, ///< 传输停止请求引起中止(外设停止请求引起的停止或者EB/DE位引起的禁止传输)
DmaAccSCRErr = 3U, ///< 传输错误引起中止(传输源地址访问错误)
DmaAccDestErr = 4U, ///< 传输错误引起中止(传输目的地址访问错误)
DmaTransferComplete = 5U, ///< 成功传输完成
DmaTransferPause = 7U, ///< 传输暂停
} en_dma_stat_t;
/**
*******************************************************************************
** \brief DMA源地址控制模式:自增或固定
**
******************************************************************************/
typedef enum en_src_address_mode
{
DmaMskSrcAddrInc = 0x00000000, ///< 地址自增
DmaMskSrcAddrFix = 0x02000000, ///< 地址固定
} en_src_address_mode_t;
/**
*******************************************************************************
** \brief DMA目的地址控制模式:自增或固定
**
******************************************************************************/
typedef enum en_dst_address_mode
{
DmaMskDstAddrInc = 0x00000000, ///< 地址自增
DmaMskDstAddrFix = 0x01000000, ///< 地址固定
} en_dst_address_mode_t;
/**
*******************************************************************************
** \brief DMA CONFA:BC[3:0]和CONFA:TC[15:0]的重载功能
**
******************************************************************************/
typedef enum en_bc_tc_reload_mode
{
DmaMskBcTcReloadDisable = 0x00000000, ///< 禁止重载
DmaMskBcTcReloadEnable = 0x00800000, ///< 使能重载
} en_bc_tc_reload_mode_t;
/**
*******************************************************************************
** \brief DMA源地址重载功能:使能或禁止
**
******************************************************************************/
typedef enum en_src_address_reload_mode
{
DmaMskSrcAddrReloadDisable = 0x00000000, ///< 禁止DMA源地址重载
DmaMskSrcAddrReloadEnable = 0x00400000, ///< 使能DMA源地址重载
} en_src_address_reload_mode_t;
/**
*******************************************************************************
** \brief DMA目的地址重载功能:使能或禁止
**
******************************************************************************/
typedef enum en_dst_address_reload_mode
{
DmaMskDstAddrReloadDisable = 0x00000000, ///< 禁止DMA目的地址重载
DmaMskDstAddrReloadEnable = 0x00200000, ///< 使能DMA目的地址重载
} en_dst_address_reload_mode_t;
/**
*******************************************************************************
** \brief DMA 连续传输设置
**
******************************************************************************/
typedef enum en_dma_msk
{
DmaMskOneTransfer = 0x00000000, ///< 传输一次,DMAC传输完成时清除CONFA:ENS位
DmaMskContinuousTransfer = 0x00000001, ///< 连续传输,DMAC传输完成时不清除CONFA:ENS位
} en_dma_msk_t;
/**
*******************************************************************************
** \brief DMA 触发源选择
**
******************************************************************************/
typedef enum stc_dma_trig_sel
{
DmaSWTrig = 0U, ///< Select DMA software trig
DmaSPI0RXTrig = 64U, ///< Select DMA hardware trig 0
DmaSPI0TXTrig = 65U, ///< Select DMA hardware trig 1
DmaSPI1RXTrig = 66U, ///< Select DMA hardware trig 2
DmaSPI1TXTrig = 67U, ///< Select DMA hardware trig 3
DmaADCJQRTrig = 68U, ///< Select DMA hardware trig 4
DmaADCSQRTrig = 69U, ///< Select DMA hardware trig 5
DmaLCDTxTrig = 70U, ///< Select DMA hardware trig 6
DmaUart0RxTrig = 72U, ///< Select DMA hardware trig 8
DmaUart0TxTrig = 73U, ///< Select DMA hardware trig 9
DmaUart1RxTrig = 74U, ///< Select DMA hardware trig 10
DmaUart1TxTrig = 75U, ///< Select DMA hardware trig 11
DmaLpUart0RxTrig = 76U, ///< Select DMA hardware trig 12
DmaLpUart0TxTrig = 77U, ///< Select DMA hardware trig 13
DmaLpUart1RxTrig = 78U, ///< Select DMA hardware trig 14
DmaLpUart1TxTrig = 79U, ///< Select DMA hardware trig 15
DmaDAC0Trig = 80U, ///< Select DMA hardware trig 16
DmaDAC1Trig = 81U, ///< Select DMA hardware trig 17
DmaTIM0ATrig = 82U, ///< Select DMA hardware trig 18
DmaTIM0BTrig = 83U, ///< Select DMA hardware trig 19
DmaTIM1ATrig = 84U, ///< Select DMA hardware trig 20
DmaTIM1BTrig = 85U, ///< Select DMA hardware trig 21
DmaTIM2ATrig = 86U, ///< Select DMA hardware trig 22
DmaTIM2BTrig = 87U, ///< Select DMA hardware trig 23
DmaTIM3ATrig = 88U, ///< Select DMA hardware trig 24
DmaTIM3BTrig = 89U, ///< Select DMA hardware trig 25
DmaTIM4ATrig = 90U, ///< Select DMA hardware trig 26
DmaTIM4BTrig = 91U, ///< Select DMA hardware trig 27
DmaTIM5ATrig = 92U, ///< Select DMA hardware trig 28
DmaTIM5BTrig = 93U, ///< Select DMA hardware trig 29
DmaTIM6ATrig = 94U, ///< Select DMA hardware trig 30
DmaTIM6BTrig = 95U, ///< Select DMA hardware trig 31
DmaUart2RxTrig = 96U, ///< Select DMA hardware trig 32
DmaUart2TxTrig = 97U, ///< Select DMA hardware trig 33
DmaUart3RxTrig = 98U, ///< Select DMA hardware trig 34
DmaUart3TxTrig = 99U, ///< Select DMA hardware trig 35
}en_dma_trig_sel_t;
/**
*******************************************************************************
** \brief DMA通道初始化配置结构体
**
******************************************************************************/
typedef struct stc_dma_cfg
{
en_dma_transfer_mode_t enMode;
uint16_t u16BlockSize; ///< 块传输个数
uint16_t u16TransferCnt; ///< 传输块次数
en_dma_transfer_width_t enTransferWidth; ///< 传输数据字节宽度 具体参考枚举定义:en_dma_transfer_width_t
en_src_address_mode_t enSrcAddrMode; ///< DMA源地址控制模式:自增或固定
en_dst_address_mode_t enDstAddrMode; ///< DMA目的地址控制模式:自增或固定
en_src_address_reload_mode_t enSrcAddrReloadCtl; ///< 源地址重载 具体参考枚举定义:en_src_address_reload_mode_t
en_dst_address_reload_mode_t enDestAddrReloadCtl;///< 目的地址重载 具体参考枚举定义:en_dst_address_reload_mode_t
en_bc_tc_reload_mode_t enSrcBcTcReloadCtl; ///< Bc/Tc值重载功能 具体参考枚举定义:en_bc_tc_reload_mode_t
uint32_t u32SrcAddress; ///< 源地址>
uint32_t u32DstAddress; ///< 目的地址>
en_dma_msk_t enTransferMode; ///DMA 连续传输设置 具体参考枚举定义:en_dma_msk_t
en_dma_priority_t enPriority; ///DMA 优先级设定 具体参考枚举定义:en_dma_priority_t
en_dma_trig_sel_t enRequestNum; ///<DMA 触发源选择 具体参考枚举定义:en_dma_trig_sel_t
} stc_dma_cfg_t;
/*******************************************************************************
* Global pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/*******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///< 初始化DMAC通道
en_result_t Dma_InitChannel(en_dma_channel_t enCh, stc_dma_cfg_t* pstcCfg);
///< DMA模块使能函数,使能所有通道的操作,每个通道按照各自设置工作
void Dma_Enable(void);
///< DMA模块功能禁止函数,所有通道禁止工作.
void Dma_Disable(void);
///< 触发指定DMA通道软件传输功能.
void Dma_SwStart(en_dma_channel_t enCh);
///< 停止指定DMA通道软件传输功能.
void Dma_SwStop(en_dma_channel_t enCh);
///< 使能指定dma通道的(传输完成)中断.
void Dma_EnableChannelIrq(en_dma_channel_t enCh);
///< 禁用指定dma通道的(传输完成)中断.
void Dma_DisableChannelIrq(en_dma_channel_t enCh);
///< 使能指定dma通道的(传输错误)中断..
void Dma_EnableChannelErrIrq(en_dma_channel_t enCh);
///< 禁用指定dma通道的(传输错误)中断..
void Dma_DisableChannelErrIrq(en_dma_channel_t enCh);
///< 使能指定dma通道
void Dma_EnableChannel(en_dma_channel_t enCh);
///< 禁用指定dma通道
void Dma_DisableChannel(en_dma_channel_t enCh);
///< 设定指定通道的块(Block)尺寸
void Dma_SetBlockSize(en_dma_channel_t enCh, uint16_t u16BlkSize);
///< 设定指定通道块(Block)传输次数
void Dma_SetTransferCnt(en_dma_channel_t enCh, uint16_t u16TrnCnt);
///< 允许指定通道可连续传输,即DMAC在传输完成时不清除CONFA:ENS位.
void Dma_EnableContinusTranfer(en_dma_channel_t enCh);
///< 禁止指定通道连续传输,即DMAC在传输完成时清除.
void Dma_DisableContinusTranfer(en_dma_channel_t enCh);
///< 暂停所有dma通道.
void Dma_HaltTranfer(void);
///< 恢复(之前暂停的)所有dma通道.
void Dma_RecoverTranfer(void);
///< 暂停指定dma通道.
void Dma_PauseChannelTranfer(en_dma_channel_t enCh);
///< 恢复(之前暂定的)指定dma通道.
void Dma_RecoverChannelTranfer(en_dma_channel_t enCh);
///< 设定指定通道传输数据宽度.
void Dma_SetTransferWidth(en_dma_channel_t enCh, en_dma_transfer_width_t enWidth);
///< 设定dma通道优先级.
void Dma_SetChPriority(en_dma_priority_t enPrio);
///< 获取指定DMA通道的状态.
en_dma_stat_t Dma_GetStat(en_dma_channel_t enCh);
///< 清除指定DMA通道的状态值.
void Dma_ClrStat(en_dma_channel_t enCh);
///<设定指定通道源地址
void Dma_SetSourceAddress(en_dma_channel_t enCh, uint32_t u32Address);
///<设定指定通道目标地址.
void Dma_SetDestinationAddress(en_dma_channel_t enCh, uint32_t u32Address);
//@} // DmacGroup
#ifdef __cplusplus
}
#endif
#endif /* __DMAC_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+167
View File
@@ -0,0 +1,167 @@
/*************************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file flash.h
**
** FLASH 数据结构及API声明.
**
** - 2017-05-02 LuX V1.0
**
******************************************************************************/
#ifndef __FLASH_H__
#define __FLASH_H__
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup FlashGroup Flash Controller (Flash)
**
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief Flash中断类型重定义
*****************************************************************************/
typedef enum en_flash_int_type
{
FlashPCInt = 0x01u, ///<擦写PC地址报警中断
FlashSlockInt = 0x02u, ///<擦写保护报警中断
} en_flash_int_type_t;
/**
******************************************************************************
** \brief Flash读等待周期类型重定义
*****************************************************************************/
typedef enum en_flash_waitcycle
{
FlashWaitCycle0 = 0u, ///< 读等待周期设置为0-即读周期为1(当HCLK小于等于24MHz时)
FlashWaitCycle1 = 1u, ///< 读等待周期设置为1-即读周期为2(当HCLK大于24MHz时必须至少为1)
FlashWaitCycle2 = 2u, ///< 读等待周期设置为2-即读周期为3(当HCK大于48MHz时必须至少为2)
} en_flash_waitcycle_t;
/**
******************************************************************************
** \brief Flash擦写保护范围重定义
*****************************************************************************/
typedef enum en_flash_lock
{
FlashLock0 = 0u, ///<LOCK0
FlashLock1 = 1u, ///<LOCK1
} en_flash_lock_t;
/**
******************************************************************************
** \brief Redefinition of FLASH register structure
******************************************************************************/
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///<Flash 初始化配置(中断函数、编程时间参数及休眠模式配置)
en_result_t Flash_Init(uint8_t u8FreqCfg, boolean_t bDpstbEn);
///<Flash 页/全片擦除
en_result_t Flash_SectorErase(uint32_t u32SectorAddr);
en_result_t Flash_ChipErase(void);
///<Flash 字节/半字/字写
en_result_t Flash_WriteByte(uint32_t u32Addr, uint8_t u8Data);
en_result_t Flash_WriteHalfWord(uint32_t u32Addr, uint16_t u16Data);
en_result_t Flash_WriteWord(uint32_t u32Addr, uint32_t u32Data);
///<Flash 编程保护加锁/解锁
void Flash_LockAll(void);
void Flash_UnlockAll(void);
en_result_t Flash_LockSet(en_flash_lock_t enLock, uint32_t u32LockValue);
///<Flash 读等待周期设定
en_result_t Flash_WaitCycle(en_flash_waitcycle_t enWaitCycle);
///<中断相关函数
///<中断使能/禁止
en_result_t Flash_EnableIrq(en_flash_int_type_t enFlashIntType);
en_result_t Flash_DisableIrq(en_flash_int_type_t enFlashIntType);
///<中断标志获取
boolean_t Flash_GetIntFlag(en_flash_int_type_t enFlashIntType);
///<中断标志清除
en_result_t Flash_ClearIntFlag(en_flash_int_type_t enFlashIntType);
//@} // FlashGroup
#ifdef __cplusplus
}
#endif
#endif /* __FLASH_H__ */
/******************************************************************************/
/* EOF (not truncated) */
/******************************************************************************/
+1227
View File
File diff suppressed because it is too large Load Diff
+154
View File
@@ -0,0 +1,154 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file i2c.h
**
** Headerfile for I2C functions
**
**
** History:
** - 2018-03-1 CJ First Version
**
*****************************************************************************/
#ifndef __I2C_H__
#define __I2C_H__
#include "ddl.h"
/**
*******************************************************************************
** \defgroup I2cGroup Inter-Integrated Circuit (I2C)
**
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief I2C功能配置
*****************************************************************************/
typedef enum en_i2c_func
{
I2cModule_En = 6u, ///<I2C模块使能
I2cStart_En = 5u, ///<开始信号
I2cStop_En = 4u, ///<结束信号
I2cAck_En = 2u, ///<应答信号
I2cHlm_En = 0u, ///<高速使能
}en_i2c_func_t;
/**
******************************************************************************
** \brief I2C模式配置
*****************************************************************************/
typedef enum en_i2c_mode
{
I2cMasterMode = 0x40u, ///<I2C主机模式
I2cSlaveMode = 0x44u, ///<I2C从机模式
}en_i2c_mode_t;
/**
******************************************************************************
** \brief I2C初始化配置结构
*****************************************************************************/
typedef struct stc_i2c_cfg
{
uint32_t u32Pclk; ///<Pclk 设置(Hz)
uint32_t u32Baud; ///<I2C通信波特率(Hz)
en_i2c_mode_t enMode; ///<I2C主从模式配置
uint8_t u8SlaveAddr; ///<从机地址配置(如果需要)
boolean_t bGc; ///<广播地址使能(如果需要)
}stc_i2c_cfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
//I2C初始化函数
en_result_t I2C_Init(M0P_I2C_TypeDef* I2Cx,stc_i2c_cfg_t *pstcI2CCfg);
//设置波特率配置寄存器
en_result_t I2C_SetBaud(M0P_I2C_TypeDef* I2Cx,uint8_t u8Tm);
//I2C功能设置函数
en_result_t I2C_SetFunc(M0P_I2C_TypeDef* I2Cx,en_i2c_func_t enFunc);
//I2C功能清除函数
en_result_t I2C_ClearFunc(M0P_I2C_TypeDef* I2Cx,en_i2c_func_t enFunc);
//获取中断标记SI
boolean_t I2C_GetIrq(M0P_I2C_TypeDef* I2Cx);
//清除中断标记SI
en_result_t I2C_ClearIrq(M0P_I2C_TypeDef* I2Cx);
//获取状态
uint8_t I2C_GetState(M0P_I2C_TypeDef* I2Cx);
//字节写函数
en_result_t I2C_WriteByte(M0P_I2C_TypeDef* I2Cx,uint8_t u8Data);
//字节读函数
uint8_t I2C_ReadByte(M0P_I2C_TypeDef* I2Cx);
//I2C模块接收指定长度函数
boolean_t I2C_MasterReadData(M0P_I2C_TypeDef* I2CX,uint8_t u8SlaveAddr,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len);
//I2C模块主机发送指定长度函数
boolean_t I2C_MasterWriteData(M0P_I2C_TypeDef* I2CX,uint8_t u8SlaveAddr,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len);
//@} // I2cGroup
#ifdef __cplusplus
#endif
#endif /* __I2C_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+250
View File
@@ -0,0 +1,250 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file lcd.h
**
** Header file for lcd Converter functions
** @link LCD Group Some description @endlink
**
** - 2019-04-02 First Version
**
******************************************************************************/
#ifndef __LCD_H__
#define __LCD_H__
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "ddl.h"
/******************************************************************************
** Global type definitions
*****************************************************************************/
/**
******************************************************************************
** \brief LCD bias源选择
*****************************************************************************/
typedef enum
{
LcdInResHighPower = 6,//内部电阻分压,大功耗模式
LcdInResLowPower = 4,//内部电阻分压,小功耗模式
LcdInResMidPower = 2,//内部电阻分压,中功耗模式
LcdExtCap = 1,//电容分压模式,需要外部电路配合
LcdExtRes = 0,//外部电阻模式,需要外部电路配合
}en_lcd_biassrc_t;
/**
******************************************************************************
** \brief LCD duty选择 LCD_CR0 Duty
*****************************************************************************/
typedef enum
{
LcdStatic = 0u, // 静态显示
LcdDuty2 = 1u, // 1/2duty
LcdDuty3 = 2u, // 1/3duty
LcdDuty4 = 3u, // 1/4duty
LcdDuty6 = 5u, // 1/6duty
LcdDuty8 = 7u, // 1/8duty
}en_lcd_duty_t;
/**
******************************************************************************
** \brief LCD bias配置位 LCD_CR0 Bias
*****************************************************************************/
typedef enum
{
LcdBias3 = 0u, // 1/3 BIAS
LcdBias2 = 1u, // 1/2 BIAS
}en_lcd_bias_t;
/**
******************************************************************************
** \brief LCD 电压泵时钟频率选择 LCD_CR0 CpClk
*****************************************************************************/
typedef enum
{
LcdClk2k = 0u, // 2k
LcdClk4k = 1u, // 4k
LcdClk8k = 2u, // 8k
LcdClk16k = 3u // 16k
}en_lcd_cpclk_t;
/**
******************************************************************************
** \brief LCD 扫描频率选择 LCD_CR0 LcdClk
*****************************************************************************/
typedef enum
{
LcdClk64hz = 0u, // 64hz
LcdClk128hz = 1u, // 128hz
LcdClk256hz = 2u, // 256hz
LcdClk512hz = 3u // 512hz
}en_lcd_scanclk_t;
/**
******************************************************************************
** \brief LCD 使能控制 LCD_CR0 EN
*****************************************************************************/
typedef enum
{
LcdEnable =1u, //LCD使能
LcdDisable =0u //LCD禁止
}en_lcd_en_t;
/**
******************************************************************************
** \brief LCD显示模式 LCD_CR1 Mode
*****************************************************************************/
typedef enum
{
LcdMode0 = 0,///<模式0
LcdMode1 = 1,///<模式1
}en_lcd_dispmode_t;
/**
******************************************************************************
** \brief LCD时钟源选择 LCD_CR1 ClkSrc
*****************************************************************************/
typedef enum
{
LcdXTL = 1,///<外部XTL
LcdRCL = 0,///<内部RCL
}en_lcd_clk_t;
/**
******************************************************************************
** \brief LCD CR1寄存器的使能位、标志位
*****************************************************************************/
typedef enum
{
LcdBlinkEn = 6u, //LCD闪屏配置位
LcdIe = 9u, //LCD 中断使能位
LcdDmaEn = 10u, //LCD DMA硬件触发使能位
}en_cr1_t;
/**
******************************************************************************
** \brief LCD显示SEG COM端口寄存器的配置
*****************************************************************************/
typedef struct
{
uint32_t u32Seg0_31; ///<SEG0-31配置
union{
uint32_t seg32_51_com0_8;
struct
{
uint32_t Seg32_35 :4;
uint32_t Seg36Com7 :1;
uint32_t Seg37Com6 :1;
uint32_t Seg38Com5 :1;
uint32_t Seg39Com4 :1;
uint32_t Seg40 :1;
uint32_t Seg41 :1;
uint32_t Seg42 :1;
uint32_t Seg43 :1;
uint32_t Mux :1;
uint32_t Seg44 :1;
uint32_t Seg45 :1;
uint32_t Seg46 :1;
uint32_t Seg47 :1;
uint32_t Seg48 :1;
uint32_t Seg49 :1;
uint32_t Seg50 :1;
uint32_t Seg51 :1;
uint32_t Com0_3 :4;
}segcom_bit;
}stc_seg32_51_com0_8_t;
}stc_lcd_segcom_t;
/**
******************************************************************************
** \brief LCD端口配置参数
*****************************************************************************/
typedef struct stc_lcd_segcompara
{
en_lcd_duty_t LcdDuty; ///<占空比
en_lcd_biassrc_t LcdBiasSrc; ///<时钟源
uint8_t u8MaxSeg; ///<最大SEG口
}stc_lcd_segcompara_t;
/**
******************************************************************************
** \brief I2C初始化配置结构
*****************************************************************************/
typedef struct
{
en_lcd_biassrc_t LcdBiasSrc; //偏置源选择
en_lcd_duty_t LcdDuty; //duty配置选择
en_lcd_bias_t LcdBias; //偏压选择
en_lcd_cpclk_t LcdCpClk; //电压泵时钟频率选择
en_lcd_scanclk_t LcdScanClk; //扫描频率选择
en_lcd_dispmode_t LcdMode; //显示模式选择
en_lcd_clk_t LcdClkSrc; //时钟源选择
en_lcd_en_t LcdEn; //LCD使能
}stc_lcd_cfg_t;
/*******************************************************************************
** \brief lcd相关函数声明
******************************************************************************/
extern boolean_t Lcd_GetItStatus(void);
extern void Lcd_ClearItPendingBit(void);
extern en_result_t Lcd_GetSegCom(stc_lcd_segcompara_t *pstcSegComPara,stc_lcd_segcom_t *pstcSegCom);
extern void Lcd_SetSegCom(stc_lcd_segcom_t *pstcSegCom);
extern void Lcd_Init(stc_lcd_cfg_t *pstcLcdCfg);
extern void Lcd_FullDisp(void);
extern void Lcd_ClearDisp(void);
extern en_result_t Lcd_WriteRam(uint8_t u8Row,uint32_t u32Data);
//@} // LCDGroup
#ifdef __cplusplus
#endif
#endif /* __LCD_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+106
View File
@@ -0,0 +1,106 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file lpm.h
**
** Lpm 数据结构及API声明
**
**
** History:
** - 2017-06-06 Lux V1.0
**
*****************************************************************************/
#ifndef __LPM_H__
#define __LPM_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
*******************************************************************************
** \defgroup LpmGroup Low Power Management (LPM)
**
**
******************************************************************************/
//@{
/******************************************************************************
** Global pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
///<功能配置及操作函数
///<进入普通休眠模式
void Lpm_GotoSleep(boolean_t bOnExit);
///<进入深度休眠模式
void Lpm_GotoDeepSleep(boolean_t bOnExit);
//@} // LpmGroup
#ifdef __cplusplus
#endif
#endif /* __LPM_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+185
View File
@@ -0,0 +1,185 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file lptim.h
**
**
**
**
** History:
** - 2019-04-09 First version
**
*****************************************************************************/
#ifndef __LPTIM_H__
#define __LPTIM_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
*******************************************************************************
** \brief LPTIMx 预除频
** \note LPTIMx_CR PRS 在定时器运行时不可以更改该值
******************************************************************************/
typedef enum
{
LptimPrsDiv1 = 0, // 1分频
LptimPrsDiv2 = 1, // 2分频
LptimPrsDiv4 = 2, // 4分频
LptimPrsDiv8 = 3, // 8分频
LptimPrsDiv16 = 4, // 16分频
LptimPrsDiv32 = 5, // 32分频
LptimPrsDiv64 = 6, // 64分频
LptimPrsDiv256 = 7 // 256分频
}en_lptim_prs_t;
/**
*******************************************************************************
** \brief LPTIMx 时钟选择
** \note LPTIMx_CR TCK_SEL
******************************************************************************/
typedef enum
{
LptimPclk = 0,
LptimXtl = 2,
LptimRcl = 3
}en_lptim_tcksel_t;
/**
*******************************************************************************
** \brief LPTIMx GATE极性控制位
** \note LPTIMx_CR GATE_P
******************************************************************************/
typedef enum
{
LptimGatePLow = 0,
LptimGatePHigh = 1
}en_lptim_gatep_t;
/**
*******************************************************************************
** \brief LPTIMx 时钟选择
** \note LPTIMx_CR GATE
******************************************************************************/
typedef enum
{
LptimGateLow = 0,
LptimGateHigh = 1
}en_lptim_gate_t;
/**
*******************************************************************************
** \brief LPTIMx TOG输出使能位
** \note LPTIMx_CR TOG
******************************************************************************/
typedef enum
{
LptimTogEnLow = 0,
LptimTogEnHigh = 1
}en_lptim_togen_t;
/**
*******************************************************************************
** \brief LPTIMx CT计数器/定时器功能选择
** \note LPTIMx_CR CT
******************************************************************************/
typedef enum
{
LptimTimerFun = 0, //警示器功能,定时器使用TCK_SEL选择的时钟进行计数
LptimCntFun = 1 //计数器功能,计数器使用外部输入的下降沿进行计数,采样时钟使用TCK_SEL选择的时钟
}en_lptim_ct_t;
/**
*******************************************************************************
** \brief LPTIMx 定时器工作模式
** \note LPTIMx_CR MD
******************************************************************************/
typedef enum
{
LptimMode1 = 0, //模式1无重载16位计数器/定时器
LptimMode2 = 1 //模式2自动重载16位计数器/定时器
}en_lptim_md_t;
/**
*******************************************************************************
** \brief LPTIMx 初始化配置的结构体
** \note
******************************************************************************/
typedef struct
{
en_lptim_prs_t enPrs;
en_lptim_tcksel_t enTcksel;
en_lptim_gatep_t enGatep;
en_lptim_gate_t enGate;
en_lptim_togen_t enTogen;
en_lptim_ct_t enCt;
en_lptim_md_t enMd;
uint16_t u16Arr;
}stc_lptim_cfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
extern void Lptim_ConfIt(M0P_LPTIMER_TypeDef* Lptimx, boolean_t NewStatus);
extern void Lptim_Cmd(M0P_LPTIMER_TypeDef* Lptimx, boolean_t NewStatus);
extern boolean_t Lptim_GetItStatus(M0P_LPTIMER_TypeDef* Lptimx);
extern void Lptim_ClrItStatus(M0P_LPTIMER_TypeDef* Lptimx);
extern en_result_t Lptim_Init(M0P_LPTIMER_TypeDef* Lptimx, stc_lptim_cfg_t* InitStruct);
#ifdef __cplusplus
#endif
#endif //__LPTIM_H__
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+276
View File
@@ -0,0 +1,276 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file lpuart.h
**
** Headerfile for LPUART functions
**
**
** History:
** - 2017-05-10 Cathy First Version
**
*****************************************************************************/
#ifndef __LPUART_H__
#define __LPUART_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup LPUartGroup Universal Asynchronous Receiver/Transmitter (LPUART)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
**\brief LPuart通道选择
******************************************************************************/
/**
******************************************************************************
** \brief lpuart 的sclk时钟源选择
******************************************************************************/
typedef enum en_lpuart_sclk_sel
{
LPUartMskPclk = 0u<<11, ///<pclk
LPUartMskXtl = 2u<<11, ///<外部低速晶振
LPUartMskRcl = 3u<<11, ///<内部低速晶振
} en_lpuart_sclksel_t;
/**
******************************************************************************
** \brief lpuart多机模式地址帧/数据帧或者奇偶校验
******************************************************************************/
typedef enum en_lpuart_mmdorck
{
LPUartDataOrAddr = 0u, ///<多机模式时,通过读写SBUF[8]决定帧为数据帧或地址帧
LPUartEven = 0x4u, ///<非多机模式偶校验
LPUartOdd = 0x8u, ///<非多机模式奇校验
}en_lpuart_mmdorck_t;
/**
******************************************************************************
** \brief lpuart多机模式及从机地址和地址掩码配置
******************************************************************************/
typedef struct stc_lpuart_multimode
{
uint8_t u8SlaveAddr; ///<从机地址
uint8_t u8SaddEn; ///<从及地址掩码
}stc_lpuart_multimode_t;
/**
******************************************************************************
** \brief lpuart 四种工作模式选择
******************************************************************************/
typedef enum en_lpuart_mode
{
LPUartMskMode0 = 0x00u, ///<模式0
LPUartMskMode1 = 0x40u, ///<模式1
LPUartMskMode2 = 0x80u, ///<模式2
LPUartMskMode3 = 0xc0u, ///<模式3
} en_lpuart_mode_t;
/**
******************************************************************************
** \brief lpuart stop长度选择
******************************************************************************/
typedef enum en_lpuart_stop
{
LPUart1bit = 0x0000u, ///<1位停止位
LPUart1_5bit = 0x4000u, ///<1.5位停止位
LPUart2bit = 0x8000u, ///<2位停止位
} en_lpuart_stop_t;
/**
******************************************************************************
** \brief lpuart 功能使能
******************************************************************************/
typedef enum en_lpuart_func
{
LPUartRenFunc = 4u, ///<0-TX; ///<1-非mode0模式代表RX&TX ,mode0模式代表RX;
LPUartDmaRxFunc = 16u, ///<DMA接收功能
LPUartDmaTxFunc = 17u, ///<DMA发送功能
LPUartRtsFunc = 18u, ///<硬件流RTS功能
LPUartCtsFunc = 19u, ///<硬件流CTS功能
LPUartHdFunc = 22u, ///<单线半双工功能
}en_lpuart_func_t;
/**
******************************************************************************
** \brief lpuart中断使能控制
******************************************************************************/
typedef enum en_lpuart_irq_sel
{
LPUartRxIrq = 0u, ///<接收中断使能
LPUartTxIrq = 1u, ///<发送中断使能
LPUartTxEIrq = 8u, ///<TX空中断使能
LPUartPEIrq = 13u, ///<奇偶校验中断使能
LPUartCtsIrq = 20u, ///<CTS信号翻转中断使能
LPUartFEIrq = 21u, ///<帧错误中断使能
}en_lpuart_irq_sel_t;
/**
******************************************************************************
** \brief lpuart 状态标志位
******************************************************************************/
typedef enum en_lpuart_status
{
LPUartRC = 0u, ///<接收数据完成标记
LPUartTC = 1u, ///<发送数据完成标记
LPUartFE = 2u, ///<帧错误标记
LPUartTxe = 3u, ///<TXbuff空标记
LPUartPE = 4u, ///<奇偶校验错误标记
LPUartCtsIf = 5u, ///<CTS中断标记
LPUartCts = 6u, ///<CTS信号标记
}en_lpuart_status_t;
/**
******************************************************************************
** \brief lpuart 通道采样分频配置
******************************************************************************/
typedef enum en_lpuart_clkdiv
{
LPUartMsk16Or32Div = 0u, ///<模式0无效,模式1/3为16分频,模式2为32分频
LPUartMsk8Or16Div = 0x200u, ///<模式0无效,模式1/3为8分频,模式2为16分频
LPUartMsk4Or8Div = 0x400u, ///<模式0无效,模式1/3为4分频,模式2为8分频
}en_lpuart_clkdiv_t;
/**
******************************************************************************
** \brief lpuart 通道Mode1和Mode3波特率计算参数
******************************************************************************/
typedef struct stc_lpuart_baud
{
en_lpuart_sclksel_t enSclkSel; ///<传输时钟源选择
en_lpuart_clkdiv_t enSclkDiv; ///<采样分频选择
uint32_t u32Sclk; ///<sclk
uint32_t u32Baud; ///< 波特率
} stc_lpuart_baud_t;
/**
******************************************************************************
** \lpuart 总体配置
******************************************************************************/
typedef struct stc_lpuart_cfg
{
en_lpuart_mode_t enRunMode; ///<四种模式配置
en_lpuart_mmdorck_t enMmdorCk; ///<校验模式
en_lpuart_stop_t enStopBit; ///<停止位长度
stc_lpuart_baud_t stcBaud; ///<Mode1/3波特率配置
} stc_lpuart_cfg_t;
// 总初始化处理
en_result_t LPUart_Init(M0P_LPUART_TypeDef* LPUARTx, stc_lpuart_cfg_t* pstcCfg);
// LPUART 单线模式使能/禁止
void LPUart_HdModeEnable(M0P_LPUART_TypeDef* LPUARTx);
void LPUart_HdModeDisable(M0P_LPUART_TypeDef* LPUARTx);
//TB8数据设置
void LPUart_SetTb8(M0P_LPUART_TypeDef* LPUARTx, boolean_t bTB8Value);
//数据寄存器bit8位获取
boolean_t LPUart_GetRb8(M0P_LPUART_TypeDef* LPUARTx);
//中断相关设置函数使能和禁止
en_result_t LPUart_EnableIrq(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_irq_sel_t enIrqSel);
en_result_t LPUart_DisableIrq(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_irq_sel_t enIrqSel);
//特殊功能使能和禁止
en_result_t LPUart_EnableFunc(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_func_t enFunc);
en_result_t LPUart_DisableFunc(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_func_t enFunc);
//状态位获取函数
boolean_t LPUart_GetStatus(M0P_LPUART_TypeDef* LPUARTx,en_lpuart_status_t enStatus);
//状态位的清除
en_result_t LPUart_ClrStatus(M0P_LPUART_TypeDef* LPUARTx,en_lpuart_status_t enStatus);
//整个状态寄存器获取
uint8_t LPUart_GetIsr(M0P_LPUART_TypeDef* LPUARTx);
//整个状态寄存器清除
en_result_t LPUart_ClrIsr(M0P_LPUART_TypeDef* LPUARTx);
//数据查询方式的发送
en_result_t LPUart_SendData(M0P_LPUART_TypeDef* LPUARTx, uint8_t u8Data);
//数据中断方式的发送
en_result_t LPUart_SendDataIt(M0P_LPUART_TypeDef* LPUARTx, uint8_t u8Data);
//数据接收
uint8_t LPUart_ReceiveData(M0P_LPUART_TypeDef* LPUARTx);
//LPUARTx通道号,enClk 时钟源选项
en_result_t LPUart_SelSclk(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_sclksel_t enSclk);
//LPUART通道多主机模式配置
en_result_t LPUart_SetMultiMode(M0P_LPUART_TypeDef* LPUARTx, stc_lpuart_multimode_t* pstcMultiCfg);
//LPUART通道多主机模式从机地址配置函数
en_result_t LPUart_SetSaddr(M0P_LPUART_TypeDef* LPUARTx,uint8_t u8Addr);
//@} // LPUartGroup
#ifdef __cplusplus
#endif
#endif /* __UART_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+231
View File
@@ -0,0 +1,231 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file lvd.h
**
** Headerfile for Low Voltage Detector functions
**
** - 2017-06-28 Alex First Version
**
******************************************************************************/
#ifndef __LVD_H__
#define __LVD_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup LvdGroup Low Voltage Detector (LVD)
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief LVD监测电压源选择
**
** \note
******************************************************************************/
typedef enum en_lvd_input_src
{
LvdInputSrcMskVCC = 0u<<2, ///< Vcc
LvdInputSrcMskPC13 = 1u<<2, ///< PC13
LvdInputSrcMskPB08 = 2u<<2, ///< PB08
LvdInputSrcMskPB07 = 3u<<2, ///< PB07
}en_lvd_input_src_t;
/**
******************************************************************************
** \brief LVD阈值电压选择
**
** \note
******************************************************************************/
typedef enum en_lvd_threshold
{
LvdMskTH1_8V = 0u<<4, ///< 1.8V
LvdMskTH1_9V = 1u<<4, ///< 1.9V
LvdMskTH2_0V = 2u<<4, ///< 2.0V
LvdMskTH2_1V = 3u<<4, ///< 2.1V
LvdMskTH2_2V = 4u<<4, ///< 2.2V
LvdMskTH2_3V = 5u<<4, ///< 2.3V
LvdMskTH2_4V = 6u<<4, ///< 2.4V
LvdMskTH2_5V = 7u<<4, ///< 2.5V
LvdMskTH2_6V = 8u<<4, ///< 2.6V
LvdMskTH2_7V = 9u<<4, ///< 2.7V
LvdMskTH2_8V = 10u<<4, ///< 2.8V
LvdMskTH2_9V = 11u<<4, ///< 2.9V
LvdMskTH3_0V = 12u<<4, ///< 3.0V
LvdMskTH3_1V = 13u<<4, ///< 3.1V
LvdMskTH3_2V = 14u<<4, ///< 3.2V
LvdMskTH3_3V = 15u<<4, ///< 3.3V
}en_lvd_threshold_t;
/**
******************************************************************************
** \brief LVD输出滤波时间
**
** \note
******************************************************************************/
typedef enum en_lvd_filter_time
{
LvdFilterMsk7us = 0u<<9, ///< 7us
LvdFilterMsk14us = 1u<<9, ///< 14us
LvdFilterMsk28us = 2u<<9, ///< 28us
LvdFilterMsk112us = 3u<<9, ///< 112us
LvdFilterMsk450us = 4u<<9, ///< 450us
LvdFilterMsk1_8ms = 5u<<9, ///< 1.8ms
LvdFilterMsk7_2ms = 6u<<9, ///< 7.3ms
LvdFilterMsk28_8ms = 7u<<9, ///< 28.8ms
}en_lvd_filter_time_t;
/**
******************************************************************************
** \brief LVD中断触发方式
**
** \note
******************************************************************************/
typedef enum en_lvd_irq_type
{
LvdIrqMskRiseFall = 3u<<12, ///< 上升/下降沿触发
LvdIrqMskHigh = 1u<<14, ///< 高电平触发
LvdIrqMskRise = 1u<<13, ///< 上升沿触发
LvdIrqMskFall = 1u<<12, ///< 下降沿触发
}en_lvd_irq_type_t;
/**
******************************************************************************
** \brief LVD触发动作选择
**
** \note
******************************************************************************/
typedef enum en_lvd_act
{
LvdActMskReset = 1u<<1, ///< 系统复位
LvdActMskInt = 0u, ///< NVIC中断
}en_lvd_act_t;
/**
******************************************************************************
** \brief LVD数字滤波使能配置
**
** \note
******************************************************************************/
typedef enum en_lvd_filter
{
LvdFilterMskEnable = 1u<<8, ///< 数字滤波使能
LvdFilterMskDisable = 0u, ///< 数字滤波禁止
}en_lvd_filter_t;
/**
******************************************************************************
** \brief LVD配置
** \note
******************************************************************************/
typedef struct stc_lvd_cfg
{
en_lvd_act_t enAct; ///< LVD触发动作
en_lvd_input_src_t enInputSrc; ///< LVD输入电压源
en_lvd_threshold_t enThreshold; ///< LVD监测电压
en_lvd_filter_t enFilter; ///< 是否使用输出滤波
en_lvd_filter_time_t enFilterTime; ///< 输出滤波时间
en_lvd_irq_type_t enIrqType; ///< 中断触发方式
}stc_lvd_cfg_t;
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
//irq enable/disable
void Lvd_EnableIrq(void);
void Lvd_DisableIrq(void);
// irq function
void Lvd_ClearIrq(void);
boolean_t Lvd_GetIrqStat(void);
// fliter function
boolean_t Lvd_GetFilterResult(void);
//init/deinit function
void Lvd_Init(stc_lvd_cfg_t *pstcCfg);
//LVD function enable/disable
void Lvd_Enable(void);
void Lvd_Disable(void);
//@} // LvdGroup
#ifdef __cplusplus
}
#endif
#endif /* __LVD_H__ */
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+152
View File
@@ -0,0 +1,152 @@
/*******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file OPA.h
**
** Headerfile for OPA functions
** @link OPA Group Some description @endlink
**
** History:
** - 2019-04-11 First Version
**
******************************************************************************/
#ifndef __OPA_H__
#define __OPA_H__
/*******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup OPAGroup (OPA)
**
******************************************************************************/
//@{
/**
*******************************************************************************
** function prototypes.
******************************************************************************/
typedef enum en_opa_oenx
{
OpaOen1 = 3u, //OUT1
OpaOen2 = 4u, //OUT2
OpaOen3 = 5u, //OUT3
OpaOen4 = 6u //OUT4
}en_opa_oenx_t;
typedef enum en_opa_clksrc // 自动校准脉冲宽度设置
{
OpaM1Pclk = 0u, // 1个PCLK周期
OpaM2Pclk = 1u, // 2个PCLK周期
OpaM4Pclk = 2u, // 4个PCLK周期
OpaM8Pclk = 3u, // 8个PCLK周期
OpaM16Pclk = 4u, // 16个PCLK周期
OpaM32Pclk = 5u, // 32个PCLK周期
OpaM64Pclk = 6u, // 64个PCLK周期
OpaM128Pclk = 7u, // 128个PCLK周期
OpaM256Pclk = 8u, // 256个PCLK周期
OpaM512Pclk = 9u, // 512个PCLK周期
OpaM1024Pclk = 10u, // 1024个PCLK周期
OpaM2048Pclk = 11u, // 2048个PCLK周期
OpaM4096Pclk = 12u // 4096个PCLK周期
}en_opa_clksrc_t;
typedef enum en_opa_set0ctrl
{
enClkSwSet = 3u, // 软件校准使能
enAzPulse = 2u, // 软件校准
enTrigger = 1u, // 软件触发自动教零
enAdctr = 1u // 使能ADC启动触发OPA自动校准功能
}en_opa_set0ctrl_t;
typedef struct
{
boolean_t bAzen; // 自动教零配置
boolean_t bClk_sw_set; // 自动教零选择
boolean_t bAz_pulse; // 软件校准设置
boolean_t bTrigger; // 软件触发校准设置
boolean_t bAdctr_en; // ADC启动触发OPA自动校准设置
en_opa_clksrc_t enClksrc; // 自动校准脉冲宽度设置
}stc_opa_zcfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
//OPA 通道使能
extern void Opa_Cmd(boolean_t NewStatus);
extern void Opa_CmdBuf(boolean_t NewStatus);
//OPA零点校准配置
extern void Opa_SetZero(stc_opa_zcfg_t* InitZero);
//使能输出OUTX
extern void Opa_CmdOnex(en_opa_oenx_t onex, boolean_t NewState);
//配置校零相关的位
extern void Opa_ZeroBitCtrl(en_opa_set0ctrl_t CtrlBit, boolean_t NewState);
//@} // OPA Group
#ifdef __cplusplus
#endif
#endif /* __OPA_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+261
View File
@@ -0,0 +1,261 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file pca.h
**
** PCA(可编程计数阵列)数据结构及API声明
**
**
** History:
** - 2019-04-09 First version
**
*****************************************************************************/
#ifndef __PCA_H__
#define __PCA_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup PcaGroup Programmable Counter Array (PCA)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
*******************************************************************************
** \brief PCA 模块选择
** \note
******************************************************************************/
typedef enum
{
PcaModule0 = 0, // PCA_0
PcaModule1 = 1, // PCA_1
PcaModule2 = 2, // PCA_2
PcaModule3 = 3, // PCA_3
PcaModule4 = 4 // PCA_4
}en_pca_module_t;
/**
*******************************************************************************
** \brief PCA 中断标志位 中断清除位
** \note PCA_CCON中的CCF0-CCF4与CF; PCA_ICLR中的CCF0-CCF4与CF
******************************************************************************/
typedef enum
{
PcaCcf0 = 0,
PcaCcf1 = 1,
PcaCcf2 = 2,
PcaCcf3 = 3,
PcaCcf4 = 4,
PcaCf = 7
}en_pca_ccficlr_t;
/**
*******************************************************************************
** \brief PCA 时钟分频选择及时钟源选择
** \note PCA_CMOD CPS[2:0]
******************************************************************************/
typedef enum
{
PcaPclkdiv32 = 0, // PCLK/32
PcaPclkdiv16 = 1, // PCLK/16
PcaPclkdiv8 = 2, // PCLK/8
PcaPclkdiv4 = 3, // PCLK/4
PcaPclkdiv2 = 4, // PCLK/2
PcaTim0ovf = 5, // timer0 overflow
PcaTim1ovf = 6, // timer1 overflow
PcaEci = 7 // ECI外部时钟
}en_pca_clksrc_t;
/**
*******************************************************************************
** \brief PCA 允许比较器功能控制
** \note PCA_CCAPMx ECOM
******************************************************************************/
typedef enum
{
PcaEcomDisable = 0,
PcaEcomEnable = 1
}en_pca_ecom_t;
/**
*******************************************************************************
** \brief PCA 正沿捕获控制位
** \note PCA_CCAPMx CAPP
******************************************************************************/
typedef enum
{
PcaCappDisable = 0,
PcaCappEnable = 1
}en_pca_capp_t;
/**
*******************************************************************************
** \brief PCA 负沿捕获控制位
** \note PCA_CCAPMx CAPN
******************************************************************************/
typedef enum
{
PcaCapnDisable = 0,
PcaCapnEnable = 1
}en_pca_capn_t;
/**
*******************************************************************************
** \brief PCA 匹配控制位
** \note PCA_CCAPMx MAT
******************************************************************************/
typedef enum
{
PcaMatDisable = 0,
PcaMatEnable = 1
}en_pca_mat_t;
/**
*******************************************************************************
** \brief PCA 翻转控制位
** \note PCA_CCAPMx TOG
******************************************************************************/
typedef enum
{
PcaTogDisable = 0,
PcaTogEnable = 1
}en_pca_tog_t;
/**
*******************************************************************************
** \brief PCA PWM控制位
** \note PCA_CCAPMx PWM
******************************************************************************/
typedef enum
{
PcaPwm8bitDisable = 0,
PcaPwm8bitEnable = 1
}en_pca_pwm8bit_t;
/**
*******************************************************************************
** \brief PCA EPWM控制位
** \note PCA_EPWM EPWM
******************************************************************************/
typedef enum
{
PcaEpwmDisable = 0,
PcaEpwmEnable = 1
}en_pca_epwm_t;
/**
*******************************************************************************
** \brief PCA 初始化配置的结构体
** \note
******************************************************************************/
typedef struct
{
en_pca_clksrc_t pca_clksrc; // PCA_CMOD CPS[2:0]
boolean_t pca_cidl; // PCA_CMOD CIDL
en_pca_ecom_t pca_ecom; // PCA_CCAPMx ECOM
en_pca_capp_t pca_capp; // PCA_CCAPMx CAPP
en_pca_capn_t pca_capn; // PCA_CCAPMx CAPN
en_pca_mat_t pca_mat; // PCA_CCAPMx MAT
en_pca_tog_t pca_tog; // PCA_CCAPMx TOG
en_pca_pwm8bit_t pca_pwm; // PCA_CCAPMx PWM
en_pca_epwm_t pca_epwm; // PCA_EPWM
uint16_t pca_ccap; // PCA_CCAP
uint8_t pca_ccapl; // PCA_CCAPL PCA_CCAP的低字节
uint8_t pca_ccaph; // PCA_CCAPH PCA_CCAP的高字节
uint16_t pca_carr; // PCA_CARR
}stc_pcacfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
extern boolean_t Pca_GetItStatus(en_pca_ccficlr_t It_Src);
extern void Pca_ClrItStatus(en_pca_ccficlr_t It_Src);
extern void Pca_StartPca(boolean_t NewStatus);
extern void Pca_SetCidl(boolean_t NewStatus);
extern void Pca_Set4Wdte(boolean_t NewStatus);
extern void Pca_ConfPcaIt(boolean_t NewStatus);
extern void Pca_ConfModulexIt(en_pca_module_t Modulex, boolean_t NewStatus);
extern void Pca_M0Init(stc_pcacfg_t* InitStruct);
extern void Pca_M1Init(stc_pcacfg_t* InitStruct);
extern void Pca_M2Init(stc_pcacfg_t* InitStruct);
extern void Pca_M3Init(stc_pcacfg_t* InitStruct);
extern void Pca_M4Init(stc_pcacfg_t* InitStruct);
extern uint16_t Pca_GetCnt(void);
extern void Pca_SetCnt(uint16_t cnt);
extern boolean_t Pca_GetOut(en_pca_module_t Modulex);
extern void Pca_SetCcap(en_pca_module_t Modulex, uint16_t Value);
extern uint16_t Pca_GetCcap(en_pca_module_t Modulex);
extern void Pca_SetCarr(uint16_t Value);
extern uint16_t Pca_GetCarr(void);
extern void Pca_SetCcapHL(en_pca_module_t Modulex, uint8_t ValueH, uint8_t ValueL);
extern void Pca_GetCcapHL(en_pca_module_t Modulex, uint8_t *ValueH, uint8_t *ValueL);
//@} // PcaGroup
#ifdef __cplusplus
#endif
#endif /* __PCA_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+233
View File
@@ -0,0 +1,233 @@
/*******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file pcnt.h
**
** Headerfile for PCNT functions
** @link PCNT Group Some description @endlink
**
** History:
** - 2019-04-08 First Version
**
******************************************************************************/
#ifndef __PCNT_H__
#define __PCNT_H__
/*******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup PCNTGroup (PCNT)
**
******************************************************************************/
//@{
/**
*******************************************************************************
** function prototypes.
******************************************************************************/
/**
*******************************************************************************
** \brief PCNT S0通道极性选择
** \note PCNT_CTRL S0P
******************************************************************************/
typedef enum
{
PcntS0PNoinvert = 0u, // S0通道极性不取反
PcntS0PInvert = 1u // S0通道极性取反
}en_pcnt_s0polar_t;
/**
*******************************************************************************
** \brief PCNT S1通道极性选择
** \note PCNT_CTRL S1P
******************************************************************************/
typedef enum
{
PcntS1PNoinvert = 0u, // S1通道极性不取反
PcntS1PInvert = 1u // S1通道极性取反
}en_pcnt_s1polar_t;
/**
*******************************************************************************
** \brief PCNT 计数方向选择
** \note PCNT_CTRL DIR
******************************************************************************/
typedef enum
{
PcntNDoubleDirAdd = 0u, // 加计数
PcntNDoubleDirSub = 1u // 减计数
}en_pcnt_dir_t;
/**
*******************************************************************************
** \brief PCNT 计数时钟选择
** \note PCNT_CTRL ClkSel
******************************************************************************/
typedef enum
{
PcntCLKPclk = 1u, // PCLK
PcntCLKXtl = 2u, // XTL
PcntCLKRcl = 3u // RCL
}en_pcnt_clksel_t;
/**
*******************************************************************************
** \brief PCNT 脉冲计数模式选择
** \note PCNT_CTRL Mode
******************************************************************************/
typedef enum
{
PcntSingleMode = 1u, // 单通道脉冲计数模式
PcntSpecialMode = 2u, // 双通道非正交脉冲计数模式
PcntDoubleMode = 3u // 双通道正交脉冲计数模式
}en_pcnt_mode_t;
/**
******************************************************************************
** \brief PCNT 状态
** \note PCNT_IFR & PCNT_ICR & PCNT_IEN
*****************************************************************************/
typedef enum
{
PcntS1E = 7, // S1通道脉冲解码错误
PcntS0E = 6, // S0通道脉冲解码错误
PcntBB = 5, // 脉冲解码错误
PcntFE = 4, // 采样周期脉冲解码错误
PcntDIR = 3, // 反向改变中断
PcntTO = 2, // 超时中断标识
PcntOV = 1, // 上溢中断标识
PcntUF = 0, // 下溢中断标识
}en_pcnt_itfce_t;
/**
******************************************************************************
** \brief PCNT 状态寄存器1 PCNT_SR1
** \note PCNT_SR1 : DIR
*****************************************************************************/
typedef enum
{
PcntDoubleDirAdd = 0, // 双通道正交脉冲加计数
PcntDoubleDirSub = 1 // 双通道正交脉冲加计数
}en_pcnt_sr1dir_t;
/**
******************************************************************************
** \brief PCNT 观测输出选择寄存器 PCNT_DBG
** \note PCNT_DBG: DBG
*****************************************************************************/
typedef enum
{
PcntDBGZero = 0, // 固定为0
PcntDBGSxA = 1, // 脉冲同步之后通过S0A/S1A输出
PcntDBGSxP = 2, // 脉冲极性选择之后通过S0P/S1P输出
PcntDBGSxPF = 3 // 脉冲滤波之后通过S0PF/S1PF输出
}en_pcnt_dbg_t;
typedef enum
{
PcntDirUp = 0, //加计数
PcntDirDown = 1 //减计数
}en_pent_dir_t;
/**
******************************************************************************
** \brief PCNT 整体配置结构体
*****************************************************************************/
typedef struct stc_pcnt_cfg
{
en_pcnt_s0polar_t Pcnt_S0Sel; // S0通道极性选择
en_pcnt_s1polar_t Pcnt_S1Sel; // S1通道极性选择
en_pcnt_clksel_t Pcnt_Clk; // 计数时钟选择
en_pcnt_mode_t Pcnt_Mode; // 脉冲计数模式选择
boolean_t Pcnt_FltEn; // 脉冲宽度滤波器使能控制 PCNT_FLT: EN
uint8_t Pcnt_DebTop; // 计数器阀值 PCNT_FLT: DebTop
uint16_t Pcnt_ClkDiv; // 滤波时钟分频系数 PCNT_FLT: ClkDiv
boolean_t Pcnt_TocrEn; // 超时功能使能控制位 PCNT_TOCR : EN
uint16_t Pcnt_TocrTh; // 超时阈值 PCNT_TOCR : TH
en_pcnt_dbg_t Pcnt_Dbg; // 观测输出选择寄存器 PCNT_DBG
en_pent_dir_t Pcnt_Dir;
}stc_pcnt_initstruct_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
extern boolean_t Pcnt_Cmd(boolean_t NewState);
extern en_result_t Pcnt_SetB2T(uint16_t value);
extern en_result_t Pcnt_SetB2C(uint16_t value);
extern en_result_t Pcnt_SetT2C(void);
extern void Pcnt_Init(stc_pcnt_initstruct_t* InitStruct);
extern void Pcnt_ItCfg(en_pcnt_itfce_t IT_Src, boolean_t NewState);
extern boolean_t Pcnt_GetItStatus(en_pcnt_itfce_t IT_Src);
extern void Pcnt_ClrItStatus(en_pcnt_itfce_t IT_Src);
extern uint16_t Pcnt_GetCnt(void);
extern uint16_t Pcnt_GetTop(void);
extern uint16_t Pcnt_GetBuf(void);
extern void Pcnt_SetCnt(uint16_t value);
extern void Pcnt_SetBuf(uint16_t value);
extern void Pcnt_SetTop(uint16_t value);
//@} // PCNT Group
#ifdef __cplusplus
#endif
#endif /* __PCNT_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+119
View File
@@ -0,0 +1,119 @@
/*************************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file ram.h
**
** RAM 数据结构及API声明.
**
** - 2019-04-02 LuX V1.0
**
******************************************************************************/
#ifndef __RAM_H__
#define __RAM_H__
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup RamGroup Ram Controller (Ram)
**
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief Redefinition of RAM register structure
******************************************************************************/
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///<中断相关函数
///<中断使能/禁止
void Ram_EnableIrq(void);
void Ram_DisableIrq(void);
///<中断标志获取
boolean_t Ram_GetIntFlag(void);
///<中断标志清除
void Ram_ClearIntFlag(void);
///<奇偶校验出错地址获取
uint32_t Ram_ErrAddrGet(void);
//@} // RamGroup
#ifdef __cplusplus
}
#endif
#endif /* __RAM_H__ */
/******************************************************************************/
/* EOF (not truncated) */
/******************************************************************************/
+175
View File
@@ -0,0 +1,175 @@
/******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file reset.h
**
** Headerfile for reset functions
**
**
** History:
** - 2018-04-21 Lux First Version
**
******************************************************************************/
#ifndef __RESET_H__
#define __RESET_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup ResetGroup Reset (RST)
**
******************************************************************************/
//@{
/**
*******************************************************************************
** function prototypes.
******************************************************************************/
/*******************************************************************************
* Global definitions
******************************************************************************/
/**
*******************************************************************************
** \brief 外设复位控制类型定义
** \note
******************************************************************************/
typedef enum en_sysctrl_peripheral0
{
ResetMskUart0 = 1u<<0u, ///< 串口0
ResetMskUart1 = 1u<<1u, ///< 串口1
ResetMskLpUart0 = 1u<<2u, ///< 低功耗串口0
ResetMskLpUart1 = 1u<<3u, ///< 低功耗串口1
ResetMskI2c0 = 1u<<4u, ///< I2C0
ResetMskI2c1 = 1u<<5u, ///< I2C1
ResetMskSpi0 = 1u<<6u, ///< SPI0
ResetMskSpi1 = 1u<<7u, ///< SPI1
ResetMskBaseTim = 1u<<8u, ///< 基础定时器TIM0/1/2
ResetMskLpTim0 = 1u<<9u, ///< 低功耗定时器0
ResetMskAdvTim = 1u<<10u, ///< 高级定时器TIM4/5/6
ResetMskTim3 = 1u<<11u, ///< 定时器3
ResetMskOpa = 1u<<13u, ///< OPA
ResetMskPca = 1u<<14u, ///< 可编程计数阵列
ResetMskAdcBgr = 1u<<16u, ///< ADC&BGR
ResetMskVcLvd = 1u<<17u, ///< VC和LVD
ResetMskRng = 1u<<18u, ///< RNG
ResetMskPcnt = 1u<<19u, ///< PCNT
ResetMskRtc = 1u<<20u, ///< RTC
ResetMskTrim = 1u<<21u, ///< 时钟校准
ResetMskLcd = 1u<<22u, ///< LCD
ResetMskTick = 1u<<24u, ///< 系统定时器
ResetMskSwd = 1u<<25u, ///< SWD
ResetMskCrc = 1u<<26u, ///< CRC
ResetMskAes = 1u<<27u, ///< AES
ResetMskGpio = 1u<<28u, ///< GPIO
ResetMskDma = 1u<<29u, ///< DMA
}en_reset_peripheral0_t;
typedef enum en_sysctrl_peripheral1
{
ResetMskDac = 1u<<3u, ///< DAC
ResetMskLpTim1 = 1u<<4u, ///< 低功耗定时器1
ResetMskUart2 = 1u<<8u, ///< UART2
ResetMskUart3 = 1u<<9u, ///< UART3
}en_reset_peripheral1_t;
/**
*******************************************************************************
** \brief 复位源(标识)显示
**
** \note
******************************************************************************/
typedef enum en_reset_flag
{
ResetFlagMskPor5V = 1u<<0u, ///< 5V启动复位
ResetFlagMskPor1_5V = 1u<<1u, ///< 1.5V启动复位
ResetFlagMskLvd = 1u<<2u, ///< 低电压检测复位
ResetFlagMskWdt = 1u<<3u, ///< 看门狗复位
ResetFlagMskPca = 1u<<4u, ///< PCA复位
ResetFlagMskLockup = 1u<<5u, ///< 系统异常复位
ResetFlagMskSysreq = 1u<<6u, ///< 软件复位
ResetFlagMskRstb = 1u<<7u, ///< RESET脚 复位
}en_reset_flag_t;
/*******************************************************************************
* Global variable declarations ('extern', definition in C source)
******************************************************************************/
/*******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///< 获得复位源状态
boolean_t Reset_GetFlag(en_reset_flag_t enRstFlg);
///< 清除复位源状态
void Reset_ClearFlag(en_reset_flag_t enRstFlg);
void Reset_ClearFlagAll(void);
///< 外设模块复位
void Reset_RstPeripheralAll(void);
void Reset_RstPeripheral0(en_reset_peripheral0_t enPeri);
void Reset_RstPeripheral1(en_reset_peripheral1_t enPeri);
//@} // ResetGroup
#ifdef __cplusplus
#endif
#endif /* __RESET_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+248
View File
@@ -0,0 +1,248 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file rtc.h
**
** Headerfile for RTC functions
**
**
** History:
** - 2019-04-10 First Version
**
*****************************************************************************/
#ifndef __RTC_H__
#define __RTC_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup RtcGroup Real Time Clock (RTC)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief rtc周期中断的时间间隔 RTC_CR0 PRDS
*****************************************************************************/
typedef enum
{
RtcNone = 0u, //无周期中断
Rtc05S = 1u, //0.5S中断
Rtc1S = 2u, //1秒
Rtc1Min = 3u, //1分钟
Rtc1H = 4u, //1小时
Rtc1Day = 5u, //1天
Rtc1Mon = 6u //1月
}en_rtc_prds_t;
/**
******************************************************************************
** \brief rtc 12h制或24h制方式选择 RTC_CR0 AMPM
*****************************************************************************/
typedef enum
{
RtcAm = 0u, //12小时制
RtcPm = 1u //24小时制
}en_rtc_ampm_t;
/**
******************************************************************************
** \brief 普通精度与高精度1Hz输出 RTC_CR0 HZ1SEL
*****************************************************************************/
typedef enum
{
RtcHz1selGeneralPricision = 0u, //普通精度1Hz输出
RtcHz1selHighPricision = 1u //高精度1Hz输出
}en_rtc_hz1sel_t;
/**
******************************************************************************
** \brief 周期中断选择 RTC_CR0 PRDSEL
*****************************************************************************/
typedef enum
{
RtcPrds = 0u, //使用PRDS所设定的周期中断事件间隔
RtcPrdx = 1u //使用PRDX所设定的周期中断事件间隔
}en_rtc_prdsel_t;
/**
******************************************************************************
** \brief rtc的时钟选择 RTC_CR1 CKSEL
*****************************************************************************/
typedef enum
{
RtcClkXtl = 0u, //外部低速时钟XTL 32.768k
RtcClkRcl = 2u, //内部低速时钟RCL 32k
RtcClkXth128 = 4u, //外部晶振4M XTH/128
RtcClkXth256 = 5u, //外部晶振8M XTH/256
RtcClkXth512 = 6u, //外部晶振16M XTH/512
RtcClkXth1024 = 7u //外部晶振32M XTH/1024
}en_rtc_cksel_t;
/**
******************************************************************************
** \brief 时钟误差补偿使能或禁止 RTC_COMPEN EN
*****************************************************************************/
typedef enum
{
RtcCompenDisable = 0u,
RtcCompenEnable = 1u
}en_rtc_compen_t;
/**
******************************************************************************
** \brief 配置PRD中断使能及其周期类型
*****************************************************************************/
typedef struct
{
en_rtc_prdsel_t rtcPrdsel;
uint8_t rtcPrdx;
en_rtc_prds_t rtcPrds;
}stc_rtc_cyccfg_t;
/**
******************************************************************************
** \brief 闹钟源配置
*****************************************************************************/
typedef struct
{
uint8_t RtcAlarmSec; //闹钟秒钟
uint8_t RtcAlarmMinute; //闹钟分钟
uint8_t RtcAlarmHour; //闹钟小时
uint8_t RtcAlarmWeek; //闹钟周
}stc_rtc_alarmtime_t;
/**
******************************************************************************
** \brief 时间
*****************************************************************************/
/**
******************************************************************************
** \brief rtc时钟年、月、日、时、分、秒读写结构
*****************************************************************************/
typedef struct stc_rtc_time
{
uint8_t u8Second; //时间:秒
uint8_t u8Minute; //时间:分
uint8_t u8Hour; //时间:时
uint8_t u8DayOfWeek; //时间:周
uint8_t u8Day; //时间:日
uint8_t u8Month; //时间:月
uint8_t u8Year; //时间:年
} stc_rtc_time_t;
/**
******************************************************************************
** \brief 初始化RTC的结构体
*****************************************************************************/
typedef struct
{
en_rtc_ampm_t rtcAmpm; //小时的时制
stc_rtc_cyccfg_t rtcPrdsel; //确定PRDS或者PRDX所设定的周期中断时间间隔类型
en_rtc_cksel_t rtcClksrc; //实时时钟的时钟源
en_rtc_compen_t rtcCompen; //时钟误差补偿使能与禁止
uint16_t rtcCompValue; //使能补偿的情况下,补偿值取值范围为:0-255
stc_rtc_time_t rtcTime; //要写入时间寄存器的时间
}stc_rtc_initstruct_t;
/******************************************************************************
Global function prototypes (definition in C source)
*******************************************************************************/
//RTC计数器的使能或停止
extern void Rtc_Cmd(boolean_t NewState);
//RTC计数器启动等待函数
extern void Rtc_StartWait(void);
//RTC的1Hz输出的使能或停止
extern void Rtc_Hz1Cmd(en_rtc_hz1sel_t pricision, boolean_t NewState);
//设置周期中断的类型(PRDSEL)及其所选类型的时间(PRDS或PRDX)
extern en_result_t Rtc_SetCyc(stc_rtc_cyccfg_t* pstCyc);
//RTC闹钟中断的使能或停止
extern void Rtc_AlmIeCmd(boolean_t NewState);
//RTC闹钟的使能或停止
extern void Rtc_AlmEnCmd(boolean_t NewState);
//获取RTC闹钟中断状态位
extern boolean_t Rtc_GetAlmfItStatus(void);
//清除RTC闹钟中断状态位
extern void Rtc_ClearAlmfItStatus(void);
//清除RTC周期中断状态位
extern void Rtc_ClearPrdfItStatus(void);
//获取RTC周期中断状态位
extern boolean_t Rtc_GetPridItStatus(void);
//配置RTC的误差补偿寄存器
extern en_result_t Rtc_CompCfg(uint16_t CompVlue, en_rtc_compen_t NewStatus);
//RTC根据日期计算周数
extern en_result_t Check_BCD_Format(uint8_t u8data,uint8_t u8limit_min, uint8_t u8limit_max);
//RTC获取时间函数
extern en_result_t Rtc_ReadDateTime(stc_rtc_time_t* time);
//向RTC时间寄存器写入时间
extern en_result_t Rtc_SetTime(stc_rtc_time_t* time);
//RTC闹钟中断时间获取
extern void Rtc_GetAlarmTime(stc_rtc_alarmtime_t* pstcAlarmTime);
//RTC闹钟设置
extern en_result_t Rtc_SetAlarmTime(stc_rtc_alarmtime_t* pstcAlarmTime);
//初始化RTC
extern void Rtc_Init(stc_rtc_initstruct_t* Rtc_InitStruct);
#endif /* __RTC_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+212
View File
@@ -0,0 +1,212 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED , ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file spi.h
**
** Headerfile for SPI functions
**
**
** History:
** - 2017-05-17 1.0 Devi First Version
**
*****************************************************************************/
#ifndef __SPI_H__
#define __SPI_H__
/******************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
//@{
/******************************************************************************
* Global type definitions
*****************************************************************************/
/**
******************************************************************************
** \brief SPI 功能通道选择设置
******************************************************************************/
/**
******************************************************************************
** \brief SPI 功能使能设置
******************************************************************************/
typedef enum en_spi_en
{
SpiMskEnable = 0x4u, ///< SPI模块使能
SpiMskDisable = 0u, ///< SPI模块禁止
}en_spi_en_t;
/**
******************************************************************************
** \brief SPI 模式配置
******************************************************************************/
typedef enum en_spi_mode
{
SpiMskMaster = 0x10u, ///<主机
SpiMskSlave = 0x00u, ///<从机
}en_spi_mode_t;
/**
******************************************************************************
** \brief SPI 时钟极性设置
******************************************************************************/
typedef enum en_spi_cpol
{
SpiMskcpollow = 0u, ///<极性为低
SpiMskcpolhigh = 0x08u, ///<极性为高
}en_spi_cpol_t;
/**
******************************************************************************
** \brief SPI 时钟相位设置
******************************************************************************/
typedef enum en_spi_cpha
{
SpiMskCphafirst = 0u, ///<第一边沿采样
SpiMskCphasecond = 0x4u, ///<第二边沿采样
}en_spi_cpha_t;
/**
******************************************************************************
** \brief SPI 时钟分频配置
*****************************************************************************/
typedef enum en_spi_clk_div
{
SpiClkMskDiv2 = 0x00u, ///<PCLK 2分频
SpiClkMskDiv4 = 0x01u, ///<PCLK 4分频
SpiClkMskDiv8 = 0x02u, ///<PCLK 8分频
SpiClkMskDiv16 = 0x03u, ///<PCLK 16分频
SpiClkMskDiv32 = 0x80u, ///<PCLK 32分频
SpiClkMskDiv64 = 0x81u, ///<PCLK 64分频
SpiClkMskDiv128 = 0x82u, ///<PCLK 128分频
}en_spi_clk_div_t;
/**
******************************************************************************
** \brief SPI 片选脚电平选择
*****************************************************************************/
typedef enum en_spi_cspin
{
SpiCsLow = 0u, ///<片选低电平
SpiCsHigh = 1u, ///<片选高电平
}en_spi_cspin_t;
/**
******************************************************************************
** \brief SPI 状态
*****************************************************************************/
typedef enum en_spi_status
{
SpiIf = 0x80u, ///<传输结束中断标志
SpiSserr = 0x20u, ///<从机模式错误标志
SpiMdf = 0x10u, ///<主机模式错误标志
SpiBusy = 0x08u, ///<SPI总线忙标志
SpiTxe = 0x04u, ///<发送缓冲器器空标志
SpiRxne = 0x02u, ///<接受缓冲器非空标志
}en_spi_status_t;
/**
******************************************************************************
** \brief SPI 功能开启函数
*****************************************************************************/
typedef enum en_spi_func
{
SpiMskRxNeIe = 0x40u, ///<接收缓冲器非空中断使能
SpiMskTxEIe = 0x20u, ///<发送缓冲器空中断使能
SpiMskDmaTxEn = 0x10u, ///<DMA硬件访问发送使能
SpiMskDmaRxEn = 0x08u, ///<DMA硬件访问接收使能
}en_spi_func_t;
/**
******************************************************************************
** \brief SPI 总体配置结构体
*****************************************************************************/
typedef struct stc_spi_cfg
{
en_spi_mode_t enSpiMode; ///< 主从模式选择
en_spi_clk_div_t enPclkDiv; ///< PCLK分频系数(波特率分频)
en_spi_cpol_t enCPOL; ///< 时钟极性选择
en_spi_cpha_t enCPHA; ///< 时钟相位选择
}stc_spi_cfg_t;
//SPI 状态获取
boolean_t Spi_GetStatus(M0P_SPI_TypeDef* SPIx,en_spi_status_t enStatus);
///<SPI 中断使能/禁止
en_result_t Spi_IrqEnable(M0P_SPI_TypeDef* SPIx);
en_result_t Spi_IrqDisable(M0P_SPI_TypeDef* SPIx);
//SPI 清除中断标记
en_result_t Spi_ClearStatus(M0P_SPI_TypeDef* SPIx);
//SPI初始化函数
en_result_t Spi_Init(M0P_SPI_TypeDef* SPIx,stc_spi_cfg_t* pstcSpiCfg);
//SPI 功能使能禁止函数
en_result_t Spi_FuncEnable(M0P_SPI_TypeDef* SPIx, en_spi_func_t enFunc);
en_result_t Spi_FuncDisable(M0P_SPI_TypeDef* SPIx, en_spi_func_t enFunc);
//SPI关闭函数
en_result_t Spi_DeInit(M0P_SPI_TypeDef* SPIx);
//SPI 配置主发送的电平
void Spi_SetCS(M0P_SPI_TypeDef* SPIx,boolean_t bFlag);
//SPI 数据字节数据收发
uint8_t Spi_RWByte(M0P_SPI_TypeDef* SPIx, uint8_t u8Data);
//SPI 数据发送
en_result_t Spi_SendData(M0P_SPI_TypeDef* SPIx, uint8_t u8Data);
void Spi_Slave_DummyWriteData(M0P_SPI_TypeDef* SPIx, uint8_t u8Data);
en_result_t Spi_SendBuf(M0P_SPI_TypeDef* SPIx, uint8_t* pu8Buf, uint32_t u32Len);
//SPI 数据接收
uint8_t Spi_ReceiveData(M0P_SPI_TypeDef* SPIx);
en_result_t Spi_ReceiveBuf(M0P_SPI_TypeDef* SPIx, uint8_t* pu8Buf, uint32_t u32Len);
//@} // Spi Group
#ifdef __cplusplus
}
#endif
#endif /* __SPI_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+456
View File
@@ -0,0 +1,456 @@
/*******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file sysctrl.h
**
** Headerfile for SYSCTRL functions
** @link SYSCTRL Group Some description @endlink
**
** History:
** - 2018-04-15 Lux First Version
**
******************************************************************************/
#ifndef __SYSCTRL_H__
#define __SYSCTRL_H__
/*******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup SysCtrlGroup (SYSCTRL)
**
******************************************************************************/
//@{
/**
*******************************************************************************
** function prototypes.
******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
*******************************************************************************
** \brief 系统时钟输入源类型定义
** \note
******************************************************************************/
typedef enum en_sysctrl_clk_source
{
SysctrlClkRCH = 0u, ///< 内部高速时钟
SysctrlClkXTH = 1u, ///< 外部高速时钟
SysctrlClkRCL = 2u, ///< 内部低速时钟
SysctrlClkXTL = 3u, ///< 外部低速时钟
SysctrlClkPLL = 4u, ///< PLL时钟
}en_sysctrl_clk_source_t;
/**
*******************************************************************************
** \brief RCH频率值枚举类型定义
******************************************************************************/
typedef enum en_sysctrl_rch_freq
{
SysctrlRchFreq4MHz = 4u, ///< 4MHz
SysctrlRchFreq8MHz = 3u, ///< 8MHz
SysctrlRchFreq16MHz = 2u, ///< 16MHz
SysctrlRchFreq22_12MHz = 1u, ///< 22.12MHz
SysctrlRchFreq24MHz = 0u, ///< 24MHz
}en_sysctrl_rch_freq_t;
/**
*******************************************************************************
** \brief XTAL驱动能力类型定义
******************************************************************************/
typedef enum en_sysctrl_xtal_driver
{
SysctrlXtalDriver0 = 0u, ///< 最弱驱动能力
SysctrlXtalDriver1 = 1u, ///< 弱驱动能力
SysctrlXtalDriver2 = 2u, ///< 一般驱动能力
SysctrlXtalDriver3 = 3u, ///< 最强驱动能力
}en_sysctrl_xtal_driver_t;
/**
*******************************************************************************
** \brief XTH频率值范围选择类型定义
******************************************************************************/
typedef enum en_sysctrl_xth_freq
{
SysctrlXthFreq4_8MHz = 0u, ///< 4~8MHz
SysctrlXthFreq8_16MHz = 1u, ///< 8~16MHz
SysctrlXthFreq16_24MHz = 2u, ///< 16~24MHz
SysctrlXthFreq24_32MHz = 3u, ///< 24~32MHz
}en_sysctrl_xth_freq_t;
/**
*******************************************************************************
** \brief XTH时钟稳定周期数类型定义
******************************************************************************/
typedef enum en_sysctrl_xth_cycle
{
SysctrlXthStableCycle256 = 0u, ///< 256 个周期数
SysctrlXthStableCycle1024 = 1u, ///< 1024 个周期数
SysctrlXthStableCycle4096 = 2u, ///< 4096 个周期数
SysctrlXthStableCycle16384 = 3u, ///< 16384 个周期数
}en_sysctrl_xth_cycle_t;
/**
*******************************************************************************
** \brief RCL频率值枚举类型定义
******************************************************************************/
typedef enum en_sysctrl_rcl_freq
{
SysctrlRclFreq32768 = 0x11u, ///< 32.768KHz
SysctrlRclFreq38400 = 0x10u, ///< 38.4KHz
}en_sysctrl_rcl_freq_t;
/**
*******************************************************************************
** \brief RCL时钟稳定周期数类型定义
******************************************************************************/
typedef enum en_sysctrl_rcl_cycle
{
SysctrlRclStableCycle4 = 0u, ///< 4 个周期数
SysctrlRclStableCycle16 = 1u, ///< 16 个周期数
SysctrlRclStableCycle64 = 2u, ///< 64 个周期数
SysctrlRclStableCycle256 = 3u, ///< 256 个周期数
}en_sysctrl_rcl_cycle_t;
/**
*******************************************************************************
** \brief XTL时钟稳定周期数类型定义
******************************************************************************/
typedef enum en_sysctrl_xtl_cycle
{
SysctrlXtlStableCycle256 = 0u, ///< 256 个周期数
SysctrlXtlStableCycle1024 = 1u, ///< 1024 个周期数
SysctrlXtlStableCycle4096 = 2u, ///< 4096 个周期数
SysctrlXtlStableCycle16384 = 3u, ///< 16384 个周期数
}en_sysctrl_xtl_cycle_t;
/**
*******************************************************************************
** \brief XTL晶体振幅枚举类型定义
******************************************************************************/
typedef enum en_sysctrl_xtl_amp
{
SysctrlXtlAmp0 = 0u, ///< 最小振幅
SysctrlXtlAmp1 = 1u, ///< 小振幅
SysctrlXtlAmp2 = 2u, ///< 一般振幅
SysctrlXtlAmp3 = 3u, ///< 最大振幅
}en_sysctrl_xtl_amp_t;
/**
*******************************************************************************
** \brief PLL时钟稳定周期数类型定义
******************************************************************************/
typedef enum en_sysctrl_pll_cycle
{
SysctrlPllStableCycle128 = 0u, ///< 128个周期数
SysctrlPllStableCycle256 = 1u, ///< 256个周期数
SysctrlPllStableCycle512 = 2u, ///< 512个周期数
SysctrlPllStableCycle1024 = 3u, ///< 1024个周期数
SysctrlPllStableCycle2048 = 4u, ///< 2048个周期数
SysctrlPllStableCycle4096 = 5u, ///< 4096个周期数
SysctrlPllStableCycle8192 = 6u, ///< 8192个周期数
SysctrlPllStableCycle16384 = 7u, ///< 16384个周期数
}en_sysctrl_pll_cycle_t;
/**
*******************************************************************************
** \brief PLL输入频率范围类型定义
******************************************************************************/
typedef enum en_sysctrl_pll_infreq
{
SysctrlPllInFreq4_6MHz = 0u, ///< 4~16MHz
SysctrlPllInFreq6_12MHz = 1u, ///< 6~12MHz
SysctrlPllInFreq12_20MHz = 2u, ///< 12~20MHz
SysctrlPllInFreq20_24MHz = 3u, ///< 20~24MHz
}en_sysctrl_pll_infreq_t;
/**
*******************************************************************************
** \brief PLL输出频率范围类型定义
******************************************************************************/
typedef enum en_sysctrl_pll_outfreq
{
SysctrlPllOutFreq8_12MHz = 0u, ///< 8~12MHz
SysctrlPllOutFreq12_18MHz = 1u, ///< 12~18MHz
SysctrlPllOutFreq18_24MHz = 2u, ///< 18~24MHz
SysctrlPllOutFreq24_36MHz = 3u, ///< 24~36MHz
SysctrlPllOutFreq36_48MHz = 4u, ///< 36~48MHz
}en_sysctrl_pll_outfreq_t;
/**
*******************************************************************************
** \brief PLL输入时钟源类型定义
******************************************************************************/
typedef enum en_sysctrl_pll_clksource
{
SysctrlPllXthXtal = 0u, ///< XTH晶振输入的时钟
SysctrlPllXthIn = 2u, ///< XTH从端口输入的时钟
SysctrlPllRch = 3u, ///< RCH时钟
}en_sysctrl_pll_clksource_t;
/**
*******************************************************************************
** \brief PLL输入时钟源类型定义
******************************************************************************/
typedef enum en_sysctrl_pll_mul
{
SysctrlPllMul2 = 2u, ///< 2倍频
SysctrlPllMul3 = 3u, ///< 3倍频
SysctrlPllMul4 = 4u, ///< 4倍频
SysctrlPllMul5 = 5u, ///< 5倍频
SysctrlPllMul6 = 6u, ///< 6倍频
SysctrlPllMul7 = 7u, ///< 7倍频
SysctrlPllMul8 = 8u, ///< 8倍频
SysctrlPllMul9 = 9u, ///< 9倍频
SysctrlPllMul10 = 10u, ///< 10倍频
SysctrlPllMul11 = 11u, ///< 11倍频
SysctrlPllMul12 = 12u, ///< 12倍频
}en_sysctrl_pll_mul_t;
/**
*******************************************************************************
** \brief HCLK时钟分频系数类型定义
******************************************************************************/
typedef enum en_sysctrl_hclk_div
{
SysctrlHclkDiv1 = 0u, ///< SystemClk
SysctrlHclkDiv2 = 1u, ///< SystemClk/2
SysctrlHclkDiv4 = 2u, ///< SystemClk/4
SysctrlHclkDiv8 = 3u, ///< SystemClk/8
SysctrlHclkDiv16 = 4u, ///< SystemClk/16
SysctrlHclkDiv32 = 5u, ///< SystemClk/32
SysctrlHclkDiv64 = 6u, ///< SystemClk/64
SysctrlHclkDiv128 = 7u, ///< SystemClk/128
}en_sysctrl_hclk_div_t;
/**
*******************************************************************************
** \brief PCLK分频系数
******************************************************************************/
typedef enum en_sysctrl_pclk_div
{
SysctrlPclkDiv1 = 0u, ///< HCLK
SysctrlPclkDiv2 = 1u, ///< HCLK/2
SysctrlPclkDiv4 = 2u, ///< HCLK/4
SysctrlPclkDiv8 = 3u, ///< HCLK/8
}en_sysctrl_pclk_div_t;
/**
*******************************************************************************
** \brief RTC高速时钟补偿时钟频率数据类型定义
******************************************************************************/
typedef enum en_sysctrl_rtc_adjust
{
SysctrlRTC4MHz = 0u, ///< 4MHz
SysctrlRTC6MHz = 1u, ///< 6MHz
SysctrlRTC8MHz = 2u, ///< 8MHz
SysctrlRTC12MHz = 3u, ///< 12MHz
SysctrlRTC16MHz = 4u, ///< 16MHz
SysctrlRTC20MHz = 5u, ///< 20MHz
SysctrlRTC24MHz = 6u, ///< 24MHz
SysctrlRTC32MHz = 7u, ///< 32MHz
}en_sysctrl_rtc_adjust_t;
/**
*******************************************************************************
** \brief 系统控制模块其他功能数据类型定义
******************************************************************************/
typedef enum en_sysctrl_func
{
SysctrlEXTHEn = 1u, ///< 使能外部高速时钟从输入引脚输入
SysctrlEXTLEn = 2u, ///< 使能外部低速速时钟从输入引脚输入
SysctrlXTLAlwaysOnEn = 3u, ///< 使能后XTL_EN只可置位
SysctrlClkFuncRTCLpmEn = 5u, ///< 使能RTC低功耗模式
SysctrlCMLockUpEn = 6u, ///< 使能后CPU执行无效指令会复位MCU
SysctrlSWDUseIOEn = 8u, ///< SWD端口设为IO功能
}en_sysctrl_func_t;
/**
*******************************************************************************
** \brief 外设时钟门控开关类型枚举
******************************************************************************/
typedef enum en_sysctrl_peripheral_gate
{
SysctrlPeripheralUart0 = 0u, ///< 串口0
SysctrlPeripheralUart1 = 1u, ///< 串口1
SysctrlPeripheralLpUart0 = 2u, ///< 低功耗串口0
SysctrlPeripheralLpUart1 = 3u, ///< 低功耗串口1
SysctrlPeripheralI2c0 = 4u, ///< I2C0
SysctrlPeripheralI2c1 = 5u, ///< I2C1
SysctrlPeripheralSpi0 = 6u, ///< SPI0
SysctrlPeripheralSpi1 = 7u, ///< SPI1
SysctrlPeripheralBaseTim = 8u, ///< 基础定时器TIM0/1/2
SysctrlPeripheralLpTim0 = 9u, ///< 低功耗定时器0
SysctrlPeripheralAdvTim = 10u, ///< 高级定时器TIM4/5/6
SysctrlPeripheralTim3 = 11u, ///< 定时器3
SysctrlPeripheralOpa = 13u, ///< OPA
SysctrlPeripheralPca = 14u, ///< 可编程计数阵列
SysctrlPeripheralWdt = 15u, ///< 看门狗
SysctrlPeripheralAdcBgr = 16u, ///< ADC&BGR
SysctrlPeripheralVcLvd = 17u, ///< VC和LVD
SysctrlPeripheralRng = 18u, ///< RNG
SysctrlPeripheralPcnt = 19u, ///< PCNT
SysctrlPeripheralRtc = 20u, ///< RTC
SysctrlPeripheralTrim = 21u, ///< 时钟校准
SysctrlPeripheralLcd = 22u, ///< LCD
SysctrlPeripheralTick = 24u, ///< 系统定时器
SysctrlPeripheralSwd = 25u, ///< SWD
SysctrlPeripheralCrc = 26u, ///< CRC
SysctrlPeripheralAes = 27u, ///< AES
SysctrlPeripheralGpio = 28u, ///< GPIO
SysctrlPeripheralDma = 29u, ///< DMA
SysctrlPeripheralFlash = 31u, ///< Flash
SysctrlPeripheralDac = 35u, ///< DAC
SysctrlPeripheralLpTim1 = 36u, ///< 低功耗定时器1
SysctrlPeripheralUart2 = 40u, ///< UART2
SysctrlPeripheralUart3 = 41u, ///< UART3
}en_sysctrl_peripheral_gate_t;
/**
*******************************************************************************
** \brief 时钟初始化配置结构体定义
******************************************************************************/
typedef struct
{
en_sysctrl_clk_source_t enClkSrc; ///< 时钟源选择
en_sysctrl_hclk_div_t enHClkDiv; ///< HCLK分频系数
en_sysctrl_pclk_div_t enPClkDiv; ///< PCLK分频系数
}stc_sysctrl_clk_cfg_t;
/**
*******************************************************************************
** \brief 时钟初始化配置结构体定义
******************************************************************************/
typedef struct
{
en_sysctrl_pll_infreq_t enInFreq; ///< PLL输入时钟频率范围选择
en_sysctrl_pll_outfreq_t enOutFreq; ///< PLL输出时钟频率范围选择
en_sysctrl_pll_clksource_t enPllClkSrc; ///< PLL输入时钟源选择
en_sysctrl_pll_mul_t enPllMul; ///< PLL倍频系数选择
}stc_sysctrl_pll_cfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///< 系统时钟初始化API:用于上电后,系统工作之前对主频及外设时钟进行初始化;
///< 注意1:使用该初始化函数前需要根据系统,必须优先设置目标内部时钟源的TRIM值或外部时钟源的频率范围,
///< 注意2:XTH、XTL的频率范围设定,需要根据外部晶振决定,
///< 注意3:本驱动默认宏定义:SYSTEM_XTH=32MHz,SYSTEM_XTL=32768Hz,如使用其它外部晶振,必须修改这两个宏定义的值。
en_result_t Sysctrl_ClkInit(stc_sysctrl_clk_cfg_t *pstcCfg);
///< 系统时钟去初始化API:恢复为上电默认状态->PCLK=HCLK=SystemClk=RCH4MHz
en_result_t Sysctrl_ClkDeInit(void);
///< 系统时钟模块的基本功能设置
///< 注意:使能需要使用的时钟源之前,必须优先设置目标内部时钟源的TRIM值或外部时钟源的频率范围
en_result_t Sysctrl_ClkSourceEnable(en_sysctrl_clk_source_t enSource, boolean_t bFlag);
///<外部晶振驱动配置:系统初始化Sysctrl_ClkInit()之后,可根据需要配置外部晶振的驱动能力,时钟初始化Sysctrl_ClkInit()默认为最大值;
en_result_t Sysctrl_XTHDriverCfg(en_sysctrl_xtal_driver_t enDriver);
en_result_t Sysctrl_XTLDriverCfg(en_sysctrl_xtl_amp_t enAmp, en_sysctrl_xtal_driver_t enDriver);
///<时钟稳定周期设置:系统初始化Sysctrl_ClkInit()之后,可根据需要配置时钟开启后的稳定之间,默认为最大值;
en_result_t Sysctrl_SetXTHStableTime(en_sysctrl_xth_cycle_t enCycle);
en_result_t Sysctrl_SetRCLStableTime(en_sysctrl_rcl_cycle_t enCycle);
en_result_t Sysctrl_SetXTLStableTime(en_sysctrl_xtl_cycle_t enCycle);
en_result_t Sysctrl_SetPLLStableTime(en_sysctrl_pll_cycle_t enCycle);
///<系统时钟源切换并更新系统时钟:如果需要在系统时钟初始化Sysctrl_ClkInit()之后切换主频时钟源,则使用该函数;
///< 时钟切换前后,必须根据目标频率值设置Flash读等待周期,可配置插入周期为0、1、2,
///< 注意!!!:当HCLK大于24MHz时,FLASH等待周期插入必须至少为1,否则程序运行可能产生未知错误
en_result_t Sysctrl_SysClkSwitch(en_sysctrl_clk_source_t enSource);
///< 时钟源频率设定:根据系统情况,单独设置不同时钟源的频率值;
///< 时钟频率设置前,必须根据目标频率值设置Flash读等待周期,可配置插入周期为0、1、2,
///< 其中XTL的时钟由外部晶振决定,无需设置。
en_result_t Sysctrl_SetRCHTrim(en_sysctrl_rch_freq_t enRCHFreq);
en_result_t Sysctrl_SetRCLTrim(en_sysctrl_rcl_freq_t enRCLFreq);
en_result_t Sysctrl_SetXTHFreq(en_sysctrl_xth_freq_t enXTHFreq);
en_result_t Sysctrl_SetPLLFreq(stc_sysctrl_pll_cfg_t *pstcPLLCfg);
///< 时钟分频设置:根据系统情况,单独设置HCLK、PCLK的分配值;
en_result_t Sysctrl_SetHCLKDiv(en_sysctrl_hclk_div_t enHCLKDiv);
en_result_t Sysctrl_SetPCLKDiv(en_sysctrl_pclk_div_t enPCLKDiv);
///< 时钟频率获取:根据系统需要,获取当前HCLK及PCLK的频率值
uint32_t Sysctrl_GetHClkFreq(void);
uint32_t Sysctrl_GetPClkFreq(void);
///< 外设门控开关/状态获取:用于控制外设模块的使能,使用该模块的功能之前,必须使能该模块的门控时钟;
en_result_t Sysctrl_SetPeripheralGate(en_sysctrl_peripheral_gate_t enPeripheral, boolean_t bFlag);
boolean_t Sysctrl_GetPeripheralGate(en_sysctrl_peripheral_gate_t enPeripheral);
///< 系统功能配置:用于设置其他系统相关特殊功能;
en_result_t Sysctrl_SetFunc(en_sysctrl_func_t enFunc, boolean_t bFlag);
///< RTC高速时钟补偿:用于设置RTC高速时钟下的频率补偿
en_result_t Sysctrl_SetRTCAdjustClkFreq(en_sysctrl_rtc_adjust_t enRtcAdj);
//@} // Sysctrl Group
#ifdef __cplusplus
#endif
#endif /* __SYSCTRL_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+781
View File
@@ -0,0 +1,781 @@
/*******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file timer3.h
**
** 基本定时器数据结构及API声明
** @link Timer3 Group Some description @endlink
**
** History:
** - 2019-04-18 Husj First Version
**
*****************************************************************************/
#ifndef __TIMER3_H__
#define __TIMER3_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup Tim3Group Timer3 (TIM3)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief Timer3 通道定义
*****************************************************************************/
typedef enum en_tim3_channel
{
Tim3CH0 = 0u, ///< Timer3通道0
Tim3CH1 = 1u, ///< Timer3通道1
Tim3CH2 = 2u, ///< Timer3通道2
}en_tim3_channel_t;
/**
******************************************************************************
** \brief 工作模式选择数据类型重定义 (MODE)(模式0/1/23)
*****************************************************************************/
typedef enum en_tim3_work_mode
{
Tim3WorkMode0 = 0u, ///< 定时器模式
Tim3WorkMode1 = 1u, ///< PWC模式
Tim3WorkMode2 = 2u, ///< 锯齿波模式
Tim3WorkMode3 = 3u, ///< 三角波模式
}en_tim3_work_mode_t;
/**
******************************************************************************
** \brief 极性控制数据类型重定义 (GATE_P)(模式0)
*****************************************************************************/
typedef enum en_tim3_m0cr_gatep
{
Tim3GatePositive = 0u, ///< 高电平有效
Tim3GateOpposite = 1u, ///< 低电平有效
}en_tim3_m0cr_gatep_t;
/**
******************************************************************************
** \brief TIM3 预除频选择 (PRS)(模式0/1/23)
*****************************************************************************/
typedef enum en_tim3_cr_timclkdiv
{
Tim3PCLKDiv1 = 0u, ///< Div 1
Tim3PCLKDiv2 = 1u, ///< Div 2
Tim3PCLKDiv4 = 2u, ///< Div 4
Tim3PCLKDiv8 = 3u, ///< Div 8
Tim3PCLKDiv16 = 4u, ///< Div 16
Tim3PCLKDiv32 = 5u, ///< Div 32
Tim3PCLKDiv64 = 6u, ///< Div 64
Tim3PCLKDiv256 = 7u, ///< Div 256
}en_tim3_cr_timclkdiv_t;
/**
******************************************************************************
** \brief 计数/定时器功能选择数据类型重定义 (CT)(模式0/1/23)
*****************************************************************************/
typedef enum en_tim3_cr_ct
{
Tim3Timer = 0u, ///< 定时器功能,计数时钟为内部PCLK
Tim3Counter = 1u, ///< 计数器功能,计数时钟为外部ETR
}en_tim3_cr_ct_t;
/**
******************************************************************************
** \brief 定时器工作模式数据类型重定义 (MD)(模式0)
*****************************************************************************/
typedef enum en_tim3_m0cr_md
{
Tim332bitFreeMode = 0u, ///< 32位计数器/定时器
Tim316bitArrMode = 1u, ///< 自动重装载16位计数器/定时器
}en_tim3_m0cr_md_t;
/**
******************************************************************************
** \brief TIM3中断类型数据类型重定义(模式0/1/23)
*****************************************************************************/
typedef enum en_tim3_irq_type
{
Tim3UevIrq = 0u, ///< 溢出/事件更新中断
Tim3CA0Irq = 2u, ///< CH0A捕获/比较中断(仅模式1/23存在)
Tim3CA1Irq = 3u, ///< CH1A捕获/比较中断(仅模式23存在)
Tim3CA2Irq = 4u, ///< CH2A捕获/比较中断(仅模式23存在)
Tim3CB0Irq = 5u, ///< CH0B捕获/比较中断(仅模式23存在)
Tim3CB1Irq = 6u, ///< CH1B捕获/比较中断(仅模式23存在)
Tim3CB2Irq = 7u, ///< CH2B捕获/比较中断(仅模式23存在)
Tim3CA0E = 8u, ///< CH0A捕获数据丢失标志(仅模式23存在)(不是中断)
Tim3CA1E = 9u, ///< CH1A捕获数据丢失标志(仅模式23存在)(不是中断)
Tim3CA2E = 10u, ///< CH2A捕获数据丢失标志(仅模式23存在)(不是中断)
Tim3CB0E = 11u, ///< CH0B捕获数据丢失标志(仅模式23存在)(不是中断)
Tim3CB1E = 12u, ///< CH1B捕获数据丢失标志(仅模式23存在)(不是中断)
Tim3CB2E = 13u, ///< CH2B捕获数据丢失标志(仅模式23存在)(不是中断)
Tim3BkIrq = 14u, ///< 刹车中断(仅模式23存在)
Tim3TrigIrq = 15u, ///< 触发中断(仅模式23存在)
}en_tim3_irq_type_t;
/**
******************************************************************************
** \brief 测量开始结束数据类型重定义 (Edg1stEdg2nd)(模式1)
*****************************************************************************/
typedef enum en_tim3_m1cr_Edge
{
Tim3PwcRiseToRise = 0u, ///< 上升沿到上升沿(周期)
Tim3PwcFallToRise = 1u, ///< 下降沿到上升沿(低电平)
Tim3PwcRiseToFall = 2u, ///< 上升沿到下降沿(高电平)
Tim3PwcFallToFall = 3u, ///< 下降沿到下降沿(周期)
}en_tim3_m1cr_Edge_t;
/**
******************************************************************************
** \brief PWC测量测试模式选择数据类型重定义 (Oneshot)(模式1)
*****************************************************************************/
typedef enum en_tim3_m1cr_oneshot
{
Tim3PwcCycleDetect = 0u, ///< PWC循环测量
Tim3PwcOneShotDetect = 1u, ///< PWC单次测量
}en_tim3_m1cr_oneshot_t;
/**
******************************************************************************
** \brief PWC IA0选择数据类型重定义 (IA0S)(模式1)
*****************************************************************************/
typedef enum en_tim3_m1_mscr_ia0s
{
Tim3IA0Input = 0u, ///< IAO输入
Tim3XORInput = 1u, ///< IA0 ETR GATE XOR(TIM0/1/2)/IA0 IA1 IA2 XOR(TIM3)
}en_tim3_m1_mscr_ia0s_t;
/**
******************************************************************************
** \brief PWC IB0选择数据类型重定义 (IA0S)(模式1)
*****************************************************************************/
typedef enum en_tim3_m1_mscr_ib0s
{
Tim3IB0Input = 0u, ///< IBO输入
Tim3TsInput = 1u, ///< 内部触发TS选择信号
}en_tim3_m1_mscr_ib0s_t;
/**
******************************************************************************
** \brief 输出极性、输入相位 数据类型重定义 (CCPA0/CCPB0/ETP/BKP)(模式1/23)
*****************************************************************************/
typedef enum en_tim3_port_polarity
{
Tim3PortPositive = 0u, ///< 正常输入输出
Tim3PortOpposite = 1u, ///< 反向输入输出
}en_tim3_port_polarity_t;
/**
******************************************************************************
** \brief 滤波选择数据类型重定义 (FLTET/FLTA0/FLAB0)(模式1/23)
*****************************************************************************/
typedef enum en_tim3_flt
{
Tim3FltNone = 0u, ///< 无滤波
Tim3FltPCLKCnt3 = 4u, ///< PCLK 3个连续有效
Tim3FltPCLKDiv4Cnt3 = 5u, ///< PCLK/4 3个连续有效
Tim3FltPCLKDiv16Cnt3 = 6u, ///< PCLK/16 3个连续有效
Tim3FltPCLKDiv64Cnt3 = 7u, ///< PCLK/64 3个连续有效
}en_tim3_flt_t;
/**
******************************************************************************
** \brief 通道比较控制 数据类型重定义 (OCMA/OCMB)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_fltr_ocm
{
Tim3ForceLow = 0u, ///< 强制为0
Tim3ForceHigh = 1u, ///< 强制为1
Tim3CMPForceLow = 2u, ///< 比较匹配时强制为0
Tim3CMPForceHigh = 3u, ///< 比较匹配时强制为1
Tim3CMPInverse = 4u, ///< 比较匹配时翻转电平
Tim3CMPOnePrdHigh = 5u, ///< 比较匹配时输出一个计数周期的高电平
Tim3PWMMode1 = 6u, ///< 通道控制为PWM mode 1
Tim3PWMMode2 = 7u, ///< 通道控制为PWM mode 2
}en_tim3_m23_fltr_ocm_t;
/**
******************************************************************************
** \brief 主从模式TS数据类型重定义 (TS)(模式1/23)
*****************************************************************************/
typedef enum en_tim3_mscr_ts
{
Tim3Ts0ETR = 0u, ///< ETR外部输入滤波后的相位选择信号
Tim3Ts1TIM0TRGO = 1u, ///< Timer0的TRGO输出信号
Tim3Ts2TIM1TRGO = 2u, ///< Timer1的TRGO输出信号
Tim3Ts3TIM2TRGO = 3u, ///< Timer2的TRGO输出信号
Tim3Ts4TIM3TRGO = 4u, ///< Timer3的TRGO输出信号
//Tim3Ts5IA0ED = 5u, ///< 无效
Tim3Ts6IAFP = 6u, ///< CH0A 外部输输入滤波后的相位选择信号
Tim3Ts7IBFP = 7u, ///< CH0B 外部输输入滤波后的相位选择信
}en_tim3_mscr_ts_t;
/**
******************************************************************************
** \brief PWM输出模式选择数据类型重定义 (COMP)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23cr_comp
{
Tim3IndependentPWM = 0u, ///< 独立PWM输出
Tim3ComplementaryPWM = 1u, ///< 互补PWM输出
}en_tim3_m23cr_comp_t;
/**
******************************************************************************
** \brief 计数方向选择数据类型重定义 (DIR)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23cr_dir
{
Tim3CntUp = 0u, ///< 向上计数
Tim3CntDown = 1u, ///< 向下计数
}en_tim3_m23cr_dir_t;
/**
******************************************************************************
** \brief 计数方向选择数据类型重定义 (PWM2S)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23cr_pwm2s
{
Tim3DoublePointCmp = 0u, ///< 双点比较使能,使用CCRA,CCRB比较控制OCREFA输出
Tim3SinglePointCmp = 1u, ///< 单点比较使能,使用CCRA比较控制OCREFA输出
}en_tim3_m23cr_pwm2s_t;
/**
******************************************************************************
** \brief GATE在PWM互补模式下捕获或比较功能 选择数据类型重定义 (CSG)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23cr_csg
{
Tim3PWMCompGateCmpOut = 0u, ///< 在PWM互补模式下,Gate作为比较输出
Tim3PWMCompGateCapIn = 1u, ///< 在PWM互补模式下,Gate作为捕获输入
}en_tim3_m23cr_csg_t;
/**
******************************************************************************
** \brief 比较捕获寄存器 数据类型重定义 (CCR0A,CCR0B)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_ccrx
{
Tim3CCR0A = 0u, ///< CCR0A比较捕获寄存器
Tim3CCR0B = 1u, ///< CCR0B比较捕获寄存器
Tim3CCR1A = 2u, ///< CCR1A比较捕获寄存器
Tim3CCR1B = 3u, ///< CCR1B比较捕获寄存器
Tim3CCR2A = 4u, ///< CCR2A比较捕获寄存器
Tim3CCR2B = 5u, ///< CCR2B比较捕获寄存器
}en_tim3_m23_ccrx_t;
/**
******************************************************************************
** \brief OCREF清除源 选择数据类型重定义 (OCCS)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23ce_occs
{
Tim3OC_Ref_Clr = 0u, ///< 来自VC的OC_Ref_Clr
Tim3ETRf = 1u, ///< 外部ETRf
}en_tim3_m23ce_occs_t;
/**
******************************************************************************
** \brief 比较匹配中断模式 选择数据类型重定义 (CIS/CISB)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_cisa_cisb
{
Tim3CmpIntNone = 0u, ///< 无比较匹配中断
Tim3CmpIntRise = 1u, ///< 比较匹配上升沿中断
Tim3CmpIntFall = 2u, ///< 比较匹配下降沿中断
Tim3CmpIntRiseFall = 3u, ///< 比较匹配上升沿下降沿中断
}en_tim3_m23_cisa_cisb_t;
/**
******************************************************************************
** \brief TIM3端口控制 - 刹车时CHx输出状态控制(BKSA/BKSB)(模式23)
**
** \note
******************************************************************************/
typedef enum en_tim3_m23_crchx_bks
{
Tim3CHxBksHiZ = 0u, ///< 刹车使能时,CHx端口输出高阻态
Tim3CHxBksNorm = 1u, ///< 刹车使能时,CHx端口正常输出
Tim3CHxBksLow = 2u, ///< 刹车使能时,CHx端口输出低电平
Tim3CHxBksHigh = 3u, ///< 刹车使能时,CHx端口输出高电平
}en_tim3_m23_crchx_bks_t;
/**
******************************************************************************
** \brief TIM3端口控制 - CHx上升沿下降沿捕获(CRx/CFx)(模式23)
**
** \note
******************************************************************************/
typedef enum en_tim3_m23_crch0_cfx_crx
{
Tim3CHxCapNone = 0u, ///< CHx通道捕获禁止
Tim3CHxCapRise = 1u, ///< CHx通道上升沿捕获使能
Tim3CHxCapFall = 2u, ///< CHx通道下降沿捕获使能
Tim3CHxCapFallRise = 3u, ///< CHx通道上升沿下降沿捕获都使能
}en_tim3_m23_crch0_cfx_crx_t;
/**
******************************************************************************
** \brief TIM3端口控制 - CHx比较捕获模式(CSA/CSB)(模式23)
**
** \note
******************************************************************************/
typedef enum en_tim3_m23_crch0_csa_csb
{
Tim3CHxCmpMode = 0u, ///< CHx通道设置为比较模式
Tim3CHxCapMode = 1u, ///< CHx通道设置为捕获模式
}en_tim3_m23_crch0_csa_csb_t;
/**
******************************************************************************
** \brief 比较模式下 DMA比较触发选择 数据类型重定义 (CCDS)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_mscr_ccds
{
Tim3CmpTrigDMA = 0u, ///< 比较匹配触发DMA
Tim3UEVTrigDMA = 1u, ///< 事件更新代替比较匹配触发DMA
}en_tim3_m23_mscr_ccds_t;
/**
******************************************************************************
** \brief 主从模式选择 数据类型重定义 (MSM)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_mscr_msm
{
Tim3SlaveMode = 0u, ///< 从模式
Tim3MasterMode = 1u, ///< 主模式
}en_tim3_m23_mscr_msm_t;
/**
******************************************************************************
** \brief 触发主模式输出源 数据类型重定义 (MMS)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_mscr_mms
{
Tim3MasterUG = 0u, ///< UG(软件更新)源
Tim3MasterCTEN = 1u, ///< CTEN源
Tim3MasterUEV = 2u, ///< UEV更新源
Tim3MasterCMPSO = 3u, ///< 比较匹配选择输出源
Tim3MasterOCA0Ref = 4u, ///< OCA0_Ref源
Tim3MasterOCB0Ref = 5u, ///< OCB0_Ref源
//Tim3MasterOCB0Ref = 6u,
//Tim3MasterOCB0Ref = 7u,
}en_tim3_m23_mscr_mms_t;
/**
******************************************************************************
** \brief 触发从模式选择 数据类型重定义 (SMS)(模式23)
*****************************************************************************/
typedef enum en_tim3_m23_mscr_sms
{
Tim3SlaveIClk = 0u, ///< 使用内部时钟
Tim3SlaveResetTIM = 1u, ///< 复位功能
Tim3SlaveTrigMode = 2u, ///< 触发模式
Tim3SlaveEClk = 3u, ///< 外部时钟模式
Tim3SlaveCodeCnt1 = 4u, ///< 正交编码计数模式1
Tim3SlaveCodeCnt2 = 5u, ///< 正交编码计数模式2
Tim3SlaveCodeCnt3 = 6u, ///< 正交编码计数模式3
Tim3SlaveGateCtrl = 7u, ///< 门控功能
}en_tim3_m23_mscr_sms_t;
/**
******************************************************************************
** \brief 定时器运行控制数据类型重定义 (CTEN)
*****************************************************************************/
typedef enum en_tim3_start
{
Tim3CTENDisable = 0u, ///< 停止
Tim3CTENEnable = 1u, ///< 运行
}en_tim3_start_t;
/**
******************************************************************************
** \brief TIM3 mode0 配置结构体定义(模式0)
*****************************************************************************/
typedef struct stc_tim3_mode0_cfg
{
en_tim3_work_mode_t enWorkMode; ///< 工作模式设置
en_tim3_m0cr_gatep_t enGateP; ///< 门控极性控制
boolean_t bEnGate; ///< 门控使能
en_tim3_cr_timclkdiv_t enPRS; ///< 预除频配置
boolean_t bEnTog; ///< 翻转输出使能
en_tim3_cr_ct_t enCT; ///< 定时/计数功能选择
en_tim3_m0cr_md_t enCntMode; ///< 计数模式配置
}stc_tim3_mode0_cfg_t;
/**
******************************************************************************
** \brief TIM3 mode1 配置结构体定义(模式1)
*****************************************************************************/
typedef struct stc_tim3_mode1_cfg
{
en_tim3_work_mode_t enWorkMode; ///< 工作模式设置
en_tim3_cr_timclkdiv_t enPRS; ///< 预除频配置
en_tim3_cr_ct_t enCT; ///< 定时/计数功能选择
en_tim3_m1cr_oneshot_t enOneShot; ///< 单次测量/循环测量选择
}stc_tim3_mode1_cfg_t;
/**
******************************************************************************
** \brief PWC输入配置结构体定义(模式1)
*****************************************************************************/
typedef struct stc_tim3_pwc_input_cfg
{
en_tim3_mscr_ts_t enTsSel; ///< 触发输入源选择
en_tim3_m1_mscr_ia0s_t enIA0Sel; ///< CHA0输入选择
en_tim3_m1_mscr_ib0s_t enIB0Sel; ///< CHB0输入选择
en_tim3_port_polarity_t enETRPhase; ///< ETR相位选择
en_tim3_flt_t enFltETR; ///< ETR滤波设置
en_tim3_flt_t enFltIA0; ///< CHA0滤波设置
en_tim3_flt_t enFltIB0; ///< CHB0滤波设置
}stc_tim3_pwc_input_cfg_t;
/**
******************************************************************************
** \brief TIM3 mode23 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_mode23_cfg
{
en_tim3_work_mode_t enWorkMode; ///< 工作模式设置
en_tim3_m23cr_dir_t enCntDir; ///< 计数方向
en_tim3_cr_timclkdiv_t enPRS; ///< 时钟预除频配置
en_tim3_cr_ct_t enCT; ///< 定时/计数功能选择
en_tim3_m23cr_comp_t enPWMTypeSel; ///< PWM模式选择(独立/互补)
en_tim3_m23cr_pwm2s_t enPWM2sSel; ///< OCREFA双点比较功能选择
boolean_t bOneShot; ///< 单次触发模式使能/禁止
boolean_t bURSSel; ///< 更新源选择
}stc_tim3_mode23_cfg_t;
/**
******************************************************************************
** \brief GATE在PWM互补模式下捕获或比较功能 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_gate_cfg
{
en_tim3_m23cr_csg_t enGateFuncSel; ///< Gate比较、捕获功能选择
boolean_t bGateRiseCap; ///< GATE作为捕获功能时,上沿捕获有效控制
boolean_t bGateFallCap; ///< GATE作为捕获功能时,下沿捕获有效控制
}stc_tim3_m23_gate_cfg_t;
/**
******************************************************************************
** \brief CHA/CHB通道比较控制 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_compare_cfg
{
en_tim3_m23_crch0_csa_csb_t enCHxACmpCap; ///< CH0A比较/捕获功能选择
en_tim3_m23_fltr_ocm_t enCHxACmpCtrl; ///< CH0A通道比较控制
en_tim3_port_polarity_t enCHxAPolarity; ///< CH0A输出极性控制
boolean_t bCHxACmpBufEn; ///< 比较A缓存功能 使能/禁止
en_tim3_m23_cisa_cisb_t enCHxACmpIntSel; ///< CHA比较匹配中断选择
en_tim3_m23_crch0_csa_csb_t enCHxBCmpCap; ///< CH0B比较/捕获功能选择
en_tim3_m23_fltr_ocm_t enCHxBCmpCtrl; ///< CH0B通道比较控制
en_tim3_port_polarity_t enCHxBPolarity; ///< CH0B输出极性控制
boolean_t bCHxBCmpBufEn; ///< 比较B缓存功能 使能/禁止
en_tim3_m23_cisa_cisb_t enCHxBCmpIntSel; ///< CHB0比较匹配中断选择
}stc_tim3_m23_compare_cfg_t;
/**
******************************************************************************
** \brief CHA/CHB通道捕获控制 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_input_cfg
{
en_tim3_m23_crch0_csa_csb_t enCHxACmpCap; ///< CH0A比较/捕获功能选择
en_tim3_m23_crch0_cfx_crx_t enCHxACapSel; ///< CH0A捕获边沿选择
en_tim3_flt_t enCHxAInFlt; ///< CH0A通道捕获滤波控制
en_tim3_port_polarity_t enCHxAPolarity; ///< CH0A输入相位
en_tim3_m23_crch0_csa_csb_t enCHxBCmpCap; ///< CH0A比较/捕获功能选择
en_tim3_m23_crch0_cfx_crx_t enCHxBCapSel; ///< CH0B捕获边沿选择
en_tim3_flt_t enCHxBInFlt; ///< CH0B通道捕获滤波控制
en_tim3_port_polarity_t enCHxBPolarity; ///< CH0B输入相位
}stc_tim3_m23_input_cfg_t;
/**
******************************************************************************
** \brief ETR输入相位滤波配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_etr_input_cfg
{
en_tim3_port_polarity_t enETRPolarity; ///< ETR输入极性设置
en_tim3_flt_t enETRFlt; ///< ETR滤波设置
}stc_tim3_m23_etr_input_cfg_t;
/**
******************************************************************************
** \brief 刹车BK输入相位滤波配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_bk_input_cfg
{
boolean_t bEnBrake; ///< 刹车使能
boolean_t bEnVCBrake; ///< 使能VC刹车
boolean_t bEnSafetyBk; ///< 使能safety刹车
boolean_t bEnBKSync; ///< TIM0/TIM1/TIM2刹车同步使能
en_tim3_m23_crchx_bks_t enBkCH0AStat; ///< 刹车时CHA端口状态设置
en_tim3_m23_crchx_bks_t enBkCH0BStat; ///< 刹车时CHB端口状态设置
en_tim3_m23_crchx_bks_t enBkCH1AStat; ///< 刹车时CHA端口状态设置
en_tim3_m23_crchx_bks_t enBkCH1BStat; ///< 刹车时CHB端口状态设置
en_tim3_m23_crchx_bks_t enBkCH2AStat; ///< 刹车时CHA端口状态设置
en_tim3_m23_crchx_bks_t enBkCH2BStat; ///< 刹车时CHB端口状态设置
en_tim3_port_polarity_t enBrakePolarity; ///< 刹车BK输入极性设置
en_tim3_flt_t enBrakeFlt; ///< 刹车BK滤波设置
}stc_tim3_m23_bk_input_cfg_t;
/**
******************************************************************************
** \brief 死区功能配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_dt_cfg
{
boolean_t bEnDeadTime; ///< 刹车时CHA端口状态设置
uint8_t u8DeadTimeValue; ///< 刹车时CHA端口状态设置
}stc_tim3_m23_dt_cfg_t;
/**
******************************************************************************
** \brief 触发ADC配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_adc_trig_cfg
{
boolean_t bEnTrigADC; ///< 触发ADC全局控制
boolean_t bEnUevTrigADC; ///< 事件更新触发ADC
boolean_t bEnCH0ACmpTrigADC; ///< CH0A比较匹配触发ADC
boolean_t bEnCH0BCmpTrigADC; ///< CH0B比较匹配触发ADC
boolean_t bEnCH1ACmpTrigADC; ///< CH0A比较匹配触发ADC
boolean_t bEnCH1BCmpTrigADC; ///< CH0B比较匹配触发ADC
boolean_t bEnCH2ACmpTrigADC; ///< CH0A比较匹配触发ADC
boolean_t bEnCH2BCmpTrigADC; ///< CH0B比较匹配触发ADC
}stc_tim3_m23_adc_trig_cfg_t;
/**
******************************************************************************
** \brief DMA触发 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_trig_dma_cfg
{
boolean_t bUevTrigDMA; ///< 更新 触发DMA使能
boolean_t bTITrigDMA; ///< Trig 触发DMA功能
boolean_t bCmpA0TrigDMA; ///< CH0A捕获比较触发DMA使能
boolean_t bCmpB0TrigDMA; ///< CH0B捕获比较触发DMA使能
boolean_t bCmpA1TrigDMA; ///< CH1A捕获比较触发DMA使能
boolean_t bCmpB1TrigDMA; ///< CH1B捕获比较触发DMA使能
boolean_t bCmpA2TrigDMA; ///< CH2A捕获比较触发DMA使能
boolean_t bCmpB2TrigDMA; ///< CH2B捕获比较触发DMA使能
en_tim3_m23_mscr_ccds_t enCmpUevTrigDMA; ///< 比较模式下DMA比较触发选择
}stc_tim3_m23_trig_dma_cfg_t;
/**
******************************************************************************
** \brief 主从模式 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_master_slave_cfg
{
en_tim3_m23_mscr_msm_t enMasterSlaveSel; ///< 主从模式选择
en_tim3_m23_mscr_mms_t enMasterSrc; ///< 主模式触发源选择
en_tim3_m23_mscr_sms_t enSlaveModeSel; ///< 从模式选择
en_tim3_mscr_ts_t enTsSel; ///< 触发输入源选择
}stc_tim3_m23_master_slave_cfg_t;
/**
******************************************************************************
** \brief OCREF清除功能 配置结构体定义(模式23)
*****************************************************************************/
typedef struct stc_tim3_m23_OCREF_Clr_cfg
{
en_tim3_m23ce_occs_t enOCRefClrSrcSel; ///< OCREF清除源选择
boolean_t bVCClrEn; ///< 是否使能来自VC的OCREF_Clr
}stc_tim3_m23_OCREF_Clr_cfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
//中断相关函数
//中断标志获取
boolean_t Tim3_GetIntFlag(en_tim3_irq_type_t enTim3Irq);
//中断标志清除
en_result_t Tim3_ClearIntFlag(en_tim3_irq_type_t enTim3Irq);
//所有中断标志清除
en_result_t Tim3_ClearAllIntFlag(void);
//模式0中断使能
en_result_t Tim3_Mode0_EnableIrq(void);
//模式1中断使能
en_result_t Tim3_Mode1_EnableIrq (en_tim3_irq_type_t enTim3Irq);
//模式2中断使能
en_result_t Tim3_Mode23_EnableIrq (en_tim3_irq_type_t enTim3Irq);
//模式0中断禁止
en_result_t Tim3_Mode0_DisableIrq(void);
//模式1中断禁止
en_result_t Tim3_Mode1_DisableIrq (en_tim3_irq_type_t enTim3Irq);
//模式2中断禁止
en_result_t Tim3_Mode23_DisableIrq (en_tim3_irq_type_t enTim3Irq);
//模式0初始化及相关功能操作
//timer配置及初始化
en_result_t Tim3_Mode0_Init(stc_tim3_mode0_cfg_t* pstcCfg);
//timer 启动/停止
en_result_t Tim3_M0_Run(void);
en_result_t Tim3_M0_Stop(void);
//重载值设置
en_result_t Tim3_M0_ARRSet(uint16_t u16Data);
//16位计数值设置/获取
en_result_t Tim3_M0_Cnt16Set(uint16_t u16Data);
uint16_t Tim3_M0_Cnt16Get(void);
//32位计数值设置/获取
en_result_t Tim3_M0_Cnt32Set(uint32_t u32Data);
uint32_t Tim3_M0_Cnt32Get(void);
//端口输出使能/禁止设定
en_result_t Tim3_M0_Enable_Output(boolean_t bEnOutput);
//翻转使能/禁止(低电平)设定
en_result_t Tim3_M0_EnTOG(boolean_t bEnTOG);
//模式1初始化及相关功能操作
//timer配置及初始化
en_result_t Tim3_Mode1_Init(stc_tim3_mode1_cfg_t* pstcCfg);
//PWC 输入配置
en_result_t Tim3_M1_Input_Cfg(stc_tim3_pwc_input_cfg_t* pstcCfg);
//PWC测量边沿起始结束选择
en_result_t Tim3_M1_PWC_Edge_Sel(en_tim3_m1cr_Edge_t enEdgeSel);
//timer 启动/停止
en_result_t Tim3_M1_Run(void);
en_result_t Tim3_M1_Stop(void);
//16位计数值设置/获取
en_result_t Tim3_M1_Cnt16Set(uint16_t u16Data);
uint16_t Tim3_M1_Cnt16Get(void);
//脉冲宽度测量结果数值获取
uint16_t Tim3_M1_PWC_CapValueGet(void);
//模式23初始化及相关功能操作
//timer配置及初始化
en_result_t Tim3_Mode23_Init(stc_tim3_mode23_cfg_t* pstcCfg);
//timer 启动/停止
en_result_t Tim3_M23_Run(void);
en_result_t Tim3_M23_Stop(void);
//PWM输出使能
en_result_t Tim3_M23_EnPWM_Output(boolean_t bEnOutput, boolean_t bEnAutoOutput);
//重载值设置
en_result_t Tim3_M23_ARRSet(uint16_t u16Data, boolean_t bArrBufEn);
//16位计数值设置/获取
en_result_t Tim3_M23_Cnt16Set(uint16_t u16Data);
uint16_t Tim3_M23_Cnt16Get(void);
//比较捕获寄存器CCR0A/CCR0B设置/读取
en_result_t Tim3_M23_CCR_Set(en_tim3_m23_ccrx_t enCCRSel, uint16_t u16Data);
uint16_t Tim3_M23_CCR_Get(en_tim3_m23_ccrx_t enCCRSel);
//PWM互补输出模式下,GATE功能选择
en_result_t Tim3_M23_GateFuncSel(stc_tim3_m23_gate_cfg_t* pstcCfg);
//主从模式配置
en_result_t Tim3_M23_MasterSlave_Set(stc_tim3_m23_master_slave_cfg_t* pstcCfg);
//CH0A/CH0B比较通道控制
en_result_t Tim3_M23_PortOutput_Cfg(en_tim3_channel_t enTim3Chx, stc_tim3_m23_compare_cfg_t* pstcCfg);
//CH0A/CH0B输入控制
en_result_t Tim3_M23_PortInput_Cfg(en_tim3_channel_t enTim3Chx, stc_tim3_m23_input_cfg_t* pstcCfg);
//ERT输入控制
en_result_t Tim3_M23_ETRInput_Cfg(stc_tim3_m23_etr_input_cfg_t* pstcCfg);
//刹车BK输入控制
en_result_t Tim3_M23_BrakeInput_Cfg(stc_tim3_m23_bk_input_cfg_t* pstcBkCfg);
//触发ADC控制
en_result_t Tim3_M23_TrigADC_Cfg(stc_tim3_m23_adc_trig_cfg_t* pstcCfg);
//死区功能
en_result_t Tim3_M23_DT_Cfg(stc_tim3_m23_dt_cfg_t* pstcCfg);
//重复周期设置
en_result_t Tim3_M23_SetValidPeriod(uint8_t u8ValidPeriod);
//OCREF清除功能
en_result_t Tim3_M23_OCRefClr(stc_tim3_m23_OCREF_Clr_cfg_t* pstcCfg);
//使能DMA传输
en_result_t Tim3_M23_EnDMA(stc_tim3_m23_trig_dma_cfg_t* pstcCfg);
//捕获比较A软件触发
en_result_t Tim3_M23_EnSwTrigCapCmpA(en_tim3_channel_t enTim3Chx);
//捕获比较B软件触发
en_result_t Tim3_M23_EnSwTrigCapCmpB(en_tim3_channel_t enTim3Chx);
//软件更新使能
en_result_t Tim3_M23_EnSwUev(void);
//软件触发使能
en_result_t Tim3_M23_EnSwTrig(void);
//软件刹车使能
en_result_t Tim3_M23_EnSwBk(void);
//@} // Tim3Group
#ifdef __cplusplus
#endif
#endif /* __BT_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+184
View File
@@ -0,0 +1,184 @@
/******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file trim.h
**
** TRIM 数据结构及API声明
**
**
** History:
** - 2018-04-21 Lux V1.0
**
*****************************************************************************/
#ifndef __TRIM_H__
#define __TRIM_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup TrimGroup Clock Trimming (TRIM)
**
******************************************************************************/
//@{
/******************************************************************************
** Global pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief 监测模式使能枚举重定义 (MON_EN)
*****************************************************************************/
typedef enum en_trim_monitor
{
TrimMonDisable = 0u, ///< 禁止
TrimMonEnable = 0x40u, ///< 使能
}en_trim_monitor_t;
/**
******************************************************************************
** \brief 待校准/监测时钟选择枚举重定义 (CALCLK_SEL)
*****************************************************************************/
typedef enum en_trim_calclksel
{
TrimCalMskRCH = 0x000u, ///< RCH
TrimCalMskXTH = 0x010u, ///< XTH
TrimCalMskRCL = 0x020u, ///< RCL
TrimCalMskXTL = 0x030u, ///< XTL
TrimCalMskPLL = 0x100u, ///< PLL
}en_trim_calclksel_t;
/**
******************************************************************************
** \brief 参考时钟选择枚举重定义 (REFCLK_SEL)
*****************************************************************************/
typedef enum en_trim_refclksel
{
TrimRefMskRCH = 0x0u, ///< RCH
TrimRefMskXTH = 0x2u, ///< XTH
TrimRefMskRCL = 0x4u, ///< RCL
TrimRefMskXTL = 0x6u, ///< XTL
TrimRefMskIRC10K = 0x8u, ///< IRC10K
TrimRefMskExtClk = 0xau, ///< 外部输入时钟
}en_trim_refclksel_t;
/**
******************************************************************************
** \brief 中断标志类型枚举重定义
*****************************************************************************/
typedef enum en_trim_inttype
{
TrimStop = 0x01u, ///< 参考计数器停止标志
TrimCalCntOf = 0x02u, ///< 校准计数器溢出标志
TrimXTLFault = 0x04u, ///< XTL 失效标志
TrimXTHFault = 0x08u, ///< XTH 失效标志
TrimPLLFault = 0x10u, ///< PLL 失效标志
}en_trim_inttype_t;
/**
******************************************************************************
** \brief TRIM 配置结构体定义
*****************************************************************************/
typedef struct stc_trim_cfg
{
en_trim_monitor_t enMON; ///< 监测模式使能
en_trim_calclksel_t enCALCLK; ///< 校准时钟选择
uint32_t u32CalCon; ///< 校准计数器溢出值配置
en_trim_refclksel_t enREFCLK; ///< 参考时钟选择
uint32_t u32RefCon; ///< 参考计数器初值配置
}stc_trim_cfg_t;
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
*****************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
*****************************************************************************/
///<<功能配置及操作函数
///<Trim 配置及初始化
en_result_t Trim_Init(stc_trim_cfg_t* pstcCfg);
///<校准/监测启动/停止
void Trim_Run(void);
void Trim_Stop(void);
///<参考计数器计数值获取
uint32_t Trim_RefCntGet(void);
///<校准计数器计数值获取
uint32_t Trim_CalCntGet(void);
///<中断操作相关函数
///中断使能/禁止
void Trim_EnableIrq(void);
void Trim_DisableIrq(void);
///<中断标志获取
boolean_t Trim_GetIntFlag(en_trim_inttype_t enIntType);
///<中断标志清除
en_result_t Trim_ClearIntFlag(en_trim_inttype_t enIntType);
//@} // TrimGroup
#ifdef __cplusplus
#endif
#endif /* __TRIM_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+108
View File
@@ -0,0 +1,108 @@
/*******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file trng.h
**
** Headerfile for RNG functions
** @link RNG Group Some description @endlink
**
** History:
** - 2018-04-15 Lux First Version
**
******************************************************************************/
#ifndef __TRNG_H__
#define __TRNG_H__
/*******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup TrngGroup (TRNG)
**
******************************************************************************/
//@{
/**
*******************************************************************************
** function prototypes.
******************************************************************************/
/*******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Global variable declarations ('extern', definition in C source)
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
///< 随机数初始化(上电第一次生成随机数)
en_result_t Trng_Init(void);
///< 生成随机数(非上电第一次生成随机数)
en_result_t Trng_Generate(void);
///< 获取64bits随机数(执行随机数初始化或生成随机数函数后可使用该函数获取随机数值)
uint32_t Trng_GetData0(void);
uint32_t Trng_GetData1(void);
//@} // Trng Group
#ifdef __cplusplus
#endif
#endif /* __TRNG_H__ */
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+252
View File
@@ -0,0 +1,252 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file uart.h
**
** Headerfile for UART functions
**
**
** History:
** - 2017-05-10 Cathy First Version
**
*****************************************************************************/
#ifndef __UART_H__
#define __UART_H__
/*****************************************************************************
* Include files
*****************************************************************************/
#include "ddl.h"
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup UartGroup Universal Asynchronous Receiver/Transmitter (UART)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
**\brief uart通道选择
******************************************************************************/
/**
******************************************************************************
** \brief uart多机模式地址帧/数据帧或者奇偶校验
******************************************************************************/
typedef enum en_uart_mmdorck
{
UartMskDataOrAddr = 0u, ///<多机模式时,通过读写SBUF[8]决定帧为数据帧或地址帧
UartMskEven = 0x4u, ///<非多机模式偶校验
UartMskOdd = 0x8u, ///<非多机模式奇校验
}en_uart_mmdorck_t;
/**
******************************************************************************
** \brief uart多机模式及从机地址和地址掩码配置
******************************************************************************/
typedef struct stc_uart_multimode
{
uint8_t u8SlaveAddr; ///<从机地址
uint8_t u8SaddEn; ///<从及地址掩码
}stc_uart_multimode_t;
/**
******************************************************************************
** \brief uart 四种工作模式选择
******************************************************************************/
typedef enum en_uart_mode
{
UartMskMode0 = 0x00u, ///<模式0
UartMskMode1 = 0x40u, ///<模式1
UartMskMode2 = 0x80u, ///<模式2
UartMskMode3 = 0xc0u, ///<模式3
} en_uart_mode_t;
/**
******************************************************************************
** \brief uart stop长度选择
******************************************************************************/
typedef enum en_uart_stop
{
UartMsk1bit = 0x0000u, ///<1位停止位
UartMsk1_5bit = 0x4000u, ///<1.5位停止位
UartMsk2bit = 0x8000u, ///<2位停止位
} en_uart_stop_t;
/**
******************************************************************************
** \brief uart 功能使能
******************************************************************************/
typedef enum en_uart_func
{
UartRenFunc = 4u, ///<0-TX; ///<1-非mode0模式代表RX&TX ,mode0模式代表RX;
UartDmaRxFunc = 16u, ///<DMA接收功能
UartDmaTxFunc = 17u, ///<DMA发送功能
UartRtsFunc = 18u, ///<硬件流RTS功能
UartCtsFunc = 19u, ///<硬件流CTS功能
UartHdFunc = 22u, ///<单线半双工功能
}en_uart_func_t;
/**
******************************************************************************
** \brief uart中断使能控制
******************************************************************************/
typedef enum en_uart_irq_sel
{
UartRxIrq = 0u, ///<接收中断使能
UartTxIrq = 1u, ///<发送中断使能
UartTxEIrq = 8u, ///<TX空中断使能
UartPEIrq = 13u, ///<奇偶校验中断使能
UartCtsIrq = 20u, ///<CTS信号翻转中断使能
UartFEIrq = 21u, ///<帧错误中断使能
}en_uart_irq_sel_t;
/**
******************************************************************************
** \brief uart 状态标志位
******************************************************************************/
typedef enum en_uart_status
{
UartRC = 0u, ///<接收数据完成标记
UartTC = 1u, ///<发送数据完成标记
UartFE = 2u, ///<帧错误标记
UartTxe = 3u, ///<TXbuff空标记
UartPE = 4u, ///<奇偶校验错误标记
UartCtsIf = 5u, ///<CTS中断标记
UartCts = 6u, ///<CTS信号标记
}en_uart_status_t;
/**
******************************************************************************
** \brief uart 通道采样分频配置
******************************************************************************/
typedef enum en_uart_clkdiv
{
UartMsk16Or32Div = 0u, ///<模式0无效,模式1/3为16分频,模式2为32分频
UartMsk8Or16Div = 0x200u, ///<模式0无效,模式1/3为8分频,模式2为16分频
}en_uart_clkdiv_t;
/**
******************************************************************************
** \brief uart 通道Mode1和Mode3波特率计算参数
******************************************************************************/
typedef struct stc_uart_baud
{
en_uart_clkdiv_t enClkDiv; ///<采样分频
uint32_t u32Pclk; ///<pclk
uint32_t u32Baud; ///<波特率
} stc_uart_baud_t;
/**
******************************************************************************
** \uart 总体配置
******************************************************************************/
typedef struct stc_uart_cfg
{
en_uart_mode_t enRunMode; ///<四种模式配置
en_uart_mmdorck_t enMmdorCk; ///<校验模式
en_uart_stop_t enStopBit; ///<停止位长度
stc_uart_baud_t stcBaud; ///<Mode1/3波特率配置
} stc_uart_cfg_t;
//UART初始化
en_result_t Uart_Init(M0P_UART_TypeDef* UARTx, stc_uart_cfg_t* pstcCfg);
///< UART 单线模式使能/禁止
void Uart_HdModeEnable(M0P_UART_TypeDef* UARTx);
void Uart_HdModeDisable(M0P_UART_TypeDef* UARTx);
//UART模块多机模式设置函数
en_result_t Uart_SetMultiMode(M0P_UART_TypeDef* UARTx,stc_uart_multimode_t* pstcMultiCfg);
//TB8数据设置
void Uart_SetTb8(M0P_UART_TypeDef* UARTx, boolean_t bTB8Value);
//RB8数据获取
boolean_t Uart_GetRb8(M0P_UART_TypeDef* UARTx);
//中断相关设置函数
en_result_t Uart_EnableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel);
en_result_t Uart_DisableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel);
//功能使能和禁止
en_result_t Uart_EnableFunc(M0P_UART_TypeDef* UARTx, en_uart_func_t enFunc);
en_result_t Uart_DisableFunc(M0P_UART_TypeDef* UARTx, en_uart_func_t enFunc);
//状态位的获取和清除
uint8_t Uart_GetIsr(M0P_UART_TypeDef* UARTx);
boolean_t Uart_GetStatus(M0P_UART_TypeDef* UARTx,en_uart_status_t enStatus);
en_result_t Uart_ClrIsr(M0P_UART_TypeDef* UARTx);
en_result_t Uart_ClrStatus(M0P_UART_TypeDef* UARTx,en_uart_status_t enStatus);
//数据收发操作
///< 数据查询模式发送
en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data);
///< 数据中断模式发送
en_result_t Uart_SendDataIt(M0P_UART_TypeDef* UARTx, uint8_t u8Data);
uint8_t Uart_ReceiveData(M0P_UART_TypeDef* UARTx);
//发送字符串
void USART_SendString(M0P_UART_TypeDef* USARTx,uint16_t Len, uint8_t *SendDataString);
//@} // UartGroup
#ifdef __cplusplus
#endif
#endif /* __UART_H__ */
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+299
View File
@@ -0,0 +1,299 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file vc.h
**
** Headerfile for Voltage Comparator functions
** @link VC Group Some description @endlink
**
** - 2019-04-10 First Version
**
******************************************************************************/
#ifndef __VC_H__
#define __VC_H__
/******************************************************************************
* Include files
******************************************************************************/
#include "ddl.h"
/* C binding of definitions if building with C++ compiler */
#ifdef __cplusplus
extern "C"
{
#endif
/**
******************************************************************************
** \defgroup VcGroup Voltage Comparator (VC)
**
******************************************************************************/
//@{
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief VC通道
*****************************************************************************/
typedef enum
{
VcChannel0 = 0u, // 通道0
VcChannel1 = 1u, // 通道1
VcChannel2 = 2u // 通道2
}en_vc_channel_t;
/**
******************************************************************************
** \brief VC迟滞 VC_CR VCx_HYS_SEL(x=0、1、2)
*****************************************************************************/
typedef enum
{
VcDelayoff = 0u, // 迟滞关闭
VcDelay10mv = 1u, // 迟滞10mv
VcDelay20mv = 2u, // 迟滞20mv
VcDelay30mv = 3u, // 迟滞30mv
}en_vc_cmp_delay_t;
/**
******************************************************************************
** \brief VC偏置电流 VC_CR VCx_BIAS_SEL(x=0、1、2)
*****************************************************************************/
typedef enum
{
VcBias300na = 0u, // 偏置电流300nA
VcBias1200na = 1u, // 偏置电流1.2uA
VcBias10ua = 2u, // 偏置电流10uA
VcBias20ua = 3u, // 偏置电流20uA
}en_vc_bias_current_t;
/**
******************************************************************************
** \brief VC输出滤波时间 VCx_CR debounce_time(x=0、1、2)
*****************************************************************************/
typedef enum
{
VcFilter7us = 0u, // 输出滤波时间7us
VcFilter14us = 1u, // 输出滤波时间14us
VcFilter28us = 2u, // 输出滤波时间28us
VcFilter112us = 3u, // 输出滤波时间112us
VcFilter450us = 4u, // 输出滤波时间450us
VcFilter1800us = 5u, // 输出滤波时间1.8ms
VcFilter7200us = 6u, // 输出滤波时间7.2ms
VcFilter28800us = 7u, // 输出滤波时间28.8ms
}en_vc_resp_filter_t;
/**
******************************************************************************
** \brief VC P端输入
*****************************************************************************/
typedef enum
{
//VC0 //VC1 //VC2
VcInPCh0 = 0u, // 输入通道0 PC0 输入通道0 PA0 输入通道0 PA5
VcInPCh1 = 1u, // 输入通道1 PC1 输入通道1 PA1 输入通道1 PB1
VcInPCh2 = 2u, // 输入通道2 PC2 输入通道2 PA2 输入通道2 PE9
VcInPCh3 = 3u, // 输入通道3 PC3 输入通道3 PA3 输入通道3 PE10
VcInPCh4 = 4u, // 输入通道4 PA0 输入通道4 PA4 输入通道4 PE11
VcInPCh5 = 5u, // 输入通道5 PA1 输入通道5 PA5 输入通道5 PE13
VcInPCh6 = 6u, // 输入通道6 PA2 输入通道6 PB1 输入通道6 PE14
VcInPCh7 = 7u, // 输入通道7 PA3 输入通道7 PB2 输入通道7 PE15
VcInPCh8 = 8u, // 输入通道7 PA4 输入通道8 PB10 输入通道8 PB11
VcInPCh9 = 9u, // 输入通道7 PA5 输入通道9 PB12 输入通道9 PB14
VcInPCh10 = 10u, // 输入通道7 PA6 输入通道10 PB13 输入通道10 PD9
VcInPCh11 = 11u, // 输入通道7 PA7 输入通道11 PB14 输入通道11 PD10
VcInPCh12 = 12u, // 输入通道7 PB4 输入通道12 PB4 输入通道12 PD11
VcInPCh13 = 13u, // 输入通道7 PB5 输入通道13 DAC0 输入通道13 PC7
VcInPCh14 = 14u, // 输入通道7 PB6 输入通道14 PB6 输入通道14 DAC0
VcInPCh15 = 15u, // 输入通道7 DAC0 输入通道15 PB7 输入通道15 DAC0
}en_vc_input_p_src_t;
/**
******************************************************************************
** \brief VC N端输入
*****************************************************************************/
typedef enum
{
//VC0 //VC1 //VC2
VcInNCh0 = 0u, // 输入通道0 PA0 输入通道0 PC0 输入通道0 PA5
VcInNCh1 = 1u, // 输入通道1 PA1 输入通道1 PC1 输入通道1 PB1
VcInNCh2 = 2u, // 输入通道2 PA2 输入通道2 PC2 输入通道2 PE11
VcInNCh3 = 3u, // 输入通道3 PA3 输入通道3 PC3 输入通道3 PE15
VcInNCh4 = 4u, // 输入通道4 PA4 输入通道4 PA0 输入通道4 PB11
VcInNCh5 = 5u, // 输入通道5 PA5 输入通道5 PA1 输入通道5 PB14
VcInNCh6 = 6u, // 输入通道6 PA6 输入通道6 PB0 输入通道6 PD10
VcInNCh7 = 7u, // 输入通道7 PA7 输入通道7 PB1 输入通道7 PD11
VcInNCh8 = 8u, // 输入通道8 PC4 输入通道8 PB2 输入通道8 PC7
VcInNCh9 = 9u, // 输入通道9 PC5 输入通道9 PB3 输入通道9 DAC0
VcInNCh10 = 10u, // 输入通道10 DAC0 输入通道10 DAC1 输入通道10 DAC0
ResDivOut = 11u, // 电阻分压 电阻分压 NA
AiTs = 12u, // 内部温度传感器输出电压 内部温度传感器输出电压 内部温度传感器输出电压
AiBg1p2 = 13u, // 内部基准1.2V 内部基准1.2V 内部基准1.2V
AiAdcVref = 14u, // ADC参考电压VREF ADC参考电压VREF ADC参考电压VREF
AiLdo = 15u, // LDO输出电压 LDO输出电压 LDO输出电压
}en_vc_input_n_src_t;
/**
******************************************************************************
** \brief VC中断触发方式
*****************************************************************************/
typedef enum en_vc_irq_sel
{
VcIrqNone = 0u, ///< 无中断
VcIrqRise = 1u, ///< 上升沿触发
VcIrqFall = 2u, ///< 下降沿触发
VcIrqHigh = 3u, ///< 高电平触发
}en_vc_irq_sel_t;
/**
******************************************************************************
** \brief VC状态 VC_IFR
*****************************************************************************/
typedef enum en_vc_stat
{
Vc0_Intf = 0u, // VC0中断标志
Vc1_Intf = 1u, // VC1中断标志
Vc0_Filter = 2u, // VC0 Filter 后的状态
Vc1_Filter = 3u, // VC1 Filter 后的状态
Vc2_Intf = 4u, // VC2中断标志
Vc2_Filter = 5u // VC2 Filter 后的状态
}en_vc_ifr_t;
/**
******************************************************************************
** \brief VC输出配置 VCx_OUT_CFG(x=0、1、2)
** \note 对于VC0CHX = CHA;对于VC1 VC2CHX = CHB
*****************************************************************************/
typedef enum en_vc_output_cfg
{
VcOutInvTimer = 0u, // 结果输出反向到各Timer0,1,2,3 REFCLR
VcOutTIM0RCLR = 1u, // 结果输出到TIM0 REFCLR使能控制
VcOutTIM1RCLR = 2u, // 结果输出到TIM1 REFCLR使能控制
VcOutTIM2RCLR = 3u, // 结果输出到TIM2 REFCLR使能控制
VcOutTIM3RCLR = 4u, // 结果输出到TIM3 REFCLR使能控制
VcOutTIMBK = 5u, // 结果输出到Timer0,1,2,3刹车控制
VcOutInvTIM4 = 9u, // 结果输出到Timer4反向使能
VcOutTIM4 = 10u, // 结果输出到Timer4捕获输入CHX使能
VcOutInvTIM5 = 11u, // 结果输出到Timer5反向使能
VcOutTIM5 = 12u, // 结果输出到Timer5捕获输入CHX使能
VcOutInvTIM6 = 13u, // 结果输出到Timer6反向使能
VcOutTIM6 = 14u, // 结果输出到Timer6捕获输入CHX使能
VcOutBrake = 15u, // 结果作为Advanced Timer刹车控制
VcOutDisable = 16u // 结果输出除能
}en_vc_output_cfg_t;
/**
******************************************************************************
** \brief VC DIV参考电压Vref选择 VC_CR VC_REF2P5_SEL
*****************************************************************************/
typedef enum en_vc_div_vref
{
VcDivVrefAvcc = 0u, ///< AVCC
VcDivVrefAdc = 1u, ///< ADC_CR0 SREF选择参考电压
}en_vc_div_vref_t;
/**
******************************************************************************
** \brief VC模块配置 VC_CR VC_REF2P5_SEL VC_DIV_EN VC_DIV
*****************************************************************************/
typedef struct stc_vc_dac_cfg
{
boolean_t bDivEn; // VC_CR: VC_DIV_EN
uint8_t u8DivVal; // VC_CR: VC_DIV 范围:0-63
en_vc_div_vref_t enDivVref; // VC_CR: VC_REF2P5_SEL
}stc_vc_dac_cfg_t;
/**
******************************************************************************
** \brief VC通道配置
*****************************************************************************/
typedef struct stc_vc_channel_cfg
{
en_vc_channel_t enVcChannel; // VC通道选择
en_vc_cmp_delay_t enVcCmpDly; // VC迟滞
en_vc_bias_current_t enVcBiasCurrent; // VC功耗选择
en_vc_resp_filter_t enVcFilterTime; // 输出滤波时间
en_vc_input_p_src_t enVcInPin_P; // P端输入
en_vc_input_n_src_t enVcInPin_N; // N端输入
en_vc_output_cfg_t enVcOutCfg; // 输出配置
boolean_t bFlten; // 滤波输出使能
}stc_vc_channel_cfg_t;
/******************************************************************************
* Global definitions
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Global variable definitions ('extern')
******************************************************************************/
/******************************************************************************
* Global function prototypes (definition in C source)
******************************************************************************/
extern void Vc_CfgItType(en_vc_channel_t Channelx, en_vc_irq_sel_t ItType);
extern void Vc_ItCfg(en_vc_channel_t Channelx, boolean_t NewStatus);
extern boolean_t Vc_GetItStatus(en_vc_ifr_t Result);
extern void Vc_ClearItStatus(en_vc_ifr_t NewStatus);
extern en_result_t Vc_DacInit(stc_vc_dac_cfg_t *pstcDacCfg);
extern void Vc_Init(stc_vc_channel_cfg_t *pstcChannelCfg);
extern void Vc_Cmd(en_vc_channel_t enChannel, boolean_t NewStatus);
#ifdef __cplusplus
}
#endif
#endif /* __VC_H__ */
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+135
View File
@@ -0,0 +1,135 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file wdt.h
**
** Headerfile for WDT functions
**
**
** History:
** - 2017-05-10 Cathy First Version
**
*****************************************************************************/
#ifndef __WDT_H__
#define __WDT_H__
#include "ddl.h"
/**
******************************************************************************
** \defgroup WdtGroup Watchdog Timer (WDT)
**
******************************************************************************/
//@{
/******************************************************************************/
/* Global pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************
* Global type definitions
******************************************************************************/
/**
******************************************************************************
** \brief wdt溢出后复位或中断配置
*****************************************************************************/
typedef enum en_wdt_func
{
WdtResetEn = 0, ///<复位使能
WdtIntEn = 1, ///<中断使能
}en_wdt_func_t;
/**
******************************************************************************
** \brief wdt当前运行时间配置数据类型定义
*****************************************************************************/
typedef enum en_wdt_time
{
WdtT1ms6 = 0u, ///<1.6ms
WdtT3ms2 = 1u, ///<3.2ms
WdtT6ms4 = 2u, ///<6.4ms
WdtT13ms = 3u, ///<13ms
WdtT26ms = 4u, ///<26ms
WdtT51ms = 5u, ///<51ms
WdtT102ms = 6u, ///<102ms
WdtT205ms = 7u, ///<205ms
WdtT500ms = 8u, ///<500ms
WdtT820ms = 9u, ///<820ms
WdtT1s64 = 10u, ///<1.64s
WdtT3s28 = 11u, ///<3.28s
WdtT6s55 = 12u, ///<6.55s
WdtT13s1 = 13u, ///<13.1s
WdtT26s2 = 14u, ///<26.2s
WdtT52s4 = 15u, ///<52.4s
}en_wdt_time_t;
//wdt初始化
en_result_t Wdt_Init(en_wdt_func_t enFunc, en_wdt_time_t enTime);
//wdt开始和停止
void Wdt_Start(void);
//喂狗处理
void Wdt_Feed(void);
//喂狗处理
void Wdt_IrqClr(void);
//wdt溢出时间设置
void Wdt_WriteWdtLoad(uint8_t u8LoadValue);
///< 当前计数时间获取
uint8_t Wdt_ReadWdtValue(void);
//< 中断状态获取
boolean_t Wdt_GetIrqStatus(void);
///< 运行状态获取
boolean_t Wdt_ReadwdtStatus(void);
//@} // WdtGroup
#ifdef __cplusplus
#endif
#endif /* __WDT_H__ */
+649
View File
@@ -0,0 +1,649 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file adc.c
**
** ADC driver API.
**
** - 2017-06-28 Alex First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "adc.h"
/**
******************************************************************************
** \addtogroup AdcGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
* \brief
* 获取ADC中断状态
*
* \param [in] enAdcIrq ADC中断类型 @ref en_adc_irq_type_t
*
* \retval 中断标志
*/
boolean_t Adc_GetIrqStatus(en_adc_irq_type_t enAdcIrq)
{
if(M0P_ADC->IFR&enAdcIrq)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
* \brief
* 获取ADC中断状态
*
* \param [in] enAdcIrq ADC中断类型 @ref en_adc_irq_type_t
*
* \retval Null
*/
void Adc_ClrIrqStatus(en_adc_irq_type_t enAdcIrq)
{
M0P_ADC->ICR &= ~(uint32_t)enAdcIrq;
}
/**
* \brief
* ADC中断使能
*
* \param 无
*
* \retval 无
*/
void Adc_EnableIrq(void)
{
M0P_ADC->CR0_f.IE = 1u;
}
/**
* \brief
* ADC中断禁止
*
* \param 无
*
* \retval 无
*/
void Adc_DisableIrq(void)
{
M0P_ADC->CR0_f.IE = 0u;
}
/**
* \brief
* ADC初始化
*
* \param [in] pstcAdcCfg ADC配置指针
*
* \retval en_result_t Ok: 配置成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t Adc_Init(stc_adc_cfg_t* pstcAdcCfg)
{
if (NULL == pstcAdcCfg)
{
return ErrorInvalidParameter;
}
M0P_ADC->CR0 = 0x1u; ///< ADC 使能
delay10us(2);
M0P_ADC->CR0 |= (uint32_t)pstcAdcCfg->enAdcClkDiv |
(uint32_t)pstcAdcCfg->enAdcRefVolSel |
(uint32_t)pstcAdcCfg->enAdcOpBuf |
(uint32_t)pstcAdcCfg->enAdcSampCycleSel |
(uint32_t)pstcAdcCfg->enInRef;
M0P_ADC->CR1_f.MODE = pstcAdcCfg->enAdcMode;
M0P_ADC->CR1_f.ALIGN = pstcAdcCfg->enAdcAlign;
return Ok;
}
/**
* \brief
* ADC单次转换外部中断触发源配置
*
* \param [in] enAdcTrigSel 触发源
*
* \retval en_result_t Null
*/
void Adc_SglExtTrigCfg(en_adc_trig_sel_t enAdcTrigSel, boolean_t bValue)
{
if(TRUE == bValue)
{
M0P_ADC->EXTTRIGGER0 |= (uint32_t)enAdcTrigSel;
}
else
{
M0P_ADC->EXTTRIGGER0 &= ~(uint32_t)enAdcTrigSel;
}
}
/**
* \brief
* ADC顺序扫描转换外部中断触发源配置
*
* \param [in] enAdcTrigSel 触发源
* \param [in] TRUE or FALSE
*
* \retval en_result_t Null
*/
void Adc_SqrExtTrigCfg(en_adc_trig_sel_t enAdcTrigSel, boolean_t bValue)
{
if(TRUE == bValue)
{
M0P_ADC->EXTTRIGGER0 |= (uint32_t)enAdcTrigSel;
}
else
{
M0P_ADC->EXTTRIGGER0 &= ~(uint32_t)enAdcTrigSel;
}
}
/**
* \brief
* ADC插队扫描转换外部中断触发源配置
*
* \param [in] enAdcTrigSel 触发源
* \param [in] TRUE or FALSE
*
* \retval en_result_t Null
*/
void Adc_JqrExtTrigCfg(en_adc_trig_sel_t enAdcTrigSel, boolean_t bValue)
{
if(TRUE == bValue)
{
M0P_ADC->EXTTRIGGER1 |= (uint32_t)enAdcTrigSel;
}
else
{
M0P_ADC->EXTTRIGGER1 &= ~(uint32_t)enAdcTrigSel;
}
}
/**
* \brief
* ADC 单次转换开始
*
* \param 无
*
* \retval 无
*/
void Adc_SGL_Start(void)
{
M0P_ADC->SGLSTART = 1u;
}
/**
* \brief
* ADC 单次转换停止
*
* \param 无
*
* \retval 无
*/
void Adc_SGL_Stop(void)
{
M0P_ADC->SGLSTART = 0u;
}
/**
* \brief
* ADC 单次转换一直转换开始
*
* \param 无
*
* \retval 无
*/
void Adc_SGL_Always_Start(void)
{
M0P_ADC->ALLSTART = 1u;
}
/**
* \brief
* ADC 单次转换一直转换停止
*
* \param 无
*
* \retval 无
*/
void Adc_SGL_Always_Stop(void)
{
M0P_ADC->ALLSTART = 0u;
}
/**
* \brief
* ADC 顺序扫描转换开始
*
* \param 无
*
* \retval 无
*/
void Adc_SQR_Start(void)
{
M0P_ADC->SQRSTART = 1u;
}
/**
* \brief
* ADC 顺序扫描转换停止
*
* \param 无
*
* \retval 无
*/
void Adc_SQR_Stop(void)
{
M0P_ADC->SQRSTART = 0u;
}
/**
* \brief
* ADC 插队扫描转换开始
*
* \param 无
*
* \retval 无
*/
void Adc_JQR_Start(void)
{
M0P_ADC->JQRSTART = 1u;
}
/**
* \brief
* ADC 插队扫描转换停止
*
* \param 无
*
* \retval 无
*/
void Adc_JQR_Stop(void)
{
M0P_ADC->JQRSTART = 0u;
}
/**
* \brief
* ADC使能
*
* \param 无
*
* \retval 无
*/
void Adc_Enable(void)
{
M0P_ADC->CR0_f.EN = 1u;
}
/**
* \brief
* ADC除能
*
* \param 无
*
* \retval 无
*/
void Adc_Disable(void)
{
M0P_ADC->CR0_f.EN = 0u;
}
/**
* \brief
* 配置顺序扫描转换模式
*
* \param [in] pstcAdcCfg ADC配置指针
* \param [in] pstcAdcNormCfg 连续转换模式配置指针
*
* \retval en_result_t Ok: 配置成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t Adc_SqrModeCfg(stc_adc_sqr_cfg_t* pstcAdcSqrCfg)
{
if ((NULL == pstcAdcSqrCfg) || (pstcAdcSqrCfg->u8SqrCnt > 16))
{
return ErrorInvalidParameter;
}
M0P_ADC->CR1_f.RACCCLR = 0; //ADC转换结果累加寄存器(ADC_ResultAcc)清零
M0P_ADC->CR1_f.RACCEN = pstcAdcSqrCfg->enResultAcc;
M0P_ADC->CR1_f.DMASQR = pstcAdcSqrCfg->bSqrDmaTrig;
M0P_ADC->SQR2_f.CNT = pstcAdcSqrCfg->u8SqrCnt - 1;
return Ok;
}
/**
* \brief
* 配置插队扫描转换模式
*
* \param [in] pstcAdcCfg ADC配置指针
* \param [in] pstcAdcNormCfg 扫描转换模式配置指针
*
* \retval en_result_t Ok: 配置成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t Adc_JqrModeCfg(stc_adc_jqr_cfg_t* pstcAdcJqrCfg)
{
if ((NULL == pstcAdcJqrCfg) || (pstcAdcJqrCfg->u8JqrCnt > 4))
{
return ErrorInvalidParameter;
}
M0P_ADC->CR1_f.DMASQR = pstcAdcJqrCfg->bJqrDmaTrig;
M0P_ADC->JQR_f.CNT = pstcAdcJqrCfg->u8JqrCnt - 1;
return Ok;
}
/**
* \brief
* 配置单次转换通道
*
* \param [in]enstcAdcSampCh 转换通道
*
* \retval en_result_t Ok: 成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t Adc_CfgSglChannel( en_adc_samp_ch_sel_t enstcAdcSampCh)
{
M0P_ADC->CR0_f.SGLMUX = enstcAdcSampCh;
return Ok;
}
/**
* \brief
* 配置顺序扫描转换通道
*
* \param [in]enstcAdcSqrChMux 顺序扫描转换通道顺序
* \param [in]enstcAdcSampCh 转换通道
*
* \retval en_result_t Ok: 成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t Adc_CfgSqrChannel(en_adc_sqr_chmux_t enstcAdcSqrChMux, en_adc_samp_ch_sel_t enstcAdcSampCh)
{
en_result_t enResult = Ok;
switch(enstcAdcSqrChMux)
{
case AdcSQRCH0MUX:
M0P_ADC->SQR0_f.CH0MUX = enstcAdcSampCh;
break;
case AdcSQRCH1MUX:
M0P_ADC->SQR0_f.CH1MUX = enstcAdcSampCh;
break;
case AdcSQRCH2MUX:
M0P_ADC->SQR0_f.CH2MUX = enstcAdcSampCh;
break;
case AdcSQRCH3MUX:
M0P_ADC->SQR0_f.CH3MUX = enstcAdcSampCh;
break;
case AdcSQRCH4MUX:
M0P_ADC->SQR0_f.CH4MUX = enstcAdcSampCh;
break;
case AdcSQRCH5MUX:
M0P_ADC->SQR0_f.CH5MUX = enstcAdcSampCh;
break;
case AdcSQRCH6MUX:
M0P_ADC->SQR1_f.CH6MUX = enstcAdcSampCh;
break;
case AdcSQRCH7MUX:
M0P_ADC->SQR1_f.CH7MUX = enstcAdcSampCh;
break;
case AdcSQRCH8MUX:
M0P_ADC->SQR1_f.CH8MUX = enstcAdcSampCh;
break;
case AdcSQRCH9MUX:
M0P_ADC->SQR1_f.CH9MUX = enstcAdcSampCh;
break;
case AdcSQRCH10MUX:
M0P_ADC->SQR1_f.CH10MUX = enstcAdcSampCh;
break;
case AdcSQRCH11MUX:
M0P_ADC->SQR1_f.CH11MUX = enstcAdcSampCh;
break;
case AdcSQRCH12MUX:
M0P_ADC->SQR2_f.CH12MUX = enstcAdcSampCh;
break;
case AdcSQRCH13MUX:
M0P_ADC->SQR2_f.CH13MUX = enstcAdcSampCh;
break;
case AdcSQRCH14MUX:
M0P_ADC->SQR2_f.CH14MUX = enstcAdcSampCh;
break;
case AdcSQRCH15MUX:
M0P_ADC->SQR2_f.CH15MUX = enstcAdcSampCh;
break;
default:
enResult = ErrorInvalidParameter;
break;
}
return enResult;
}
/**
* \brief
* 配置插队扫描转换通道
*
* \param [in]enstcAdcSqrChMux 插队扫描转换通道顺序
* \param [in]enstcAdcSampCh 转换通道
*
* \retval en_result_t Ok: 成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t Adc_CfgJqrChannel(en_adc_jqr_chmux_t enstcAdcJqrChMux, en_adc_samp_ch_sel_t enstcAdcSampCh)
{
en_result_t enResult = Ok;
switch(enstcAdcJqrChMux)
{
case AdcJQRCH0MUX:
M0P_ADC->JQR_f.CH0MUX = enstcAdcSampCh;
break;
case AdcJQRCH1MUX:
M0P_ADC->JQR_f.CH1MUX = enstcAdcSampCh;
break;
case AdcJQRCH2MUX:
M0P_ADC->JQR_f.CH2MUX = enstcAdcSampCh;
break;
case AdcJQRCH3MUX:
M0P_ADC->JQR_f.CH3MUX = enstcAdcSampCh;
break;
default:
enResult = ErrorInvalidParameter;
break;
}
return enResult;
}
/**
* \brief
* 获取采样值
*
*
* \retval en_result_t 采样值
*/
uint32_t Adc_GetSglResult(void)
{
return M0P_ADC->RESULT;
}
/**
* \brief
* 获取采样值
*
* \param [in] enstcAdcSqrChMux 顺序扫描通道序号 @ref en_adc_sqr_chmux_t
*
* \retval en_result_t 采样值
*/
uint32_t Adc_GetSqrResult(en_adc_sqr_chmux_t enstcAdcSqrChMux)
{
volatile uint32_t *BaseSqrResultAddress = &(M0P_ADC->SQRRESULT0);
return *(BaseSqrResultAddress + enstcAdcSqrChMux);
}
/**
* \brief
* 获取插队扫描采样值
*
* \param [in] enstcAdcJqrChMux 插队扫描通道序号@ref en_adc_jqr_chmux_t
*
* \retval en_result_t 采样值
*/
uint32_t Adc_GetJqrResult(en_adc_jqr_chmux_t enstcAdcJqrChMux)
{
volatile uint32_t *BaseJqrResultAddress = &(M0P_ADC->JQRRESULT0);
return *(BaseJqrResultAddress + enstcAdcJqrChMux);
}
/**
* \brief
* 获取累加采样值
*
*
* \retval en_result_t 累加采样结果
*/
uint32_t Adc_GetAccResult(void)
{
return M0P_ADC->RESULTACC;
}
/**
* \brief
* 清零累加采样值
*
* \param 无
*
* \retval 无
*/
void Adc_ClrAccResult(void)
{
M0P_ADC->CR1_f.RACCCLR = 0u;
}
/**
* \brief
* ADC比较使能(比较中断)
*
* \param [in] pstcAdcIrqCfg ADC比较配置 @ref stc_adc_threshold_cfg_t
*
* \retval 无
*/
void Adc_ThresholdCfg(stc_adc_threshold_cfg_t* pstcAdcThrCfg)
{
M0P_ADC->HT = pstcAdcThrCfg->u32AdcHighThd;
M0P_ADC->LT = pstcAdcThrCfg->u32AdcLowThd;
M0P_ADC->CR1_f.THCH = pstcAdcThrCfg->enSampChSel;
M0P_ADC->CR1_f.REGCMP = pstcAdcThrCfg->bAdcRegCmp;
M0P_ADC->CR1_f.HTCMP = pstcAdcThrCfg->bAdcHtCmp;
M0P_ADC->CR1_f.LTCMP = pstcAdcThrCfg->bAdcLtCmp;
}
//@} // AdcGroup
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+1657
View File
File diff suppressed because it is too large Load Diff
+206
View File
@@ -0,0 +1,206 @@
/******************************************************************************
*Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file aes.c
**
** Common API of AES.
** @link AesGroup Some description @endlink
**
** - 2019-04-16
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "aes.h"
/**
*******************************************************************************
** \addtogroup AesGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
* \brief
* AES 加密
*
* \param [in] pstcAesCfg AES 配置结构体 @ref stc_aes_cfg_t
*
* \retval en_result_t Ok: 配置成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t AES_Encrypt(stc_aes_cfg_t* pstcAesCfg)
{
if (NULL == pstcAesCfg)
{
return ErrorInvalidParameter;
}
M0P_AES->CR_f.KEYSIZE = pstcAesCfg->enKeyLen;
//Key cfg
M0P_AES->KEY0 = pstcAesCfg->pu32Key[0];
M0P_AES->KEY1 = pstcAesCfg->pu32Key[1];
M0P_AES->KEY2 = pstcAesCfg->pu32Key[2];
M0P_AES->KEY3 = pstcAesCfg->pu32Key[3];
if(AesKey192 == pstcAesCfg->enKeyLen)
{
M0P_AES->KEY4 = pstcAesCfg->pu32Key[4];
M0P_AES->KEY5 = pstcAesCfg->pu32Key[5];
}
if(AesKey256 == pstcAesCfg->enKeyLen)
{
M0P_AES->KEY4 = pstcAesCfg->pu32Key[4];
M0P_AES->KEY5 = pstcAesCfg->pu32Key[5];
M0P_AES->KEY6 = pstcAesCfg->pu32Key[6];
M0P_AES->KEY7 = pstcAesCfg->pu32Key[7];
}
//Data cfg
M0P_AES->DATA0 = pstcAesCfg->pu32Plaintext[0];
M0P_AES->DATA1 = pstcAesCfg->pu32Plaintext[1];
M0P_AES->DATA2 = pstcAesCfg->pu32Plaintext[2];
M0P_AES->DATA3 = pstcAesCfg->pu32Plaintext[3];
M0P_AES->CR_f.MODE = 0;//Encry
M0P_AES->CR_f.START = 1;
while(M0P_AES->CR_f.START == 1)
{
;
}
pstcAesCfg->pu32Cipher[0] = M0P_AES->DATA0;
pstcAesCfg->pu32Cipher[1] = M0P_AES->DATA1;
pstcAesCfg->pu32Cipher[2] = M0P_AES->DATA2;
pstcAesCfg->pu32Cipher[3] = M0P_AES->DATA3;
return Ok;
}
/**
* \brief
* AES 解密
*
* \param [in] pstcAesCfg AES 配置结构体 @ref stc_aes_cfg_t
*
* \retval en_result_t Ok: 配置成功
* \retval en_result_t ErrorInvalidParameter: 无效参数
*/
en_result_t AES_Decrypt(stc_aes_cfg_t* pstcAesCfg)
{
if (NULL == pstcAesCfg)
{
return ErrorInvalidParameter;
}
M0P_AES->CR_f.KEYSIZE = pstcAesCfg->enKeyLen;
//Key cfg
M0P_AES->KEY0 = pstcAesCfg->pu32Key[0];
M0P_AES->KEY1 = pstcAesCfg->pu32Key[1];
M0P_AES->KEY2 = pstcAesCfg->pu32Key[2];
M0P_AES->KEY3 = pstcAesCfg->pu32Key[3];
if(AesKey192 == pstcAesCfg->enKeyLen)
{
M0P_AES->KEY4 = pstcAesCfg->pu32Key[4];
M0P_AES->KEY5 = pstcAesCfg->pu32Key[5];
}
if(AesKey256 == pstcAesCfg->enKeyLen)
{
M0P_AES->KEY4 = pstcAesCfg->pu32Key[4];
M0P_AES->KEY5 = pstcAesCfg->pu32Key[5];
M0P_AES->KEY6 = pstcAesCfg->pu32Key[6];
M0P_AES->KEY7 = pstcAesCfg->pu32Key[7];
}
//Data cfg
M0P_AES->DATA0 = pstcAesCfg->pu32Cipher[0];
M0P_AES->DATA1 = pstcAesCfg->pu32Cipher[1];
M0P_AES->DATA2 = pstcAesCfg->pu32Cipher[2];
M0P_AES->DATA3 = pstcAesCfg->pu32Cipher[3];
M0P_AES->CR_f.MODE = 1;//UnEncry
M0P_AES->CR_f.START = 1;
while(M0P_AES->CR_f.START == 1)
{
;
}
pstcAesCfg->pu32Plaintext[0] = M0P_AES->DATA0;
pstcAesCfg->pu32Plaintext[1] = M0P_AES->DATA1;
pstcAesCfg->pu32Plaintext[2] = M0P_AES->DATA2;
pstcAesCfg->pu32Plaintext[3] = M0P_AES->DATA3;
return Ok;
}
//@} // AesGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+143
View File
@@ -0,0 +1,143 @@
/******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file bgr.c
**
** Common API of bgr.
** @link flashGroup Some description @endlink
**
** - 2018-05-08
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "bgr.h"
/**
*******************************************************************************
** \addtogroup FlashGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief BGR 使能
**
**
** \retval Null
*****************************************************************************/
void Bgr_BgrEnable(void)
{
M0P_BGR->CR |= 0x1u;
delay10us(2);
}
/**
*****************************************************************************
** \brief BGR 禁止
**
**
** \retval Null
*****************************************************************************/
void Bgr_BgrDisable(void)
{
M0P_BGR->CR &= 0x2u;
}
/**
*****************************************************************************
** \brief BGR 温度传感器使能(需要先开启BGR)
**
**
** \retval Null
*****************************************************************************/
void Bgr_TempSensorEnable(void)
{
M0P_BGR->CR |= 0x2u;
delay10us(2);
}
/**
*****************************************************************************
** \brief BGR 温度传感器禁止
**
**
** \retval Null
*****************************************************************************/
void Bgr_TempSensorDisable(void)
{
M0P_BGR->CR &= 0x1u;
}
//@} // BgrGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+1381
View File
File diff suppressed because it is too large Load Diff
+438
View File
@@ -0,0 +1,438 @@
/******************************************************************************
*Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file crc.c
**
** Common API of crc.
** @link crcGroup Some description @endlink
**
** - 2017-05-16
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "crc.h"
/**
*******************************************************************************
** \addtogroup CrcGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief CRC16 编码(字节填充方式)
**
** 该函数主要用于生成CRC16编码.
**
** \param [in] pu8Data 待编码数据指针(字节方式输入)
** \param [in] u32Len 待编码数据长度(字节数)
**
** \retval CRC16 CRC16编码值.
*****************************************************************************/
uint16_t CRC16_Get8(uint8_t* pu8Data, uint32_t u32Len)
{
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 0;
M0P_CRC->RESULT = 0xFFFF;
for(u32Index = 0;u32Index<u32Len;u32Index++)
{
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = pu8Data[u32Index];
}
return (M0P_CRC->RESULT_f.RESULT);
}
/**
*****************************************************************************
** \brief CRC16 编码(半字填充方式)
**
** 该函数主要用于生成CRC16编码.
**
** \param [in] pu16Data 待编码数据指针(半字方式输入)
** \param [in] u32Len 待编码数据长度(半字数)
**
** \retval CRC16 CRC16编码值.
*****************************************************************************/
uint16_t CRC16_Get16(uint16_t* pu16Data, uint32_t u32Len)
{
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 0;
M0P_CRC->RESULT_f.RESULT = 0xFFFF;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = pu16Data[u32Index];
}
return (M0P_CRC->RESULT_f.RESULT);
}
/**
*****************************************************************************
** \brief CRC16 编码(字填充方式)
**
** 该函数主要用于生成CRC16编码.
**
** \param [in] pu32Data 待编码数据指针(字方式输入)
** \param [in] u32Len 待编码数据长度(字数)
**
** \retval CRC16 CRC16编码值.
*****************************************************************************/
uint16_t CRC16_Get32(uint32_t* pu32Data, uint32_t u32Len)
{
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 0;
M0P_CRC->RESULT_f.RESULT = 0xFFFF;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
M0P_CRC->DATA_f.DATA = pu32Data[u32Index];
}
return (M0P_CRC->RESULT_f.RESULT);
}
/**
*****************************************************************************
** \brief CRC16 校验(字节填充方式)
**
** 该函数主要用于对数据及CRC16值进行校验.
**
** \param [in] pu8Data 待校验数据指针(字节方式输入)
** \param [in] u32Len 待校验数据长度(字节数)
** \param [in] u16CRC 待校验CRC16值
**
** \retval Ok CRC校验正确
** \retval Error CRC校验错误
*****************************************************************************/
en_result_t CRC16_Check8(uint8_t* pu8Data, uint32_t u32Len, uint16_t u16CRC)
{
en_result_t enResult = Ok;
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 0;
M0P_CRC->RESULT_f.RESULT = 0xFFFF;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = pu8Data[u32Index];
}
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = (uint8_t)((((uint32_t)u16CRC)>>0)&0xFF);
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = (uint8_t)(((uint32_t)u16CRC>>8)&0xFF);
enResult = M0P_CRC->CR_f.FLAG ? Ok : Error;
return (enResult);
}
/**
*****************************************************************************
** \brief CRC16 校验(半字填充方式)
**
** 该函数主要用于对数据及CRC16值进行校验.
**
** \param [in] pu16Data 待校验数据指针(半字方式输入)
** \param [in] u32Len 待校验数据长度(半字数)
** \param [in] u16CRC 待校验CRC16值
**
** \retval Ok CRC校验正确
** \retval Error CRC校验错误
*****************************************************************************/
en_result_t CRC16_Check16(uint16_t* pu16Data, uint32_t u32Len, uint16_t u16CRC)
{
en_result_t enResult = Ok;
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 0;
M0P_CRC->RESULT_f.RESULT = 0xFFFF;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = pu16Data[u32Index];
}
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = u16CRC;
enResult = M0P_CRC->CR_f.FLAG ? Ok : Error;
return (enResult);
}
/**
*****************************************************************************
** \brief CRC16 校验(字填充方式)
**
** 该函数主要用于对数据及CRC16值进行校验.
**
** \param [in] pu32Data 待校验数据指针(字方式输入)
** \param [in] u32Len 待校验数据长度(字数)
** \param [in] u16CRC 待校验CRC16值
**
** \retval Ok CRC校验正确
** \retval Error CRC校验错误
*****************************************************************************/
en_result_t CRC16_Check32(uint32_t* pu32Data, uint32_t u32Len, uint16_t u16CRC)
{
en_result_t enResult = Ok;
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 0;
M0P_CRC->RESULT_f.RESULT = 0xFFFFFFFFu;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint32_t*)(&(M0P_CRC->DATA))) = pu32Data[u32Index];
}
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = ((uint16_t)u16CRC);
enResult = M0P_CRC->CR_f.FLAG ? Ok : Error;
return (enResult);
}
/**
*****************************************************************************
** \brief CRC16 编码(字节填充方式)
**
** 该函数主要用于生成CRC16编码.
**
** \param [in] pu8Data 待编码数据指针(字节方式输入)
** \param [in] u32Len 待编码数据长度(字节数)
**
** \retval CRC16 CRC16编码值.
*****************************************************************************/
uint32_t CRC32_Get8(uint8_t* pu8Data, uint32_t u32Len)
{
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 1;
M0P_CRC->RESULT = 0xFFFFFFFFu;
for(u32Index = 0;u32Index<u32Len;u32Index++)
{
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = pu8Data[u32Index];
}
return (M0P_CRC->RESULT_f.RESULT);
}
/**
*****************************************************************************
** \brief CRC16 编码(半字填充方式)
**
** 该函数主要用于生成CRC16编码.
**
** \param [in] pu16Data 待编码数据指针(半字方式输入)
** \param [in] u32Len 待编码数据长度(半字数)
**
** \retval CRC16 CRC16编码值.
*****************************************************************************/
uint32_t CRC32_Get16(uint16_t* pu16Data, uint32_t u32Len)
{
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 1;
M0P_CRC->RESULT_f.RESULT = 0xFFFFFFFFu;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = pu16Data[u32Index];
}
return (M0P_CRC->RESULT_f.RESULT);
}
/**
*****************************************************************************
** \brief CRC16 编码(字填充方式)
**
** 该函数主要用于生成CRC16编码.
**
** \param [in] pu32Data 待编码数据指针(字方式输入)
** \param [in] u32Len 待编码数据长度(字数)
**
** \retval CRC16 CRC16编码值.
*****************************************************************************/
uint32_t CRC32_Get32(uint32_t* pu32Data, uint32_t u32Len)
{
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 1;
M0P_CRC->RESULT_f.RESULT = 0xFFFFFFFFu;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
M0P_CRC->DATA_f.DATA = pu32Data[u32Index];
}
return (M0P_CRC->RESULT_f.RESULT);
}
/**
*****************************************************************************
** \brief CRC16 校验(字节填充方式)
**
** 该函数主要用于对数据及CRC16值进行校验.
**
** \param [in] pu8Data 待校验数据指针(字节方式输入)
** \param [in] u32Len 待校验数据长度(字节数)
** \param [in] u16CRC 待校验CRC16值
**
** \retval Ok CRC校验正确
** \retval Error CRC校验错误
*****************************************************************************/
en_result_t CRC32_Check8(uint8_t* pu8Data, uint32_t u32Len, uint32_t u32CRC)
{
en_result_t enResult = Ok;
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 1;
M0P_CRC->RESULT_f.RESULT = 0xFFFFFFFFu;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = pu8Data[u32Index];
}
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = (uint8_t)((u32CRC>>0)&0xFF);
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = (uint8_t)((u32CRC>>8)&0xFF);
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = (uint8_t)((u32CRC>>16)&0xFF);
*((volatile uint8_t*)(&(M0P_CRC->DATA))) = (uint8_t)((u32CRC>>24)&0xFF);
enResult = M0P_CRC->CR_f.FLAG ? Ok : Error;
return (enResult);
}
/**
*****************************************************************************
** \brief CRC16 校验(半字填充方式)
**
** 该函数主要用于对数据及CRC16值进行校验.
**
** \param [in] pu16Data 待校验数据指针(半字方式输入)
** \param [in] u32Len 待校验数据长度(半字数)
** \param [in] u16CRC 待校验CRC16值
**
** \retval Ok CRC校验正确
** \retval Error CRC校验错误
*****************************************************************************/
en_result_t CRC32_Check16(uint16_t* pu16Data, uint32_t u32Len, uint32_t u32CRC)
{
en_result_t enResult = Ok;
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 1;
M0P_CRC->RESULT_f.RESULT = 0xFFFFFFFFu;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = pu16Data[u32Index];
}
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = (uint16_t)((u32CRC>>0)&0xFFFF);
*((volatile uint16_t*)(&(M0P_CRC->DATA))) = (uint16_t)((u32CRC>>16)&0xFFFF);
enResult = M0P_CRC->CR_f.FLAG ? Ok : Error;
return (enResult);
}
/**
*****************************************************************************
** \brief CRC16 校验(字填充方式)
**
** 该函数主要用于对数据及CRC16值进行校验.
**
** \param [in] pu32Data 待校验数据指针(字方式输入)
** \param [in] u32Len 待校验数据长度(字数)
** \param [in] u16CRC 待校验CRC16值
**
** \retval Ok CRC校验正确
** \retval Error CRC校验错误
*****************************************************************************/
en_result_t CRC32_Check32(uint32_t* pu32Data, uint32_t u32Len, uint32_t u32CRC)
{
en_result_t enResult = Ok;
uint32_t u32Index = 0;
M0P_CRC->CR_f.CR = 1;
M0P_CRC->RESULT_f.RESULT = 0xFFFFFFFFu;
for (u32Index=0; u32Index<u32Len; u32Index++)
{
*((volatile uint32_t*)(&(M0P_CRC->DATA))) = pu32Data[u32Index];
}
*((volatile uint32_t*)(&(M0P_CRC->DATA))) = u32CRC;
enResult = M0P_CRC->CR_f.FLAG ? Ok : Error;
return (enResult);
}
//@} // CrcGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+253
View File
@@ -0,0 +1,253 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file dac.c
**
** dac driver API.
**
** - 2019-04-10 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "dac.h"
/**
******************************************************************************
** \addtogroup AdcGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
******************************************************************************
** \brief 使能相关通道的DMA DMA_CR0中的DMAEN0
**
** @param NewState : TRUE 或者 FALSE
** \retval 无
**
******************************************************************************/
void Dac_DmaCmd(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_DAC->CR0)), 12, NewState);
}
/**
******************************************************************************
** \brief 配置DAC的DMA下溢中断, DMA_CR0中的DMAUDRIE0
**
** @param NewState : TRUE 或者 FALSE
** \retval 无
**
******************************************************************************/
void Dac_DmaITCfg(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_DAC->CR0)), 13, NewState);
}
/**
******************************************************************************
** \brief 获取DAC的DMA下溢中断标志位状态, DMA_SR中的DMAUDR0
**
** @param 无
** \retval TRUE 或 FALSE
**
******************************************************************************/
boolean_t Dac_GetITStatus(void)
{
return GetBit((uint32_t)(&(M0P_DAC->SR)), 13);
}
/**
******************************************************************************
** \brief 配置DAC的使能与禁止, DMA_CR0中的EN0
**
** @param NewState : TRUE 或者 FALSE
** \retval 无
**
******************************************************************************/
void Dac_Cmd(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_DAC->CR0)), 0, NewState);
}
/**
******************************************************************************
** \brief 软件触发寄存器,触发DAC转换 DMA_SWTRIGR中的SWTRIG0
**
** @param 无
** \retval 无
**
******************************************************************************/
void Dac_SoftwareTriggerCmd(void)
{
SetBit((uint32_t)(&(M0P_DAC->SWTRIGR)), 0, 1);
}
/**
******************************************************************************
** \brief 初始化DAC0
**
** @param DAC_InitStruct : 用于初始化DAC0的结构体
** \retval 无
**
******************************************************************************/
void Dac_Init(stc_dac_cfg_t* DAC_InitStruct)
{
M0P_DAC->CR0_f.BOFF0 = DAC_InitStruct->boff_t;
M0P_DAC->CR0_f.TEN0 = DAC_InitStruct->ten_t;
M0P_DAC->CR0_f.TSEL0 = DAC_InitStruct->tsel_t;
M0P_DAC->CR0_f.WAVE0 = DAC_InitStruct->wave_t;
M0P_DAC->CR0_f.MAMP0 = DAC_InitStruct->mamp_t;
M0P_DAC->CR0_f.SREF0 = DAC_InitStruct->sref_t;
if(DAC_InitStruct->align == DacLeftAlign)
{
M0P_DAC->DHR12L0_f.DHR0 = DAC_InitStruct->dhr12;
}
else if(DAC_InitStruct->align == DacRightAlign)
{
M0P_DAC->DHR12R0_f.DHR0 = DAC_InitStruct->dhr12;
}
else
{
M0P_DAC->DHR8R0_f.DHR0 = DAC_InitStruct->dhr8;
}
}
/**
******************************************************************************
** \brief 向DAC0的数据保持寄存器写数据
**
** @param DAC_Channel: Dac_0
** @param DAC_Align : Right_Align 与Left_Align
** @param DAC_Bit : Bit8 与Bit12
** @param Data : 所要发送的数据
** \retval 无
**
******************************************************************************/
void Dac_SetChannelData(en_align_t DAC_Align, en_bitno_t DAC_Bit, uint16_t Data)
{
if(DAC_Align == DacRightAlign)
{
if(DAC_Bit == DacBit8)
{
M0P_DAC->DHR8R0_f.DHR0 = (uint8_t)Data;
}
else if(DAC_Bit == DacBit12)
{
M0P_DAC->DHR12R0_f.DHR0 = Data;
}
else
{
return;
}
}
else if(DAC_Align == DacLeftAlign)
{
if(DAC_Bit == DacBit8)
{
return;
}
else if(DAC_Bit == DacBit12)
{
M0P_DAC->DHR12L0_f.DHR0 = Data;
}
else
{
return;
}
}
else
{
return;
}
}
/**
******************************************************************************
** \brief 获取DAC数据输出寄存器DAC_DOR0
**
** @param 无
** \retval DAC_DOR0的值
**
******************************************************************************/
uint16_t Dac_GetDataOutputValue(void)
{
uint16_t tmp;
tmp = M0P_DAC->DOR0_f.DOR0;
return tmp&0x0fff;
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+250
View File
@@ -0,0 +1,250 @@
/*******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file ddl.c
**
** Common API of DDL.
** @link ddlGroup Some description @endlink
**
** - 2019-03-03
**
******************************************************************************/
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "ddl.h"
/**
******************************************************************************
** \addtogroup DDL Common Functions
******************************************************************************/
//@{
/******************************************************************************/
/* Local pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************/
/* Global variable definitions (declared in header file with 'extern') */
/******************************************************************************/
/******************************************************************************/
/* Local type definitions ('typedef') */
/******************************************************************************/
/******************************************************************************/
/* Local variable definitions ('static') */
/******************************************************************************/
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/******************************************************************************/
/* Function implementation - global ('extern') and local ('static') */
/******************************************************************************/
#ifndef __DEBUG
#define __DEBUG
//#define __CC_ARM
#endif
uint32_t Log2(uint32_t u32Val)
{
uint32_t u32V1 = 0;
if(0u == u32Val)
{
return 0;
}
while(u32Val > 1u)
{
u32V1++;
u32Val /=2;
}
return u32V1;
}
/**
*******************************************************************************
** \brief Memory clear function for DDL_ZERO_STRUCT()
******************************************************************************/
void ddl_memclr(void *pu8Address, uint32_t u32Count)
{
uint8_t *pu8Addr = (uint8_t *)pu8Address;
if(NULL == pu8Addr)
{
return;
}
while (u32Count--)
{
*pu8Addr++ = 0;
}
}
/**
* \brief delay1ms
* delay approximately 1ms.
* \param [in] u32Cnt
* \retval void
*/
void delay1ms(uint32_t u32Cnt)
{
uint32_t u32end;
SysTick->LOAD = 0xFFFFFF;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while(u32Cnt-- > 0)
{
SysTick->VAL = 0;
u32end = 0x1000000 - SystemCoreClock/1000;
while(SysTick->VAL > u32end)
{
;
}
}
SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}
/**
* \brief delay100us
* delay approximately 100us.
* \param [in] u32Cnt
* \retval void
*/
void delay100us(uint32_t u32Cnt)
{
uint32_t u32end;
SysTick->LOAD = 0xFFFFFF;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while(u32Cnt-- > 0)
{
SysTick->VAL = 0;
u32end = 0x1000000 - SystemCoreClock/10000;
while(SysTick->VAL > u32end)
{
;
}
}
SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}
/**
* \brief delay10us
* delay approximately 10us.
* \param [in] u32Cnt
* \retval void
*/
void delay10us(uint32_t u32Cnt)
{
uint32_t u32end;
SysTick->LOAD = 0xFFFFFF;
SysTick->VAL = 0;
SysTick->CTRL = SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_CLKSOURCE_Msk;
while(u32Cnt-- > 0)
{
SysTick->VAL = 0;
u32end = 0x1000000 - SystemCoreClock/100000;
while(SysTick->VAL > u32end)
{
;
}
}
SysTick->CTRL = (SysTick->CTRL & (~SysTick_CTRL_ENABLE_Msk));
}
/**
* \brief set register bit
*
* \param [in] addr
* \param [in] offset
* \retval void
*/
void SetBit(uint32_t addr, uint32_t offset, boolean_t bFlag)
{
if(TRUE == bFlag)
{
*((volatile uint32_t *)(addr)) |= ((1UL)<<(offset));
}
else
{
*((volatile uint32_t *)(addr)) &= (~(1UL<<(offset)));
}
}
/**
* \brief get register bit
*
* \param [in] addr
* \param [in] offset
* \retval void
*/
boolean_t GetBit(uint32_t addr, uint32_t offset)
{
return ((((*((volatile uint32_t *)(addr))) >> (offset)) & 1u) > 0) ? TRUE : FALSE;
}
//@} // DDL Functions
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+119
View File
@@ -0,0 +1,119 @@
/******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file debug.c
**
** Common API of debug.
** @link flashGroup Some description @endlink
**
** - 2018-05-08
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "debug.h"
/**
*******************************************************************************
** \addtogroup FlashGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief 调试模式下模块功能计数使能
**
**
** \retval TRUE or FALSE
*****************************************************************************/
en_result_t Debug_ActiveEnable(en_debug_module_active_t enModule)
{
M0P_DEBUG_ACTIVE->DEBUG_ACTIVE &= ~(uint32_t)enModule;
return Ok;
}
/**
*****************************************************************************
** \brief 调试模式下模块功能计数暂停
**
**
** \retval TRUE or FALSE
*****************************************************************************/
en_result_t Debug_ActiveDisable(en_debug_module_active_t enModule)
{
M0P_DEBUG_ACTIVE->DEBUG_ACTIVE |= (uint32_t)enModule;
return Ok;
}
//@} // BgrGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+624
View File
@@ -0,0 +1,624 @@
/******************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file dmac.c
**
** A detailed description is available at
** @link DmacGroup Dmac description @endlink
**
** - 2018-03-09 1.0 Hongjh First version for Device Driver Library of Dmac.
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "dmac.h"
/**
*******************************************************************************
** \addtogroup DmacGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************/
/* DMA */
/******************************************************************************/
/************** Bits definition for DMA_CONFBx(x=0~1) register *************/
#define DMA_TRANSFER_WIDTH_Pos (26U) /*!< DMAC_CONFBx: ERR_IE Position */
#define DMA_TRANSFER_WIDTH_Msk (0x03U << DMA_TRANSFER_WIDTH_Pos) /*!< DMAC_CONFBx: ERR_IE Mask 0x0C000000 */
/************** Bits definition for DMA_CONFBx(x=0~1) register *************/
#define DMA_ERR_IE_Pos (20U) /*!< DMAC_CONFBx: ERR_IE Position */
#define DMA_ERR_IE_Msk (0x01U << DMA_ERR_IE_Pos) /*!< DMAC_CONFBx: ERR_IE Mask 0x00000010 */
/************** Bits definition for DMA_CONFBx(x=0~1) register *************/
#define DMA_FIS_IE_Pos (19U) /*!< DMAC_CONFBx: FIS_IE Position */
#define DMA_FIS_IE_Msk (0x01U << DMA_FIS_IE_Pos) /*!< DMAC_CONFBx: FIS_IE Mask 0x00000010 */
/************** Bits definition for DMA_CONFBx(x=0~1) register *************/
#define DMA_STAT_Pos (16U) /*!< DMAC_CONFBx: STAT Position */
#define DMA_STAT_Msk (0x07U << DMA_STAT_Pos) /*!< DMAC_CONFBx: STAT Mask 0x00070000 */
/************** Bits definition for DMA_CONFBx(x=0~1) register *************/
#define DMA_TRANSFER_RELOAD_Pos (0U) /*!< DMAC_CONFBx: MSK Position */
#define DMA_TRANSFER_RELOAD_Msk (0x01U << DMA_TRANSFER_RELOAD_Pos) /*!< DMAC_CONFBx: MSK Mask 0x00000010 */
/************** Bits definition for DMA_CONFAx(x=0~1) register *************/
#define DMA_CH_ENABLE_Pos (31U) /*!< DMAC_CONFAx: ENS Position */
#define DMA_CH_ENABLE_Msk (0x01U << DMA_CH_ENABLE_Pos) /*!< DMAC_CONFAx: ENS Mask 0x80000000 */
/************** Bits definition for DMA_CONFAx(x=0~1) register *************/
#define DMA_CH_PAUSE_Pos (30U) /*!< DMAC_CONFAx: PAS Position */
#define DMA_CH_PAUSE_Msk (0x01U << DMA_CH_PAUSE_Pos) /*!< DMAC_CONFAx: PAS Mask 0x40000000 */
/************** Bits definition for DMA_CONFAx(x=0~1) register *************/
#define DMA_SOFTWARE_START_Pos (29U) /*!< DMAC_CONFAx: ENS Position */
#define DMA_SOFTWARE_START_Msk (0x01U << DMA_SOFTWARE_START_Pos) /*!< DMAC_CONFAx: ENS Mask 0x20000000 */
/************** Bits definition for DMA_CONFAx(x=0~1) register *************/
#define DMA_TRI_SEL_Pos (22U) /*!< DMAC_CONFAx: TRISEL Position */
#define DMA_TRI_SEL_Msk (0x7FU << DMA_TRI_SEL_Pos) /*!< DMAC_CONFAx: TRISEL Mask 0x1FC00000 */
/************** Bits definition for DMA_CONFAx(x=0~1) register *************/
#define DMA_BC_SEL_Pos (16U) /*!< DMAC_CONFAx: TRISEL Position */
#define DMA_BC_SEL_Msk (0x0FU << DMA_BC_SEL_Pos) /*!< DMAC_CONFAx: TRISEL Mask 0x000F0000 */
/************** Bits definition for DMA_CONFAx(x=0~1) register *************/
#define DMA_TC_SEL_Pos (0U) /*!< DMAC_CONFAx: TRISEL Position */
#define DMA_TC_SEL_Msk (0xFFFFU << DMA_TC_SEL_Pos) /*!< DMAC_CONFAx: TRISEL Mask 0x0000FFFF */
/************** Bits definition for DMA_CONF register *************/
#define DMA_ENABLE_Pos (31U) /*!< DMAC_CONF: TRISEL Position */
#define DMA_ENABLE_Msk (0x01U << DMA_ENABLE_Pos) /*!< DMAC_CONF: TRISEL Mask 0x80000000 */
/************** Bits definition for DMA_CONF register *************/
#define DMA_PRIORITY_Pos (28U) /*!< DMAC_CONF: TRISEL Position */
#define DMA_PRIORITY_Msk (0x01U << DMA_PRIORITY_Pos) /*!< DMAC_CONF: TRISEL Mask 0x10000000 */
/*! Dmac通道参数有效性检查. */
#define IS_VALID_CH(x) \
( (DmaCh0 == (x)) || \
(DmaCh1 == (x)))
/*! DMA 传输数据宽度,参数有效性检查. */
#define IS_VALID_TRN_WIDTH(x) \
( (DmaMsk8Bit == (x)) || \
(DmaMsk16Bit == (x)) || \
(DmaMsk32Bit == (x)))
/*! DMA源地址控制模式,参数有效性检查. */
#define IS_VALID_SRC_ADDR_MODE(x) \
( (DmaMskSrcAddrFix == (x)) || \
(DmaMskSrcAddrInc == (x)))
/*! DMA目的地址控制模式,参数有效性检查. */
#define IS_VALID_DST_ADDR_MODE(x) \
( (DmaMskDstAddrFix == (x)) || \
(DmaMskDstAddrInc == (x)))
/*! DMA 优先级, 参数有效性检查. */
#define IS_VALID_PRIO_MODE(x) \
( (DmaMskPriorityFix == (x)) || \
(DmaMskPriorityLoop == (x)))
/*! DMA 传输模式,参数有效性检查. */
#define IS_VALID_TRANSFER_MODE(x) \
( (DmaMskOneTransfer == (x)) || \
(DmaMskContinuousTransfer == (x)))
/*! 块传输大小,参数有效性检查. */
#define IS_VALID_BLKSIZE(x) ((!((x) & ~(DMA_BC_SEL_Msk >> DMA_BC_SEL_Pos)))&&((x)>0))
/*! 块传输次数,参数有效性检查. */
#define IS_VALID_TRNCNT(x) (!((x) & ~(DMA_TC_SEL_Msk >> DMA_TC_SEL_Pos)))
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*******************************************************************************
** \brief 初始化DMAC通道
**
** \param [in] enCh 指定通道.
** \param [in] pstcCfg DMAC通道初始化配置结构体指针.
**
** \retval Ok 初始化成功.
** \retval ErrorInvalidParameter pstcCfg是空指针.
**
** \note None
**
******************************************************************************/
en_result_t Dma_InitChannel(en_dma_channel_t enCh, stc_dma_cfg_t* pstcCfg)
{
ASSERT(IS_VALID_CH(enCh));
ASSERT(NULL != pstcCfg);
ASSERT(IS_VALID_BLKSIZE(pstcCfg->u16BlockSize));
ASSERT(IS_VALID_TRNCNT(pstcCfg->u16TransferCnt));
ASSERT(IS_VALID_TRN_WIDTH(pstcCfg->enTransferWidth));
ASSERT(IS_VALID_SRC_ADDR_MODE(pstcCfg->enSrcAddrMode));
ASSERT(IS_VALID_DST_ADDR_MODE(pstcCfg->enDstAddrMode));
ASSERT(IS_VALID_PRIO_MODE(pstcCfg->enPriority));
ASSERT(IS_VALID_TRANSFER_MODE(pstcCfg->enTransferMode));
/* 检查通道值有效性和pstcCfg是否空指针 */
if (NULL == pstcCfg)
{
return ErrorInvalidParameter;
}
*(&M0P_DMAC->CONFB0+enCh) = 0;
*(&M0P_DMAC->CONFB0+enCh) = (uint32_t)pstcCfg->enMode |
(uint32_t)pstcCfg->enTransferWidth |
(uint32_t)pstcCfg->enSrcAddrMode |
(uint32_t)pstcCfg->enDstAddrMode |
(uint32_t)pstcCfg->enSrcAddrReloadCtl |
(uint32_t)pstcCfg->enDestAddrReloadCtl|
(uint32_t)pstcCfg->enSrcBcTcReloadCtl |
(uint32_t)pstcCfg->enTransferMode;
/*首先把TRI_SEL[6:0] BC[3:0] TC[15:0]这些位清零,然后再赋值*/
*(&M0P_DMAC->CONFA0+enCh) &= ((uint32_t)~(DMA_TRI_SEL_Msk | DMA_BC_SEL_Msk | DMA_TC_SEL_Msk));
*(&M0P_DMAC->CONFA0+enCh) |= (uint32_t)(pstcCfg->u16TransferCnt - 1) |
((uint32_t)(pstcCfg->u16BlockSize - 1)<<16)|
(uint32_t)(pstcCfg->enRequestNum<<22);
M0P_DMAC->CONF |= (uint32_t)(pstcCfg->enPriority);
*(&M0P_DMAC->SRCADR0+enCh) = (uint32_t)(pstcCfg->u32SrcAddress);
*(&M0P_DMAC->DSTADR0+enCh) = (uint32_t)(pstcCfg->u32DstAddress);
return Ok;
}
/**
*******************************************************************************
** \brief DMA模块使能函数,使能所有通道的操作,每个通道按照各自设置工作.
**
** \param None
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_Enable(void)
{
M0P_DMAC->CONF |= DMA_ENABLE_Msk;
}
/**
*******************************************************************************
** \brief DMA模块功能禁止函数,所有通道禁止工作.
**
** \param None
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_Disable(void)
{
M0P_DMAC->CONF &= (~DMA_ENABLE_Msk);
}
/**
*******************************************************************************
** \brief 触发指定DMA通道软件传输功能.
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SwStart(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFA0+enCh) |= DMA_SOFTWARE_START_Msk;
}
/**
*******************************************************************************
** \brief 停止指定DMA通道软件传输功能.
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SwStop(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFA0+enCh) &= (~DMA_SOFTWARE_START_Msk);
}
/**
*******************************************************************************
** \brief 使能指定dma通道的(传输完成)中断.
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_EnableChannelIrq(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) |= DMA_FIS_IE_Msk;
}
/**
*******************************************************************************
** \brief 禁用指定dma通道的(传输完成)中断.
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_DisableChannelIrq(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) &= (~DMA_FIS_IE_Msk);
}
/**
*******************************************************************************
** \brief 使能指定dma通道的(传输错误)中断..
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_EnableChannelErrIrq(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) |= DMA_ERR_IE_Msk;
}
/**
*******************************************************************************
** \brief 禁用指定dma通道的(传输错误)中断..
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_DisableChannelErrIrq(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) &= (~DMA_ERR_IE_Msk);
}
/**
*******************************************************************************
** \brief 使能指定dma通道
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_EnableChannel(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFA0+enCh) |= DMA_CH_ENABLE_Msk;
}
/**
*******************************************************************************
** \brief 禁用指定dma通道
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_DisableChannel(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFA0+enCh) &= (~DMA_CH_ENABLE_Msk);
}
/**
*******************************************************************************
** \brief 设定指定通道的块(Block)尺寸
**
** \param [输入] enCh 指定通道
** \param [输入] u16BlkSize 块(Block)尺寸.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SetBlockSize(en_dma_channel_t enCh, uint16_t u16BlkSize)
{
volatile uint32_t *pReg = (&M0P_DMAC->CONFA0+enCh);
*pReg = ((*pReg) & ((uint32_t)~DMA_BC_SEL_Msk)) | ((((uint32_t)u16BlkSize-1)&0x0f)<<DMA_BC_SEL_Pos);
}
/**
*******************************************************************************
** \brief 设定指定通道块(Block)传输次数
**
** \param [in] enCh 指定通道.
** \param [in] u16TrnCnt 块(Block)传输次数.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SetTransferCnt(en_dma_channel_t enCh, uint16_t u16TrnCnt)
{
volatile uint32_t *pReg = (&M0P_DMAC->CONFA0+enCh);
*pReg = ((*pReg)&((uint32_t)~DMA_TC_SEL_Msk))|(((uint32_t)(u16TrnCnt-1)<<DMA_TC_SEL_Pos));
}
/**
*******************************************************************************
** \brief 允许指定通道可连续传输,即DMAC在传输完成时不清除CONFA:ENS位.
**
** \param [in] enCh 指定通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_EnableContinusTranfer(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) |= DMA_TRANSFER_RELOAD_Msk;
}
/**
*******************************************************************************
** \brief 禁止指定通道连续传输,即DMAC在传输完成时清除.
**
** \param [输入] enCh 指定通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_DisableContinusTranfer(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) &= (~DMA_TRANSFER_RELOAD_Msk);
}
/**
*******************************************************************************
** \brief 暂停所有dma通道.
**
** \param None
**
** \retval None.
**
** \note None
**
******************************************************************************/
void Dma_HaltTranfer(void)
{
M0P_DMAC->CONF_f.HALT = 0x1;
}
/**
*******************************************************************************
** \brief 恢复(之前暂停的)所有dma通道.
**
** \param None
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_RecoverTranfer(void)
{
M0P_DMAC->CONF_f.HALT = 0x0;
}
/**
*******************************************************************************
** \brief 暂停指定dma通道.
**
** \param [输入] enCh 指定通道.
**
** \retval void
**
** \note None
**
******************************************************************************/
void Dma_PauseChannelTranfer(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFA0+enCh) |= DMA_CH_PAUSE_Msk;
}
/**
*******************************************************************************
** \brief 恢复(之前暂定的)指定dma通道.
**
** \param [输入] enCh 指定通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_RecoverChannelTranfer(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFA0+enCh) &= (~DMA_CH_PAUSE_Msk);
}
/**
*******************************************************************************
** \brief 设定指定通道传输数据宽度.
**
** \param [输入] enCh 指定dma通道.
** \param [输入] enWidth 指定数据宽度.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SetTransferWidth(en_dma_channel_t enCh, en_dma_transfer_width_t enWidth)
{
volatile uint32_t *pReg = (&M0P_DMAC->CONFA0+enCh);
*pReg = ((*pReg)&((uint32_t)~DMA_TRANSFER_WIDTH_Msk))|((uint32_t)enWidth);
}
/**
*******************************************************************************
** \brief 设定dma通道优先级.
**
** \param [输入] enPrio 通道优先级设定参数.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SetChPriority(en_dma_priority_t enPrio)
{
M0P_DMAC->CONF = ((M0P_DMAC->CONF)&((uint32_t)~DMA_PRIORITY_Msk))|((uint32_t)enPrio);
}
/**
*******************************************************************************
** \brief 获取指定DMA通道的状态.
**
** \param [输入] enCh 指定dma通道.
**
** \retval en_dma_stat_t DMA传输当前状态
**
** \note None
**
******************************************************************************/
en_dma_stat_t Dma_GetStat(en_dma_channel_t enCh)
{
return (en_dma_stat_t)((*(&M0P_DMAC->CONFB0+enCh)&(DMA_STAT_Msk))>>DMA_STAT_Pos);
}
/**
*******************************************************************************
** \brief 清除指定DMA通道的状态值.
**
** \param [输入] enCh 指定dma通道.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_ClrStat(en_dma_channel_t enCh)
{
*(&M0P_DMAC->CONFB0+enCh) &= (~DMA_STAT_Msk);
}
/**
*******************************************************************************
** \brief 设定指定通道源地址
**
** \param [输入] enCh 指定dma通道.
** \param [输入] u32Address 传输源地址.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SetSourceAddress(en_dma_channel_t enCh, uint32_t u32Address)
{
*(&M0P_DMAC->SRCADR0+enCh) = u32Address;
}
/**
*******************************************************************************
** \brief 设定指定通道目标地址.
**
** \param [输入] enCh 指定dma通道.
** \param [输入] u32Address 传输目标地址.
**
** \retval None
**
** \note None
**
******************************************************************************/
void Dma_SetDestinationAddress(en_dma_channel_t enCh, uint32_t u32Address)
{
*(&M0P_DMAC->DSTADR0+enCh) = u32Address;
}
//@} // DmacGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+696
View File
@@ -0,0 +1,696 @@
/******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file flash.c
**
** Common API of flash.
** @link flashGroup Some description @endlink
**
** - 2018-05-08
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "flash.h"
/**
*******************************************************************************
** \addtogroup FlashGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
#define FLASH_END_ADDR (0x0001FFFFu)
#define FLASH_BYPASS() M0P_FLASH->BYPASS = 0x5A5A;\
M0P_FLASH->BYPASS = 0xA5A5;
#define FLASH_IE_TRUE (0x03)
#define FLASH_IE_FALSE (0x00)
#define FLASH_TIMEOUT_INIT (0xFFFFFFu)
#define FLASH_TIMEOUT_PGM (0xFFFFFFu)
#define FLASH_TIMEOUT_ERASE (0xFFFFFFu)
#define FLASH_LOCK_ALL (0u)
#define FLASH_UNLOCK_ALL (0xFFFFFFFFu)
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/**
******************************************************************************
** \brief FLASH OP
**
** Flash 操作控制数据类型重定义
******************************************************************************/
typedef enum en_flash_op
{
Read = 0u, ///<读配置值
Program = 1u, ///<编程配置值
SectorErase = 2u, ///<扇区擦除配置值
ChipErase = 3u, ///<全片擦除配置值
} en_flash_op_t;
/**
******************************************************************************
** \brief FLASH 编程时间参数配置
**
** FLASH编程时间参数配置数组定义 (4MHz)
******************************************************************************/
const uint32_t pu32PcgTimer4M[] = {
0x20u, //Tnvs
0x17u, //Tpgs
0x1Bu, //Tprog
0x4650u, //Tserase
0x222E0u, //Tmerase
0x18u, //Tprcv
0xF0u, //Tsrcv
0x3E8u //Tmrcv
};
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief Flash中断标志获取
**
**
** \param [in] enFlashIntType Flash中断类型
**
** \retval TRUE or FALSE
*****************************************************************************/
boolean_t Flash_GetIntFlag(en_flash_int_type_t enFlashIntType)
{
boolean_t bRetVal = FALSE;
if(M0P_FLASH->IFR & enFlashIntType)
{
bRetVal = TRUE;
}
return bRetVal;
}
/**
*****************************************************************************
** \brief Flash中断标志清除
**
**
** \param [in] enFlashIntType Flash中断类型
**
** \retval Ok or Error
*****************************************************************************/
en_result_t Flash_ClearIntFlag(en_flash_int_type_t enFlashIntType)
{
en_result_t enResult = Error;
M0P_FLASH->ICLR &= ~(uint32_t)enFlashIntType;
enResult = Ok;
return enResult;
}
/**
*****************************************************************************
** \brief Flash中断使能
**
**
** \param [in] enFlashIntType Flash中断类型
**
** \retval Ok or Error
*****************************************************************************/
en_result_t Flash_EnableIrq (en_flash_int_type_t enFlashIntType)
{
en_result_t enResult = Error;
FLASH_BYPASS();
M0P_FLASH->CR_f.IE |= enFlashIntType;
enResult = Ok;
return enResult;
}
/**
*****************************************************************************
** \brief Flash中断禁止
**
**
** \param [in] enFlashIntType Flash中断类型
**
** \retval Ok or Error
*****************************************************************************/
en_result_t Flash_DisableIrq(en_flash_int_type_t enFlashIntType)
{
en_result_t enResult = Error;
FLASH_BYPASS();
M0P_FLASH->CR_f.IE &= ~(uint32_t)enFlashIntType;
enResult = Ok;
return enResult;
}
/**
*****************************************************************************
** \brief FLASH 初始化函数——中断服务程序、编程时间配置及低功耗模式
**
** 该函数用于配置中断服务函数、低功耗模式、根据系统时钟配置FLASH编程时间相关寄存器.
**
** \param [in] u8FreqCfg FLASH编程时钟频率配置(根据HCLK的频率选择配置值):
** 1 - 4MHz;
** 2 - 8MHz;
** 4 - 16MHz;
** 6 - 24MHz;
** 8 - 32MHz;
** 12 - 48MHz;
** other - 无效值
** \param [in] bDpstbEn TRUE - 当系统进入DeepSleep模式,FLASH进入低功耗模式;
** FALSE - 当系统进入DeepSleep模式,FLASH不进入低功耗模式;
**
** \retval Ok 操作成功.
** \retval ErrorInvalidParameter 参数无效.
** \retval ErrorUninitialized 初始化失败。
*****************************************************************************/
en_result_t Flash_Init(uint8_t u8FreqCfg, boolean_t bDpstbEn)
{
uint32_t u32Index = 0;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_INIT;
en_result_t enResult = Ok;
uint32_t u32PrgTimer[8] = {0};
volatile uint32_t *pu32PrgTimerReg = (volatile uint32_t*)M0P_FLASH;
if ((1 != u8FreqCfg) && (2 != u8FreqCfg) &&
(4 != u8FreqCfg) && (6 != u8FreqCfg) &&
(8 != u8FreqCfg) && (12 != u8FreqCfg))
{
enResult = ErrorInvalidParameter;
return (enResult);
}
M0P_FLASH->CR_f.DPSTB_EN = bDpstbEn;
//flash时间参数配置值计算
for(u32Index=0; u32Index<8; u32Index++)
{
u32PrgTimer[u32Index] = u8FreqCfg * pu32PcgTimer4M[u32Index];
}
//flash时间参数寄存器配置
for(u32Index=0; u32Index<8; u32Index++)
{
u32TimeOut = FLASH_TIMEOUT_INIT;
while(pu32PrgTimerReg[u32Index] != u32PrgTimer[u32Index])
{
if(u32TimeOut--)
{
FLASH_BYPASS();
pu32PrgTimerReg[u32Index] = u32PrgTimer[u32Index];
}
else
{
return ErrorUninitialized;
}
}
}
return (enResult);
}
/**
*****************************************************************************
** \brief FLASH 字节写
**
** 用于向FLASH写入1字节数据.
**
** \param [in] u32Addr Flash地址
** \param [in] u8Data 1字节数据
**
** \retval Ok 写入成功.
** \retval ErrorInvalidParameter FLASH地址无效
** \retval ErrorTimeout 操作超时
*****************************************************************************/
en_result_t Flash_WriteByte(uint32_t u32Addr, uint8_t u8Data)
{
en_result_t enResult = Ok;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_PGM;
if (FLASH_END_ADDR < u32Addr)
{
enResult = ErrorInvalidParameter;
return (enResult);
}
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//set OP
u32TimeOut = FLASH_TIMEOUT_PGM;
while(Program != M0P_FLASH->CR_f.OP)
{
if(u32TimeOut--)
{
FLASH_BYPASS();
M0P_FLASH->CR_f.OP = Program;
}
else
{
return ErrorTimeout;
}
}
//Flash 解锁
Flash_UnlockAll();
//write data
*((volatile uint8_t*)u32Addr) = u8Data;
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 加锁
Flash_LockAll();
return (enResult);
}
/**
*****************************************************************************
** \brief FLASH 半字写
**
** 用于向FLASH写入半字(2字节)数据.
**
** \param [in] u32Addr Flash地址
** \param [in] u16Data 半字(2字节)数据
**
** \retval Ok 写入成功.
** \retval ErrorInvalidParameter FLASH地址无效
** \retval ErrorTimeout 操作超时
*****************************************************************************/
en_result_t Flash_WriteHalfWord(uint32_t u32Addr, uint16_t u16Data)
{
en_result_t enResult = Ok;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_PGM;
if (FLASH_END_ADDR < u32Addr)
{
enResult = ErrorInvalidParameter;
return (enResult);
}
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//set OP
u32TimeOut = FLASH_TIMEOUT_PGM;
while(Program != M0P_FLASH->CR_f.OP)
{
if(u32TimeOut--)
{
FLASH_BYPASS();
M0P_FLASH->CR_f.OP = Program;
}
else
{
return ErrorTimeout;
}
}
//Flash 解锁
Flash_UnlockAll();
//write data
*((volatile uint16_t*)u32Addr) = u16Data;
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 加锁
Flash_LockAll();
return (enResult);
}
/**
*****************************************************************************
** \brief FLASH 字写
**
** 用于向FLASH写入1个字的数据.
**
** \param [in] u32Addr Flash地址
** \param [in] u32Data 1个字数据
**
** \retval Ok 写入成功.
** \retval ErrorInvalidParameter FLASH地址无效
** \retval ErrorTimeout 操作超时
*****************************************************************************/
en_result_t Flash_WriteWord(uint32_t u32Addr, uint32_t u32Data)
{
en_result_t enResult = Ok;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_PGM;
if (FLASH_END_ADDR < u32Addr)
{
enResult = ErrorInvalidParameter;
return (enResult);
}
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 解锁
Flash_UnlockAll();
//set OP
u32TimeOut = FLASH_TIMEOUT_PGM;
while(Program != M0P_FLASH->CR_f.OP)
{
if(u32TimeOut--)
{
FLASH_BYPASS();
M0P_FLASH->CR_f.OP = Program;
}
else
{
return ErrorTimeout;
}
}
//write data
*((volatile uint32_t*)u32Addr) = u32Data;
//busy?
u32TimeOut = FLASH_TIMEOUT_PGM;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 加锁
Flash_LockAll();
return (enResult);
}
/**
*****************************************************************************
** \brief FLASH 扇区擦除
**
** FLASH 扇区擦除.
**
** \param [in] u32SectorAddr 所擦除扇区内的地址
**
** \retval Ok 擦除成功.
** \retval ErrorInvalidParameter FLASH地址无效
** \retval ErrorTimeout 操作超时
*****************************************************************************/
en_result_t Flash_SectorErase(uint32_t u32SectorAddr)
{
en_result_t enResult = Ok;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_ERASE;
if (FLASH_END_ADDR < u32SectorAddr)
{
enResult = ErrorInvalidParameter;
return (enResult);
}
//busy?
u32TimeOut = FLASH_TIMEOUT_ERASE;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 解锁
Flash_UnlockAll();
//set OP
u32TimeOut = FLASH_TIMEOUT_ERASE;
while(SectorErase != M0P_FLASH->CR_f.OP)
{
if(u32TimeOut--)
{
FLASH_BYPASS();
M0P_FLASH->CR_f.OP = SectorErase;
}
else
{
return ErrorTimeout;
}
}
//write data
*((volatile uint8_t*)u32SectorAddr) = 0;
//busy?
u32TimeOut = FLASH_TIMEOUT_ERASE;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 加锁
Flash_LockAll();
return (enResult);
}
/**
*****************************************************************************
** \brief FLASH 全片擦除(该函数仅限RAM中运行!!!)
**
** FLASH 全片擦除.
**
**
** \retval Ok 擦除成功.
** \retval ErrorTimeout 操作超时
**
*****************************************************************************/
en_result_t Flash_ChipErase(void)
{
en_result_t enResult = Ok;
volatile uint32_t u32TimeOut = FLASH_TIMEOUT_ERASE;
//busy?
u32TimeOut = FLASH_TIMEOUT_ERASE;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//set OP
u32TimeOut = FLASH_TIMEOUT_ERASE;
while(ChipErase != M0P_FLASH->CR_f.OP)
{
if(u32TimeOut--)
{
FLASH_BYPASS();
M0P_FLASH->CR_f.OP = ChipErase;
}
else
{
return ErrorTimeout;
}
}
//Flash 解锁
Flash_UnlockAll();
//write data
*((volatile uint8_t*)0) = 0;
//busy?
u32TimeOut = FLASH_TIMEOUT_ERASE;
while (TRUE == M0P_FLASH->CR_f.BUSY)
{
if(0 == u32TimeOut--)
{
return ErrorTimeout;
}
}
//Flash 加锁
Flash_LockAll();
return (enResult);
}
/**
*****************************************************************************
** \brief FLASH 编程保护加锁
**
**
** \retval Null
*****************************************************************************/
void Flash_LockAll(void)
{
FLASH_BYPASS();
M0P_FLASH->SLOCK0 = FLASH_LOCK_ALL;
FLASH_BYPASS();
M0P_FLASH->SLOCK1 = FLASH_LOCK_ALL;
}
/**
*****************************************************************************
** \brief FLASH 编程保护解锁
**
**
** \retval Null
*****************************************************************************/
void Flash_UnlockAll(void)
{
FLASH_BYPASS();
M0P_FLASH->SLOCK0 = FLASH_UNLOCK_ALL;
FLASH_BYPASS();
M0P_FLASH->SLOCK1 = FLASH_UNLOCK_ALL;
}
/**
*****************************************************************************
** \brief FLASH 读等待周期设置
**
** \param [in] enWaitCycle 插入FLASH读等待周期数枚举类型
**
** \retval Ok 解锁成功
** \retval ErrorInvalidParameter 参数错误
*****************************************************************************/
en_result_t Flash_WaitCycle(en_flash_waitcycle_t enWaitCycle)
{
en_result_t enResult = Ok;
FLASH_BYPASS();
M0P_FLASH->CR_f.WAIT = enWaitCycle;
return enResult;
}
/**
*****************************************************************************
** \brief FLASH LOCK 设置
**
** \param [in] enLock @ref en_flash_lock_t
** \param [in] u32LockValue 32bits,对应bit=0:加锁,对应Sector不允许擦写;对应bit=1:解锁。
** \note 加解锁范围Sector[enLock*128 + i*4, enLock*128 + i*4+3]
** (i表示u32LockValue的bit位置,0~31)
** 例如:enLock = FlashLock1, u32LockValue = 0x00000002,
** 则加解锁范围为:[Sector128,Sector131]
** \retval Ok 解锁成功
** \retval ErrorInvalidParameter 参数错误
*****************************************************************************/
en_result_t Flash_LockSet(en_flash_lock_t enLock, uint32_t u32LockValue)
{
FLASH_BYPASS();
*((&M0P_FLASH->SLOCK0) + enLock) = u32LockValue;
return Ok;
}
//@} // FlashGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+582
View File
@@ -0,0 +1,582 @@
/******************************************************************************
* Copyright (C) 2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file Gpio.c
**
** GPIO driver API.
** @link Driver Group Some description @endlink
**
** - 2018-04-22 1.0 Lux First version
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "gpio.h"
/**
*******************************************************************************
** \addtogroup GpioGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
#define IS_VALID_PIN(port,pin) ( )
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern') *
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*******************************************************************************
** \brief GPIO 初始化
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
** \param [in] pstcGpioCfg IO 配置结构体指针
**
** \retval Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_Init(en_gpio_port_t enPort, en_gpio_pin_t enPin, stc_gpio_cfg_t *pstcGpioCfg)
{
//配置为默认值,GPIO功能
SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, FALSE);
*((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = GpioAf0;
//默认输出值配置
SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, pstcGpioCfg->bOutputVal);
//方向配置
SetBit(((uint32_t)&M0P_GPIO->PADIR + enPort), enPin, (boolean_t)(pstcGpioCfg->enDir));
//驱动能力配置
SetBit(((uint32_t)&M0P_GPIO->PADR + enPort), enPin, (boolean_t)(pstcGpioCfg->enDrv));
//上拉/下拉配置
SetBit(((uint32_t)&M0P_GPIO->PAPU + enPort), enPin, (boolean_t)(pstcGpioCfg->enPu));
SetBit(((uint32_t)&M0P_GPIO->PAPD + enPort), enPin, (boolean_t)(pstcGpioCfg->enPd));
//开漏输出功能
SetBit(((uint32_t)&M0P_GPIO->PAOD + enPort), enPin, (boolean_t)(pstcGpioCfg->enOD));
M0P_GPIO->CTRL2_f.AHB_SEL = pstcGpioCfg->enCtrlMode;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO输入值获取
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval boolean_t IO电平高低
******************************************************************************/
boolean_t Gpio_GetInputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
return GetBit(((uint32_t)&M0P_GPIO->PAIN + enPort), enPin);
}
/**
*******************************************************************************
** \brief GPIO IO Port输入数据获取
**
** \param [in] enPort IO Port
**
** \retval boolean_t IO Port数据
******************************************************************************/
uint16_t Gpio_GetInputData(en_gpio_port_t enPort)
{
return (uint16_t)(*((uint32_t *)((uint32_t)&M0P_GPIO->PAIN + enPort)));
}
/**
*******************************************************************************
** \brief GPIO IO输出值写入
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
** \param [out] bVal 输出值
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_WriteOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin, boolean_t bVal)
{
SetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin, bVal);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO输出值获取
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval boolean_t IO电平高低
******************************************************************************/
boolean_t Gpio_ReadOutputIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
return GetBit(((uint32_t)&M0P_GPIO->PAOUT + enPort), enPin);
}
/**
*******************************************************************************
** \brief GPIO IO Port设置,可同时设置一组Port中的多个PIN
**
** \param [in] enPort IO Port
** \param [in] u16ValMsk 该Port的16个PIN掩码值,将需要设置的PIN对应的bit写1有效
**
** \retval boolean_t IO Port数据
******************************************************************************/
en_result_t Gpio_SetPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
{
*((uint16_t*)(((uint32_t)&(M0P_GPIO->PABSET)) + enPort)) = u16ValMsk;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO设置
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_SetIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit(((uint32_t)&M0P_GPIO->PABSET + enPort), enPin, TRUE);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO Port清零,可同时清零一组Port中的多个PIN
**
** \param [in] enPort IO Port
** \param [in] u16ValMsk 该Port的16个PIN掩码值,将需要清零的PIN对应的bit写1有效
**
** \retval boolean_t IO Port数据
******************************************************************************/
en_result_t Gpio_ClrPort(en_gpio_port_t enPort, uint16_t u16ValMsk)
{
*((uint16_t*)(((uint32_t)&(M0P_GPIO->PABCLR)) + enPort)) = u16ValMsk;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO清零
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_ClrIO(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit(((uint32_t)&M0P_GPIO->PABCLR + enPort), enPin, TRUE);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO Port置位/清零,可同时置位/清零一组Port中的多个PIN
**
** \param [in] enPort IO Port
** \param [in] u32ValMsk 高16bits表示该Port的16个PIN置位掩码值,
** 低16bits表示该Port的16个PIN清零掩码值,
** 将需要设置的PIN对应的bit写1,同一个PIN的掩码同时为1,则该PIN清零。
**
** \retval en_result_t Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_SetClrPort(en_gpio_port_t enPort, uint32_t u32ValMsk)
{
*((uint32_t*)(((uint32_t)&(M0P_GPIO->PABSETCLR)) + enPort)) = u32ValMsk;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO配置为模拟功能模式
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
**
** \retval Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_SetAnalogMode(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit((uint32_t)&M0P_GPIO->PAADS + enPort, enPin, TRUE);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO复用功能设置
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
** \param [in] enAf 复用功能枚举类型选择
** \retval Ok 设置成功
** 其他值 设置失败
******************************************************************************/
en_result_t Gpio_SetAfMode(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_af_t enAf)
{
*((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + enPort) + (((uint32_t)enPin)<<2))) = enAf;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO复用功能设置
**
** \param [in] PinMux 复用功能宏定义
** \retval Null
**
******************************************************************************/
void Gpio_SetAfMode_Lite(GpioPinMux PinMux)
{
*((uint32_t*)(((uint32_t)(&(M0P_GPIO->PA00_SEL)) + ((PinMux>>16u)&0xFFFFu)) + (((uint32_t)((PinMux>>8u)&0xFFu))<<2))) = (uint32_t)(PinMux&0x7u);
}
/**
*******************************************************************************
** \brief GPIO IO中断使能
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
** \param [in] enType 中断使能类型
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_EnableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
{
uint32_t u32PieAddr;
u32PieAddr = ((uint32_t)((&M0P_GPIO->PAHIE) + enType)) + enPort;
SetBit(u32PieAddr, enPin, TRUE);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO IO中断关闭
**
** \param [in] enPort IO Port口
** \param [in] enPin IO Pin脚
** \param [in] enType 中断使能类型
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_DisableIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin, en_gpio_irqtype_t enType)
{
uint32_t u32PieAddr;
u32PieAddr = ((uint32_t)((&M0P_GPIO->PAHIE) + enType)) + enPort;
SetBit(u32PieAddr, enPin, FALSE);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 获得IO中断状态
**
** \param [in] u8Port IO Port口
** \param [in] u8Pin IO Pin脚
**
** \retval IO中断状态开关
******************************************************************************/
boolean_t Gpio_GetIrqStatus(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
return GetBit((uint32_t)&M0P_GPIO->PA_STAT + enPort, enPin);
}
/**
*******************************************************************************
** \brief GPIO 清除IO中断状态
**
** \param [in] u8Port IO Port口
** \param [in] u8Pin IO Pin脚
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_ClearIrq(en_gpio_port_t enPort, en_gpio_pin_t enPin)
{
SetBit((uint32_t)&M0P_GPIO->PA_ICLR + enPort, enPin, FALSE);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——中断模式配置
**
** \param [in] enIrqMode 端口中断模式(深度休眠是否响应中断)
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfIrqModeCfg(en_gpio_sf_irqmode_t enIrqMode)
{
M0P_GPIO->CTRL0_f.IESEL = enIrqMode;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——IR输出极性配置
**
** \param [in] enIrPolMode IR输出极性配置枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfIrPolCfg(en_gpio_sf_irpol_t enIrPolMode)
{
M0P_GPIO->CTRL1_f.IR_POL = enIrPolMode;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——HCLK输出配置
**
** \param [in] enGate HCLK输出使能
** \param [in] enDiv 输出分频枚举值
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfHClkOutputCfg(en_gpio_sf_hclkout_g_t enGate, en_gpio_sf_hclkout_div_t enDiv)
{
M0P_GPIO->CTRL1_f.HCLK_EN = enGate;
M0P_GPIO->CTRL1_f.HCLK_SEL = enDiv;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——PCLK输出配置
**
** \param [in] enGate PCLK输出使能
** \param [in] enDiv 输出分频枚举值
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfPClkOutputCfg(en_gpio_sf_pclkout_g_t enGate, en_gpio_sf_pclkout_div_t enDiv)
{
M0P_GPIO->CTRL1_f.PCLK_EN = enGate;
M0P_GPIO->CTRL1_f.PCLK_SEL = enDiv;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——外部时钟输入来源配置
**
** \param [in] enExtClk 外部时钟信号来源选择枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfExtClkCfg(en_gpio_sf_ssn_extclk_t enExtClk)
{
M0P_GPIO->CTRL1_f.EXT_CLK_SEL = enExtClk;
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——SSN 通道信号来源配置
**
** \param [in] enSpi SSN SPI通道选择枚举
** \param [in] enSsn SSN 信号来源选择枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfSsnCfg(en_gpio_sf_ssnspi_t enSpi, en_gpio_sf_ssn_extclk_t enSsn)
{
//SPI0
if(enSpi == GpioSpi0)
{
M0P_GPIO->CTRL1_f.SSN0_SEL = enSsn;
}
//SPI1
if(enSpi == GpioSpi1)
{
M0P_GPIO->CTRL2_f.SSN1_SEL = enSsn;
}
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——Timer 门控输入配置
**
** \param [in] enTimG Timer类型选择枚举
** \param [in] enSf Timer互联功能选择枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfTimGCfg(en_gpio_sf_tim_g_t enTimG, en_gpio_sf_t enSf)
{
if(enTimG&0x20u)
{
enTimG &= ~0x20u;
M0P_GPIO->PCAS &= (uint32_t)(~(0x07U<<enTimG));
M0P_GPIO->PCAS |= (uint32_t)(enSf<<enTimG);
}
else
{
M0P_GPIO->TIMGS &= (uint32_t)(~(0x07U<<enTimG));
M0P_GPIO->TIMGS |= (uint32_t)(enSf<<enTimG);
}
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——Timer ETR选择配置
**
** \param [in] enTimE Timer类型选择枚举
** \param [in] enSf Timer互联功能选择枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfTimECfg(en_gpio_sf_tim_e_t enTimE, en_gpio_sf_t enSf)
{
if(enTimE&0x20u)
{
enTimE &= ~0x20u;
M0P_GPIO->PCAS &= (uint32_t)(~(0x07U<<enTimE));
M0P_GPIO->PCAS |= (uint32_t)(enSf<<enTimE);
}
else
{
M0P_GPIO->TIMES &= (uint32_t)(~(0x07U<<enTimE));
M0P_GPIO->TIMES |= (uint32_t)(enSf<<enTimE);
}
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——Timer 捕获输入选择配置
**
** \param [in] enTimC Timer类型选择枚举
** \param [in] enSf Timer互联功能选择枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfTimCCfg(en_gpio_sf_tim_c_t enTimC, en_gpio_sf_t enSf)
{
M0P_GPIO->TIMCPS &= (uint32_t)(~(0x07u<<enTimC));
M0P_GPIO->TIMCPS |= (uint32_t)(enSf<<enTimC);
return Ok;
}
/**
*******************************************************************************
** \brief GPIO 端口辅助功能配置——PCA 捕获输入选择配置
**
** \param [in] enPca PCA类型选择枚举
** \param [in] enSf PCA互联功能选择枚举
**
** \retval Ok 设置成功
******************************************************************************/
en_result_t Gpio_SfPcaCfg(en_gpio_sf_pca_t enPca, en_gpio_sf_t enSf)
{
M0P_GPIO->PCAS &= (uint32_t)(~(0x07u<<enPca));
M0P_GPIO->PCAS |= (uint32_t)(enSf<<enPca);
return Ok;
}
//@} // GpioGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+398
View File
@@ -0,0 +1,398 @@
/*************************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file I2C.c
**
** WDT function driver API.
** @link SampleGroup Some description @endlink
**
** - 2018-03-13 1.0 CJ First version for Device Driver Library of Module.
**
******************************************************************************/
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "i2c.h"
/**
*******************************************************************************
** \addtogroup I2cGroup
******************************************************************************/
//@{
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/**
******************************************************************************
** \brief I2C设置波特率配置寄存器
**
** \param [in] u8Tm 波特率配置值
**
** \retval enRet 成功或失败
**
******************************************************************************/
en_result_t I2C_SetBaud(M0P_I2C_TypeDef* I2Cx, uint8_t u8Tm)
{
en_result_t enRet = Error;
I2Cx->TM = u8Tm;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief I2C功能设置相关函数
**
** \param [in] enFunc功能参数
**
** \retval enRet 成功或失败
**
******************************************************************************/
en_result_t I2C_SetFunc(M0P_I2C_TypeDef* I2Cx, en_i2c_func_t enFunc)
{
en_result_t enRet = Error;
SetBit((uint32_t)&I2Cx->CR, enFunc, TRUE);
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief I2C功能清除相关函数
**
** \param [in] enFunc功能参数
**
** \retval enRet 成功或失败
**
******************************************************************************/
en_result_t I2C_ClearFunc(M0P_I2C_TypeDef* I2Cx, en_i2c_func_t enFunc)
{
en_result_t enRet = Error;
SetBit((uint32_t)&I2Cx->CR, enFunc, FALSE);
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief I2C获取中断标记函数
**
** \param 无
**
** \retval bIrq中断标记
**
******************************************************************************/
boolean_t I2C_GetIrq(M0P_I2C_TypeDef* I2Cx)
{
if(I2Cx->CR&0x8)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
******************************************************************************
** \brief I2C清除中断标记函数
**
** \param 无
**
** \retval bIrq中断标记
**
******************************************************************************/
en_result_t I2C_ClearIrq(M0P_I2C_TypeDef* I2Cx)
{
en_result_t enRet = Error;
I2Cx->CR &= ~0x8u;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief I2C获取相关状态
**
** \param 无
**
** \retval I2C状态
**
******************************************************************************/
uint8_t I2C_GetState(M0P_I2C_TypeDef* I2Cx)
{
uint8_t u8State = 0;
u8State = I2Cx->STAT;
return u8State;
}
/**
******************************************************************************
** \brief 字节数据写函数
**
** \param u8Data写数据
**
** \retval 写数据是否成功
**
******************************************************************************/
en_result_t I2C_WriteByte(M0P_I2C_TypeDef* I2Cx, uint8_t u8Data)
{
en_result_t enRet = Error;
I2Cx->DATA = u8Data;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief 字节数据读函数
**
** \param 无
**
** \retval 读取数据
**
******************************************************************************/
uint8_t I2C_ReadByte(M0P_I2C_TypeDef* I2Cx)
{
uint8_t u8Data = 0;
u8Data = I2Cx->DATA;
return u8Data;
}
/**
******************************************************************************
** \brief I2C模块初始化
**
** \param pstcI2CCfg初始化配置结构体
**
** \retval 初始化是否成功
**
******************************************************************************/
en_result_t I2C_Init(M0P_I2C_TypeDef* I2Cx, stc_i2c_cfg_t *pstcI2CCfg)
{
en_result_t enRet = Error;
uint8_t u8Tm;
if(M0P_I2C0 == I2Cx)
{
M0P_RESET->PERI_RESET0 &= ~(uint32_t)0x10u;
M0P_RESET->PERI_RESET0 |= (uint32_t)0x10u;
}
else
{
M0P_RESET->PERI_RESET0 &= ~(uint32_t)0x20u;
M0P_RESET->PERI_RESET0 |= (uint32_t)0x20u;
}
I2Cx->CR = 0;
I2Cx->CR = pstcI2CCfg->enMode;
if((pstcI2CCfg->u32Baud<<4) > pstcI2CCfg->u32Pclk)
{
return Error;
}
if(I2cMasterMode == pstcI2CCfg->enMode)
{
I2Cx->TMRUN = TRUE;
///< Fsck = Fpclk/8*(Tm+1)
u8Tm = ((pstcI2CCfg->u32Pclk / pstcI2CCfg->u32Baud) >> 3) - 1;
if(9 > u8Tm)
{
I2C_SetFunc(I2Cx,I2cHlm_En);
}
enRet = I2C_SetBaud(I2Cx, u8Tm);
}
else
{
I2Cx->TMRUN = FALSE;
pstcI2CCfg->u8SlaveAddr = (uint8_t)(((uint32_t)pstcI2CCfg->u8SlaveAddr<<1)|(pstcI2CCfg->bGc));
I2Cx->ADDR = pstcI2CCfg->u8SlaveAddr;
}
return enRet;
}
/**
******************************************************************************
** \brief I2C模块接收指定长度函数
**
** \param u8SlaveAddr从机设备地址,u8Addr从机内存地址,pu8Data读数据存放缓存,u32Len读数据长度
**
** \retval 读数据是否成功
**
******************************************************************************/
boolean_t I2C_MasterReadData(M0P_I2C_TypeDef* I2CX,uint8_t u8SlaveAddr,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
{
boolean_t enRet = FALSE;
uint8_t u8i=0,u8State;
I2C_SetFunc(I2CX,I2cStart_En);//开始
while(1)
{
while(0 == I2C_GetIrq(I2CX))//获取中断标记函数
{;}
u8State = I2C_GetState(I2CX);//获取i2c相关状态
switch(u8State)
{
case 0x08: ///< 主设备向总线已发出了一个起始条件
I2C_ClearFunc(I2CX,I2cStart_En);
I2C_WriteByte(I2CX,(u8SlaveAddr << 1));
break;
case 0x18: ///< 主设备向总线已发出了一个从设备地址(写方向)并且接收到从设备的应答
I2C_WriteByte(I2CX,u8Addr); ///< 发送从机内存地址
break;
case 0x28: ///< 已发送数据,接收到ACK, 此处是已发送从机内存地址u8Addr并接收到ACK
I2C_SetFunc(I2CX,I2cStart_En); ///< 发送重复起始条件
break;
case 0x10: ///< 主设备向总线已发出了一个重复的起始条件
I2C_ClearFunc(I2CX,I2cStart_En);
I2C_WriteByte(I2CX,(u8SlaveAddr << 1) | 0x01);///< 发送SLA+R,开始从从机读取数据
break;
case 0x40: ///< 已发送SLA+R,并接收到ACK
if(u32Len>1)
{
I2C_SetFunc(I2CX,I2cAck_En); ///< 使能主机应答功能
}
break;
case 0x50: ///< 已接收数据字节,并已返回ACK信号
pu8Data[u8i++] = I2C_ReadByte(I2CX);
if(u8i==u32Len-1)
{
I2C_ClearFunc(I2CX,I2cAck_En); ///< 已接收到倒数第二个字节,关闭ACK应答功能
}
break;
case 0x58: ///< 已接收到最后一个数据,NACK已返回
pu8Data[u8i++] = I2C_ReadByte(I2CX);
I2C_SetFunc(I2CX,I2cStop_En); ///< 发送停止条件
break;
case 0x38: ///< 在发送地址或数据时,仲裁丢失
I2C_SetFunc(I2CX,I2cStart_En); ///< 当总线空闲时发起起始条件
break;
case 0x48: ///< 发送SLA+R后,收到一个NACK
I2C_SetFunc(I2CX,I2cStop_En); ///< 发送停止条件
I2C_SetFunc(I2CX,I2cStart_En); ///< 发送起始条件
break;
default:
I2C_SetFunc(I2CX,I2cStart_En); ///< 其他错误状态,重新发送起始条件
break;
}
I2C_ClearIrq(I2CX); ///< 清除中断状态标志位
if(u8i==u32Len) ///< 数据全部读取完成,跳出while循环
{
break;
}
}
enRet = TRUE;
return enRet;
}
/**
******************************************************************************
** \brief I2C模块主机发送指定长度函数
**
** \param u8SlaveAddr从机设备地址,u8Addr从机内存地址,pu8Data写数据,u32Len写数据长度
**
** \retval 写数据是否成功
**
******************************************************************************/
boolean_t I2C_MasterWriteData(M0P_I2C_TypeDef* I2CX,uint8_t u8SlaveAddr,uint8_t u8Addr,uint8_t *pu8Data,uint32_t u32Len)
{
boolean_t enRet = FALSE;
uint8_t u8i=0,u8State, u8Flag=FALSE;
I2C_SetFunc(I2CX,I2cStart_En);
while(1)
{
while(0 == I2C_GetIrq(I2CX))
{;}
u8State = I2C_GetState(I2CX);
switch(u8State)
{
case 0x08: ///< 已发送起始条件
I2C_ClearFunc(I2CX,I2cStart_En);
I2C_WriteByte(I2CX,(u8SlaveAddr << 1)); ///< 从设备地址发送
break;
case 0x18: ///< 已发送SLA+W,并接收到ACK
I2C_WriteByte(I2CX,u8Addr); ///< 从设备内存地址发送
break;
case 0x28: ///< 上一次发送数据后接收到ACK
if (u8i < u32Len)
{
I2C_WriteByte(I2CX,pu8Data[u8i++]); ///< 继续发送数据
}else
{
I2C_SetFunc(I2CX,I2cStop_En); ///< 出停止条件
u8Flag = TRUE;
}
break;
case 0x38: ///< 上一次在SLA+读或写时丢失仲裁
I2C_SetFunc(I2CX,I2cStart_En); ///< 当I2C总线空闲时发送起始条件
break;
case 0x30: ///< 已发送I2Cx_DATA中的数据,收到NACK,将传输一个STOP条件
I2C_SetFunc(I2CX,I2cStop_En); ///< 发送停止条件
break;
default:
break;
}
I2C_ClearIrq(I2CX); ///< 清除中断状态标志位
if(u8Flag == TRUE) ///< 数据发送完成
{
break;
}
}
enRet = TRUE;
return enRet;
}
//@} // I2cGroup
+289
View File
@@ -0,0 +1,289 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file lcd.c
**
** lcd driver API.
**
** - 2019-04-02 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "lcd.h"
/**
******************************************************************************
** \addtogroup AdcGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
******************************************************************************
** \brief 获取LCD中断标志位INTF
**
** @param 无
** \retval 无
**
******************************************************************************/
boolean_t Lcd_GetItStatus(void)
{
return (((M0P_LCD->CR1)>>11)&0x01)? TRUE : FALSE;
}
/**
******************************************************************************
** \brief 清除中断标志位INTF
**
** @param 无
** \retval 无
**
******************************************************************************/
void Lcd_ClearItPendingBit(void)
{
SetBit((uint32_t)(&(M0P_LCD->INTCLR)), 10, 0);
}
/**
******************************************************************************
** \brief 根据LCD显示模式获取端口配置
**
** \param pstcSegComPara:显示方式, stcSegCom获取端口参数
**
** \retval enRet 成功或失败
**
******************************************************************************/
en_result_t Lcd_GetSegCom(stc_lcd_segcompara_t *pstcSegComPara,stc_lcd_segcom_t *pstcSegCom)
{
en_result_t enRet = Error;
pstcSegCom->stc_seg32_51_com0_8_t.seg32_51_com0_8 = 0xffffffffu;
pstcSegCom->u32Seg0_31 = 0xffffffffu;
if(pstcSegComPara->u8MaxSeg>51)
{
return ErrorInvalidParameter;
}
switch(pstcSegComPara->LcdBiasSrc)
{
case LcdInResHighPower:
case LcdInResLowPower:
case LcdInResMidPower:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Mux = 1;
break;
case LcdExtCap:
case LcdExtRes:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Mux = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg32_35 = 0;
break;
default:
return ErrorInvalidParameter;
}
switch(pstcSegComPara->LcdDuty)
{
case LcdStatic:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~1u)&0x0fu;
break;
case LcdDuty2:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~3u)&0x0fu;
break;
case LcdDuty3:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~7u)&0x0fu;
break;
case LcdDuty4:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = (~15u)&0x0fu;
break;
case LcdDuty6:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg39Com4 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg38Com5 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg37Com6 = 1;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg36Com7 = 1;
break;
case LcdDuty8:
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Com0_3 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg39Com4 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg38Com5 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg37Com6 = 0;
pstcSegCom->stc_seg32_51_com0_8_t.segcom_bit.Seg36Com7 = 0;
break;
default:
return ErrorInvalidParameter;
}
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief LCD COMSEG端口配置,使用该函数之前需要先使能相应的Seg
**
** \param [in] pstcSegCom端口配置结构体
**
** \retval enRet 成功或失败
**
******************************************************************************/
void Lcd_SetSegCom(stc_lcd_segcom_t *pstcSegCom)
{
M0P_LCD->POEN0 = pstcSegCom->u32Seg0_31;
M0P_LCD->POEN1 = pstcSegCom->stc_seg32_51_com0_8_t.seg32_51_com0_8;
}
/**
******************************************************************************
** \brief LCD模块初始化函数
**
** \param stcLcdCfg配置初始化结构体
**
** \retval 无
**
******************************************************************************/
void Lcd_Init(stc_lcd_cfg_t *pstcLcdCfg)
{
M0P_LCD->CR0_f.BSEL = pstcLcdCfg->LcdBiasSrc;
M0P_LCD->CR0_f.DUTY = pstcLcdCfg->LcdDuty;
M0P_LCD->CR0_f.BIAS = pstcLcdCfg->LcdBias;
M0P_LCD->CR0_f.CPCLK = pstcLcdCfg->LcdCpClk;
M0P_LCD->CR0_f.LCDCLK = pstcLcdCfg->LcdScanClk;
M0P_LCD->CR1_f.MODE = pstcLcdCfg->LcdMode;
M0P_LCD->CR1_f.CLKSRC = pstcLcdCfg->LcdClkSrc;
M0P_LCD->CR0_f.EN = pstcLcdCfg->LcdEn;
}
/**
******************************************************************************
** \brief 液晶全显
**
** \param 无
**
** \retval 无
**
******************************************************************************/
void Lcd_FullDisp(void)
{
uint8_t tmp;
volatile uint32_t *ram = NULL;
ram = &M0P_LCD->RAM0;
for(tmp=0;tmp<16;tmp++)
{
*ram = 0xffffffffu;
ram++;
}
}
/**
******************************************************************************
** \brief 清屏
**
** \param 无
**
** \retval 无
**
******************************************************************************/
void Lcd_ClearDisp(void)
{
uint8_t tmp;
volatile uint32_t *ram = NULL;
ram = &M0P_LCD->RAM0;
for(tmp=0;tmp<16;tmp++)
{
*ram = 0;
ram++;
}
}
/**
******************************************************************************
** \brief LCD RAM 0-f寄存器设置函数
**
** \param u8Row RAM地址索引,范围:0-15u8Data写入寄存器数值
**
** \retval enRet 成功或失败
**
******************************************************************************/
en_result_t Lcd_WriteRam(uint8_t u8Row,uint32_t u32Data)
{
en_result_t enRet = Error;
volatile uint32_t *ram = NULL;
ram = (volatile uint32_t*)&M0P_LCD->RAM0;
if (u8Row > 15)
{
enRet = ErrorInvalidParameter;
return enRet;
}
ram += u8Row;
*ram = u32Data;
enRet = Ok;
return enRet;
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+122
View File
@@ -0,0 +1,122 @@
/******************************************************************************
*Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file lpm.c
**
** Common API of lpm.
** @link LpmGroup Some description @endlink
**
** - 2017-06-06
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "lpm.h"
/**
*******************************************************************************
** \addtogroup LpmGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief 进入深度睡眠模式
**
** \input bOnExit - TRUE:当退出异常处理后,自动再次进入休眠;
** FALSE:唤醒后不再自动进入休眠
**
** \retval NULL
*****************************************************************************/
void Lpm_GotoDeepSleep(boolean_t bOnExit)
{
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
SCB->SCR |= 1u<<bOnExit;
__WFI();
}
/**
*****************************************************************************
** \brief 进入普通睡眠模式
**
** \input bOnExit - TRUE:当退出异常处理后,自动再次进入休眠;
** FALSE:唤醒后不再自动进入休眠
**
** \retval NULL
*****************************************************************************/
void Lpm_GotoSleep(boolean_t bOnExit)
{
SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk;
SCB->SCR |= 1u<<bOnExit;
__WFI();
}
//@} // LpmGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+171
View File
@@ -0,0 +1,171 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file lptim.c
**
** lptim driver API.
** @link pcnt Group Some description @endlink
**
** - 2019-04-09 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "lptim.h"
/**
******************************************************************************
** \addtogroup PCNTGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/**
******************************************************************************
** \brief 定时器LPTIMx中断使能控制
** @param Lptimx : LPTIM0 或LPTIM1
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Lptim_ConfIt(M0P_LPTIMER_TypeDef* Lptimx, boolean_t NewStatus)
{
SetBit((uint32_t)(&(Lptimx->CR)), 10, NewStatus);
}
/**
******************************************************************************
** \brief 定时器LPTIMx的启动/停止控制
** @param Lptimx : LPTIM0 或LPTIM1
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Lptim_Cmd(M0P_LPTIMER_TypeDef* Lptimx, boolean_t NewStatus)
{
SetBit((uint32_t)(&(Lptimx->CR)), 0, NewStatus);
}
/**
******************************************************************************
** \brief 定时器LPTIMx的中断标志位获取
** @param Lptimx : LPTIM0 或LPTIM1
** \retval TRUE 或 FALSE
**
******************************************************************************/
boolean_t Lptim_GetItStatus(M0P_LPTIMER_TypeDef* Lptimx)
{
return GetBit((uint32_t)(&(Lptimx->IFR)), 0);
}
/**
******************************************************************************
** \brief 定时器LPTIMx的中断标志位清除
** @param Lptimx : LPTIM0 或LPTIM1
** \retval 无
**
******************************************************************************/
void Lptim_ClrItStatus(M0P_LPTIMER_TypeDef* Lptimx)
{
SetBit((uint32_t)(&(Lptimx->ICLR)), 0, 0);
}
/**
******************************************************************************
** \brief 定时器LPTIMx的初始化配置
** @param Lptimx : LPTIM0 或LPTIM1
** @param InitStruct : 初始化LPTIMx的结构体
** \retval en_result_t类型数据
**
******************************************************************************/
en_result_t Lptim_Init(M0P_LPTIMER_TypeDef* Lptimx, stc_lptim_cfg_t* InitStruct)
{
uint16_t u16TimeOut;
u16TimeOut = 1000;
Lptimx->CR_f.PRS = InitStruct->enPrs;
Lptimx->CR_f.TCK_SEL = InitStruct->enTcksel;
Lptimx->CR_f.GATE_P = InitStruct->enGatep;
Lptimx->CR_f.GATE = InitStruct->enGate;
Lptimx->CR_f.TOG_EN = InitStruct->enTogen;
Lptimx->CR_f.CT = InitStruct->enCt;
Lptimx->CR_f.MD = InitStruct->enMd;
while(u16TimeOut--)
{
if(Lptimx->CR_f.WT_FLAG)
{
break;
}
}
if(u16TimeOut == 0)
{
return ErrorTimeout;
}
Lptimx->ARR_f.ARR = InitStruct->u16Arr;
return Ok;
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+409
View File
@@ -0,0 +1,409 @@
/*************************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file lpuart.c
**
** LPUART function driver API.
** @link SampleGroup Some description @endlink
**
** - 2017-05-17 1.0 CJ First version for Device Driver Library of Module.
**
******************************************************************************/
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "lpuart.h"
/**
******************************************************************************
** \addtogroup LPUartGroup
******************************************************************************/
//@{
/******************************************************************************/
/* Local pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/******************************************************************************/
/* Local variable definitions ('static') */
/******************************************************************************/
/**
******************************************************************************
** \brief LPUART通信中断使能函数设置
**
** \param [in] LPUARTx通道号,enIrqSel发送or接收中断使能
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_EnableIrq(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_irq_sel_t enIrqSel)
{
SetBit((uint32_t)(&(LPUARTx->SCON)), enIrqSel, TRUE);
return Ok;
}
/**
******************************************************************************
** \brief LPUART通信中断禁止函数设置
**
** \param [in] LPUARTx通道号,enIrqSel发送or接收中断禁止
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_DisableIrq(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_irq_sel_t enIrqSel)
{
SetBit((uint32_t)(&(LPUARTx->SCON)), enIrqSel, FALSE);
return Ok;
}
/**
******************************************************************************
** \brief lpuart通信时钟源选择
**
** \param [in] LPUARTx通道号,enClk 时钟源选项
**
** \retval Ok 设置成功
**\retval ErrorInvalidParameter设置失败
******************************************************************************/
en_result_t LPUart_SelSclk(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_sclksel_t enSclk)
{
ASSERT(IS_VALID_CLK(enSclk));
LPUARTx->SCON_f.SCLKSEL = enSclk;
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道多主机模式配置
**
** \param [in] LPUARTx通道号,stcMultiCfg多主机模式结构
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_SetMultiMode(M0P_LPUART_TypeDef* LPUARTx, stc_lpuart_multimode_t* pstcMultiCfg)
{
if(NULL != pstcMultiCfg)
{
LPUARTx->SCON_f.ADRDET = TRUE;
LPUARTx->SADDR = pstcMultiCfg->u8SlaveAddr;
LPUARTx->SADEN = pstcMultiCfg->u8SaddEn;
}
else
{
return ErrorInvalidParameter;
}
return Ok;
}
/**
******************************************************************************
** \brief LPUART单线半双工模式使能
**
** \param [in] LPUARTx 通道号
**
** \retval Null
******************************************************************************/
void LPUart_HdModeEnable(M0P_LPUART_TypeDef* LPUARTx)
{
LPUARTx->SCON_f.HDSEL = TRUE;
}
/**
******************************************************************************
** \brief LPUART单线半双工模式关闭
**
** \param [in] LPUARTx 通道号
**
** \retval Null
******************************************************************************/
void LPUart_HdModeDisable(M0P_LPUART_TypeDef* LPUARTx)
{
LPUARTx->SCON_f.HDSEL = FALSE;
}
/**
******************************************************************************
** \brief LPUART通道多机模式发送数据/地址帧配置TB8
**
** \param [in] LPUARTx 通道号
** \param [in] TRUE-TB8为地址帧标志;FALSE-TB8为数据帧标志;
**
** \retval Null
******************************************************************************/
void LPUart_SetTb8(M0P_LPUART_TypeDef* LPUARTx, boolean_t bTB8Value)
{
LPUARTx->SCON_f.B8CONT = bTB8Value;
}
/**
******************************************************************************
** \brief 获取RB8数值
**
** \param [in] LPUARTx 通道号
**
** \retval RB8
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
boolean_t LPUart_GetRb8(M0P_LPUART_TypeDef* LPUARTx)
{
return (LPUARTx->SBUF_f.DATA8);
}
/**
******************************************************************************
** \brief LPUART通道多主机模式从机地址配置函数
**
** \param [in] LPUARTx 通道号,addr地址
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_SetSaddr(M0P_LPUART_TypeDef* LPUARTx,uint8_t u8Addr)
{
LPUARTx->SADDR = u8Addr;
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道发送或接收等功能使能设置
**
** \param [in] u8Idx通道号,enFunc功能
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_EnableFunc(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_func_t enFunc)
{
SetBit((uint32_t)(&(LPUARTx->SCON)), enFunc, TRUE);
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道发送或接收等功能禁止设置
**
** \param [in] u8Idx通道号,enFunc功能
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_DisableFunc(M0P_LPUART_TypeDef* LPUARTx, en_lpuart_func_t enFunc)
{
SetBit((uint32_t)(&(LPUARTx->SCON)), enFunc, FALSE);
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道通信状态获取
**
** \param [in] u8Idx通道号
**
** \retval 状态值
******************************************************************************/
uint8_t LPUart_GetIsr(M0P_LPUART_TypeDef* LPUARTx)
{
return (LPUARTx->ISR);
}
/**
******************************************************************************
** \brief LPUART通道通信状态获取
**
** \param [in] u8Idx通道号,enStatus获取哪个状态
**
** \retval 状态值
**\retval ErrorInvalidParameter获取失败
******************************************************************************/
boolean_t LPUart_GetStatus(M0P_LPUART_TypeDef* LPUARTx,en_lpuart_status_t enStatus)
{
boolean_t bStatus = FALSE;
ASSERT(IS_VALID_STATUS(enStatus));
bStatus = GetBit((uint32_t)(&(LPUARTx->ISR)), enStatus);
return bStatus;
}
/**
******************************************************************************
** \brief LPUART通道通信状态全部清除
**
** \param [in] u8Idx通道号
**
** \retval OK
******************************************************************************/
en_result_t LPUart_ClrIsr(M0P_LPUART_TypeDef* LPUARTx)
{
LPUARTx->ICR = 0u;
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道通信状态清除
**
** \param [in] u8Idx通道号,enStatus清除哪个状态
**
** \retval 状态值
**\retval ErrorInvalidParameter清除失败
******************************************************************************/
en_result_t LPUart_ClrStatus(M0P_LPUART_TypeDef* LPUARTx,en_lpuart_status_t enStatus)
{
ASSERT(IS_VALID_STATUS(enStatus));
SetBit((uint32_t)(&(LPUARTx->ICR)), enStatus, FALSE);
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道发送数据函数,查询方式调用此函数,中断方式发送不适用
**
** \param [in] u8Idx通道号,Data发送数据
**
** \retval Ok发送成功
**\retval ErrorInvalidParameter发送失败
******************************************************************************/
en_result_t LPUart_SendData(M0P_LPUART_TypeDef* LPUARTx, uint8_t u8Data)
{
while(FALSE == LPUart_GetStatus(LPUARTx,LPUartTxe))
{}
LPUARTx->SBUF_f.DATA = u8Data;
while(FALSE == LPUart_GetStatus(LPUARTx,LPUartTC))
{}
LPUart_ClrStatus(LPUARTx,LPUartTC);
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道发送数据函数,中断方式调用此函数
**
** \param [in] u8Idx通道号,Data发送数据
**
** \retval Ok发送成功
**\retval ErrorInvalidParameter发送失败
******************************************************************************/
en_result_t LPUart_SendDataIt(M0P_LPUART_TypeDef* LPUARTx, uint8_t u8Data)
{
LPUARTx->SBUF_f.DATA = u8Data;
return Ok;
}
/**
******************************************************************************
** \brief LPUART通道接收数据函数
**
** \param [in] u8Idx通道号
**
** \retval 接收数据
**\retval ErrorInvalidParameter接收失败
******************************************************************************/
uint8_t LPUart_ReceiveData(M0P_LPUART_TypeDef* LPUARTx)
{
return (LPUARTx->SBUF_f.DATA);
}
/**
******************************************************************************
** \brief LPUART通道初始化函数
**
** \param [in] u8Idx通道号,pstcCfg初始化结构体 @ref stc_lpuart_cfg_t
**
** \retval OK配置成功
**\retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t LPUart_Init(M0P_LPUART_TypeDef* LPUARTx,stc_lpuart_cfg_t* pstcCfg)
{
en_result_t enRet = Error;
const uint32_t u32Over[3] = {0x4, 0x3, 0x2};
uint16_t u16OverShift;
float32_t f32Scnt=0;
if(NULL == pstcCfg)
{
return ErrorInvalidParameter;
}
LPUARTx->SCON = 0;
LPUARTx->SCON = (uint32_t)pstcCfg->enStopBit |
(uint32_t)pstcCfg->enMmdorCk |
(uint32_t)pstcCfg->stcBaud.enSclkDiv |
(uint32_t)pstcCfg->stcBaud.enSclkSel |
(uint32_t)pstcCfg->enRunMode;
if((LPUartMskMode1 == pstcCfg->enRunMode) || (LPUartMskMode3 == pstcCfg->enRunMode))
{
u16OverShift = u32Over[pstcCfg->stcBaud.enSclkDiv/LPUartMsk8Or16Div];
f32Scnt = (float32_t)(pstcCfg->stcBaud.u32Sclk)/(float32_t)(pstcCfg->stcBaud.u32Baud<<u16OverShift);
LPUARTx->SCNT = (uint16_t)(float32_t)(f32Scnt + 0.5f);
LPUart_EnableFunc(LPUARTx,LPUartRenFunc); ///<使能收发
}
enRet = Ok;
return enRet;
}
//@} // LPUartGroup
+216
View File
@@ -0,0 +1,216 @@
/******************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file lvd.c
**
** Low Voltage Detect driver API.
** @link Lvd Group Some description @endlink
**
** - 2017-06-28 Alex First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "lvd.h"
/**
******************************************************************************
** \addtogroup LvdGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
#define IS_VALID_INPUT(x) ( (x) <= LvdInputPB07 )
#define IS_VALID_THRESHOLD(x) ( (x) <= LvdTH3p3V )
#define IS_VALID_FILTER(x) ( (x) <= LvdFilter29ms )
#define IS_VALID_IRQTYPE(x) ( (x) <= LvdIrqFall )
/******************************************************************************
* Global variable definitions (declared in header file with 'extern') *
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
// static void LvdEnableNvic(void);
// static void LvdDisableNvic(void);
// static en_result_t LvdEnable(en_lvd_type_t enType, boolean_t bFlag);
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
* \brief
* 使能LVD中断
*
* \param [in] enType LVD中断类型
*
* \retval en_result_t Ok: 设置成功
* \retval en_result_t ErrorInvalidParameter: 无效类型
*/
void Lvd_EnableIrq(void)
{
M0P_LVD->CR_f.IE = TRUE;
}
/**
* \brief
* 除能LVD中断
*
* \param 无
*
* \retval 无
*/
void Lvd_DisableIrq(void)
{
M0P_LVD->CR_f.IE = FALSE;
}
/**
* \brief
* LVD初始化
*
* \param [in] pstcCfg LVD配置指针
*
* \retval 无
*/
void Lvd_Init(stc_lvd_cfg_t *pstcCfg)
{
M0P_LVD->CR = 0;
M0P_LVD->CR = (uint32_t)pstcCfg->enAct |
(uint32_t)pstcCfg->enFilter |
(uint32_t)pstcCfg->enFilterTime |
(uint32_t)pstcCfg->enInputSrc |
(uint32_t)pstcCfg->enIrqType |
(uint32_t)pstcCfg->enThreshold;
}
/**
* \brief
* 使能LVD
*
* \param 无
*
* \retval 无
*
*/
void Lvd_Enable(void)
{
M0P_LVD->CR_f.LVDEN = 1u;
}
/**
* \brief
* 除能LVD
*
* \param 无
*
* \retval 无
*/
void Lvd_Disable(void)
{
M0P_LVD->CR_f.LVDEN = 0u;
}
/**
* \brief
* 获取LVD中断标志
*
* \param 无
*
* \retval boolean_t 中断标志
*/
boolean_t Lvd_GetIrqStat(void)
{
return M0P_LVD->IFR_f.INTF;
}
/**
* \brief
* 清除LVD中断标志
*
* \param 无
*
* \retval 无
*/
void Lvd_ClearIrq(void)
{
M0P_LVD->IFR_f.INTF = 0u;
}
/**
* \brief
* 获取Filter结果
*
* \param 无
*
* \retval boolean_t Fliter结果
*/
boolean_t Lvd_GetFilterResult(void)
{
return (boolean_t)M0P_LVD->IFR_f.FILTER;
}
//@} // LvdGroup
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+153
View File
@@ -0,0 +1,153 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file opa.c
**
** opa driver API.
** @link opa Group Some description @endlink
**
** - 2019-04-11 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "opa.h"
/**
******************************************************************************
** \addtogroup OPAGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
******************************************************************************
** \brief OPA 通道使能
**
** \param NewStatus : TRUE FALSE
** \retval 无
**
******************************************************************************/
void Opa_Cmd(boolean_t NewStatus)
{
SetBit((uint32_t)(&(M0P_OPA->CR0)), 0, NewStatus);
}
void Opa_CmdBuf(boolean_t NewStatus)
{
SetBit((uint32_t)(&(M0P_OPA->CR0)), 2, NewStatus);
}
/**
******************************************************************************
** \brief OPA零点校准配置
**
** \param InitZero :
** \retval 无
**
******************************************************************************/
void Opa_SetZero(stc_opa_zcfg_t* InitZero)
{
M0P_OPA->CR0_f.AZEN = InitZero->bAzen;
M0P_OPA->CR1_f.CLK_SW_SET = InitZero->bClk_sw_set;
M0P_OPA->CR1_f.AZ_PULSE = InitZero->bAz_pulse;
M0P_OPA->CR1_f.TRIGGER = InitZero->bTrigger;
M0P_OPA->CR1_f.ADCTR_EN = InitZero->bAdctr_en;
}
/**
******************************************************************************
** \brief 使能输出OUTX
**
** \param onex : en_opa_oenx_t定义的元素
** \retval 无
**
******************************************************************************/
void Opa_CmdOnex(en_opa_oenx_t onex, boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_OPA->CR0)), onex, NewState); //使能OP3输出X使能
}
/**
******************************************************************************
** \brief 配置校零相关的位
**
** \param CtrlBit : en_opa_set0ctrl_t定义的元素
** \param NewState: TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Opa_ZeroBitCtrl(en_opa_set0ctrl_t CtrlBit, boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_OPA->CR1)), CtrlBit, NewState);
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+555
View File
@@ -0,0 +1,555 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file pca.c
**
** pca driver API.
** @link pcnt Group Some description @endlink
**
** - 2019-04-09 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "pca.h"
/**
******************************************************************************
** \addtogroup PCNTGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/**
******************************************************************************
** \brief 获取中断源的标志位
** @param IT_Src : 中断源标志位
** \retval FALSE 或TRUE
**
******************************************************************************/
boolean_t Pca_GetItStatus(en_pca_ccficlr_t It_Src)
{
return (((M0P_PCA->CCON)>>It_Src) & 1) > 0? TRUE : FALSE;
}
/**
******************************************************************************
** \brief 清除中断源的标志位
** @param IT_Src : 中断源标志位
** \retval 无
**
******************************************************************************/
void Pca_ClrItStatus(en_pca_ccficlr_t It_Src)
{
M0P_PCA->ICLR &= ~(uint32_t)(1<<It_Src);
}
/**
******************************************************************************
** \brief PCA 计数器运行控制 PCA_CCON CR控制位
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Pca_StartPca(boolean_t NewStatus)
{
SetBit((uint32_t)(&(M0P_PCA->CCON)), 6, NewStatus);
}
/**
******************************************************************************
** \brief PCA 空闲模式IDLE下,PCA是否停止工作设置
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Pca_SetCidl(boolean_t NewStatus)
{
SetBit((uint32_t)(&(M0P_PCA->CMOD)), 7, NewStatus);
}
/**
******************************************************************************
** \brief PCA 模块4的看门狗使能控制
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Pca_Set4Wdte(boolean_t NewStatus)
{
SetBit((uint32_t)(&(M0P_PCA->CMOD)), 6, NewStatus);
}
/**
******************************************************************************
** \brief PCA 计数器中断控制PCA_CMOD中CFIE,对应的控制中断位PCA_CCON中的CF与PCA_ICLR中的CF
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Pca_ConfPcaIt(boolean_t NewStatus)
{
SetBit((uint32_t)(&(M0P_PCA->CMOD)), 0, NewStatus);
}
/**
******************************************************************************
** \brief PCA 比较捕获中断使能控制 PCA_CCAPMx的CCIE
** @param Modulex : pca_module0~4
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Pca_ConfModulexIt(en_pca_module_t Modulex, boolean_t NewStatus)
{
switch(Modulex)
{
case PcaModule0:
SetBit((uint32_t)(&(M0P_PCA->CCAPM0)), 0, NewStatus);
break;
case PcaModule1:
SetBit((uint32_t)(&(M0P_PCA->CCAPM1)), 0, NewStatus);
break;
case PcaModule2:
SetBit((uint32_t)(&(M0P_PCA->CCAPM2)), 0, NewStatus);
break;
case PcaModule3:
SetBit((uint32_t)(&(M0P_PCA->CCAPM3)), 0, NewStatus);
break;
case PcaModule4:
SetBit((uint32_t)(&(M0P_PCA->CCAPM4)), 0, NewStatus);
break;
default:
break;
}
}
/**
******************************************************************************
** \brief PCA 模块0的初始化
** @param InitStruct : PCA初始化配置的结构体
** \retval 无
**
******************************************************************************/
void Pca_M0Init(stc_pcacfg_t* InitStruct)
{
M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
M0P_PCA->CCAPM0_f.ECOM = InitStruct->pca_ecom;
M0P_PCA->CCAPM0_f.CAPP = InitStruct->pca_capp;
M0P_PCA->CCAPM0_f.CAPN = InitStruct->pca_capn;
M0P_PCA->CCAPM0_f.MAT = InitStruct->pca_mat;
M0P_PCA->CCAPM0_f.TOG = InitStruct->pca_tog;
M0P_PCA->CCAPM0_f.PWM = InitStruct->pca_pwm;
M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
if(InitStruct->pca_pwm == PcaPwm8bitEnable)
{
M0P_PCA->CCAP0L_f.CCAP0 = InitStruct->pca_ccapl;
M0P_PCA->CCAP0H_f.CCAP0 = InitStruct->pca_ccaph;
}
else
{
M0P_PCA->CCAP0_f.CCAP0 = InitStruct->pca_ccap;
}
M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
}
/**
******************************************************************************
** \brief PCA 模块1的初始化
** @param InitStruct : PCA初始化配置的结构体
** \retval 无
**
******************************************************************************/
void Pca_M1Init(stc_pcacfg_t* InitStruct)
{
M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
M0P_PCA->CCAPM1_f.ECOM = InitStruct->pca_ecom;
M0P_PCA->CCAPM1_f.CAPP = InitStruct->pca_capp;
M0P_PCA->CCAPM1_f.CAPN = InitStruct->pca_capn;
M0P_PCA->CCAPM1_f.MAT = InitStruct->pca_mat;
M0P_PCA->CCAPM1_f.TOG = InitStruct->pca_tog;
M0P_PCA->CCAPM1_f.PWM = InitStruct->pca_pwm;
M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
if(InitStruct->pca_pwm == PcaPwm8bitEnable)
{
M0P_PCA->CCAP1L_f.CCAP1 = InitStruct->pca_ccapl;
M0P_PCA->CCAP1H_f.CCAP1 = InitStruct->pca_ccaph;
}
else
{
M0P_PCA->CCAP1_f.CCAP1 = InitStruct->pca_ccap;
}
M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
}
/**
******************************************************************************
** \brief PCA 模块2的初始化
** @param InitStruct : PCA初始化配置的结构体
** \retval 无
**
******************************************************************************/
void Pca_M2Init(stc_pcacfg_t* InitStruct)
{
M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
M0P_PCA->CCAPM2_f.ECOM = InitStruct->pca_ecom;
M0P_PCA->CCAPM2_f.CAPP = InitStruct->pca_capp;
M0P_PCA->CCAPM2_f.CAPN = InitStruct->pca_capn;
M0P_PCA->CCAPM2_f.MAT = InitStruct->pca_mat;
M0P_PCA->CCAPM2_f.TOG = InitStruct->pca_tog;
M0P_PCA->CCAPM2_f.PWM = InitStruct->pca_pwm;
M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
if(InitStruct->pca_pwm == PcaPwm8bitEnable)
{
M0P_PCA->CCAP2L_f.CCAP2 = InitStruct->pca_ccapl;
M0P_PCA->CCAP2H_f.CCAP2 = InitStruct->pca_ccaph;
}
else
{
M0P_PCA->CCAP2_f.CCAP2 = InitStruct->pca_ccap;
}
M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
}
/**
******************************************************************************
** \brief PCA 模块3的初始化
** @param InitStruct : PCA初始化配置的结构体
** \retval 无
**
******************************************************************************/
void Pca_M3Init(stc_pcacfg_t* InitStruct)
{
M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
M0P_PCA->CCAPM3_f.ECOM = InitStruct->pca_ecom;
M0P_PCA->CCAPM3_f.CAPP = InitStruct->pca_capp;
M0P_PCA->CCAPM3_f.CAPN = InitStruct->pca_capn;
M0P_PCA->CCAPM3_f.MAT = InitStruct->pca_mat;
M0P_PCA->CCAPM3_f.TOG = InitStruct->pca_tog;
M0P_PCA->CCAPM3_f.PWM = InitStruct->pca_pwm;
M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
if(InitStruct->pca_pwm == PcaPwm8bitEnable)
{
M0P_PCA->CCAP3L_f.CCAP3 = InitStruct->pca_ccapl;
M0P_PCA->CCAP3H_f.CCAP3 = InitStruct->pca_ccaph;
}
else
{
M0P_PCA->CCAP3_f.CCAP3 = InitStruct->pca_ccap;
}
M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
}
/**
******************************************************************************
** \brief PCA 模块4的初始化
** @param InitStruct : PCA初始化配置的结构体
** \retval 无
**
******************************************************************************/
void Pca_M4Init(stc_pcacfg_t* InitStruct)
{
M0P_PCA->CMOD_f.CPS = InitStruct->pca_clksrc;
M0P_PCA->CMOD_f.CIDL = InitStruct->pca_cidl;
M0P_PCA->CCAPM4_f.ECOM = InitStruct->pca_ecom;
M0P_PCA->CCAPM4_f.CAPP = InitStruct->pca_capp;
M0P_PCA->CCAPM4_f.CAPN = InitStruct->pca_capn;
M0P_PCA->CCAPM4_f.MAT = InitStruct->pca_mat;
M0P_PCA->CCAPM4_f.TOG = InitStruct->pca_tog;
M0P_PCA->CCAPM4_f.PWM = InitStruct->pca_pwm;
M0P_PCA->EPWM_f.EPWM = InitStruct->pca_epwm;
if(InitStruct->pca_pwm == PcaPwm8bitEnable)
{
M0P_PCA->CCAP4L_f.CCAP4 = InitStruct->pca_ccapl;
M0P_PCA->CCAP4H_f.CCAP4 = InitStruct->pca_ccaph;
}
else
{
M0P_PCA->CCAP4_f.CCAP4 = InitStruct->pca_ccap;
}
M0P_PCA->CARR_f.CARR = InitStruct->pca_carr;
}
/**
******************************************************************************
** \brief PCA 读取CNT寄存器的数值
** @param 无
** \retval CNT的低半字值
**
******************************************************************************/
uint16_t Pca_GetCnt(void)
{
return (uint16_t)(M0P_PCA->CNT);
}
/**
******************************************************************************
** \brief PCA 向CNT寄存器写入数值
** @param cnt : 所要写入的数值
** \retval 无
**
******************************************************************************/
void Pca_SetCnt(uint16_t cnt)
{
if(GetBit((uint32_t)(&(M0P_PCA->CCON)), 6)==TRUE)
{
Pca_StartPca(FALSE);
M0P_PCA->CNT_f.CNT = cnt;
Pca_StartPca(TRUE);
}
else
{
M0P_PCA->CNT_f.CNT = cnt;
}
}
/**
******************************************************************************
** \brief PCA 返回指定通道比较高速输出标志寄存器的值
** @param Modulex : 通道号x=0、1、2、3、4
** \retval TRUE 或 FALSE
**
******************************************************************************/
boolean_t Pca_GetOut(en_pca_module_t Modulex)
{
return GetBit((uint32_t)(&(M0P_PCA->CCAPO)), Modulex);
}
/**
******************************************************************************
** \brief PCA 设置比较捕获16位寄存器CCAPx数值
** @param Modulex : 通道号x=0、1、2、3、4
** @param Value: 所要设置的值
** \retval 无
**
******************************************************************************/
void Pca_SetCcap(en_pca_module_t Modulex, uint16_t Value)
{
switch(Modulex)
{
case 0:
M0P_PCA->CCAP0_f.CCAP0 = Value;
break;
case 1:
M0P_PCA->CCAP1_f.CCAP1 = Value;
break;
case 2:
M0P_PCA->CCAP2_f.CCAP2 = Value;
break;
case 3:
M0P_PCA->CCAP3_f.CCAP3 = Value;
break;
case 4:
M0P_PCA->CCAP4_f.CCAP4 = Value;
break;
default:
break;
}
}
/**
******************************************************************************
** \brief PCA 读取比较捕获16位寄存器CCAPx数值
** @param Modulex : 通道号x=0、1、2、3、4
** \retval CCAPx的值,x=0、1、2、3、4
**
******************************************************************************/
uint16_t Pca_GetCcap(en_pca_module_t Modulex)
{
uint16_t tmp;
switch(Modulex)
{
case 0:
tmp = M0P_PCA->CCAP0_f.CCAP0;
break;
case 1:
tmp = M0P_PCA->CCAP1_f.CCAP1;
break;
case 2:
tmp = M0P_PCA->CCAP2_f.CCAP2;
break;
case 3:
tmp = M0P_PCA->CCAP3_f.CCAP3;
break;
case 4:
tmp = M0P_PCA->CCAP4_f.CCAP4;
break;
default:
break;
}
return tmp;
}
/**
******************************************************************************
** \brief PCA 设置自动重装载寄存器数值
** @param 无
** \retval 无
**
******************************************************************************/
void Pca_SetCarr(uint16_t Value)
{
M0P_PCA->CARR_f.CARR = Value;
}
/**
******************************************************************************
** \brief PCA 获取自动重装载寄存器数值
** @param 无
** \retval 无
**
******************************************************************************/
uint16_t Pca_GetCarr(void)
{
return M0P_PCA->CARR_f.CARR;
}
/**
******************************************************************************
** \brief PCA 设置比较捕获寄存器的高8位和低8位
** @param Modulex : 通道号x=0、1、2、3、4
** @param ValueH : 要写入高8位的数值
** @param ValueL : 要写入低8位的数值
** \retval 无
**
******************************************************************************/
void Pca_SetCcapHL(en_pca_module_t Modulex, uint8_t ValueH, uint8_t ValueL)
{
switch(Modulex)
{
case 0:
M0P_PCA->CCAP0H_f.CCAP0 = ValueH;
M0P_PCA->CCAP0L_f.CCAP0 = ValueL;
break;
case 1:
M0P_PCA->CCAP1H_f.CCAP1 = ValueH;
M0P_PCA->CCAP1L_f.CCAP1 = ValueL;
break;
case 2:
M0P_PCA->CCAP2H_f.CCAP2 = ValueH;
M0P_PCA->CCAP2L_f.CCAP2 = ValueL;
break;
case 3:
M0P_PCA->CCAP3H_f.CCAP3 = ValueH;
M0P_PCA->CCAP3L_f.CCAP3 = ValueL;
break;
case 4:
M0P_PCA->CCAP4H_f.CCAP4 = ValueH;
M0P_PCA->CCAP4L_f.CCAP4 = ValueL;
break;
default:
break;
}
}
/**
******************************************************************************
** \brief PCA 读取比较捕获寄存器的高8位和低8位
** @param Modulex : 通道号x=0、1、2、3、4
** @param ValueH : CCAPx高8位的数值
** @param ValueL : CCAPx低8位的数值
** \retval 无
**
******************************************************************************/
void Pca_GetCcapHL(en_pca_module_t Modulex, uint8_t *ValueH, uint8_t *ValueL)
{
switch(Modulex)
{
case 0:
*ValueH = M0P_PCA->CCAP0H_f.CCAP0;
*ValueL = M0P_PCA->CCAP0L_f.CCAP0;
break;
case 1:
*ValueH = M0P_PCA->CCAP1H_f.CCAP1;
*ValueL = M0P_PCA->CCAP1L_f.CCAP1;
break;
case 2:
*ValueH = M0P_PCA->CCAP2H_f.CCAP2;
*ValueL = M0P_PCA->CCAP2L_f.CCAP2;
break;
case 3:
*ValueH = M0P_PCA->CCAP3H_f.CCAP3;
*ValueL = M0P_PCA->CCAP3L_f.CCAP3;
break;
case 4:
*ValueH = M0P_PCA->CCAP4H_f.CCAP4;
*ValueL = M0P_PCA->CCAP4L_f.CCAP4;
break;
default:
break;
}
}
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+316
View File
@@ -0,0 +1,316 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file pcnt.c
**
** pcnt driver API.
** @link pcnt Group Some description @endlink
**
** - 2019-04-08 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "pcnt.h"
/**
******************************************************************************
** \addtogroup PCNTGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/**
******************************************************************************
** \brief PCNT的启动和停止控制
** @param NewState : Run_Enable 或者 Run_Disable
** @param NewState : FALSE或者TRUE
** \retval 无
**
******************************************************************************/
boolean_t Pcnt_Cmd(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_PCNT->RUN)), 0, NewState);
return GetBit((uint32_t)(&(M0P_PCNT->RUN)), 0);
}
/**
******************************************************************************
** \brief 将BUF中的值同步到CNT
** @param value : 要同步到TOP的数值
** \retval ok 或 ErrorTimeout
**
******************************************************************************/
en_result_t Pcnt_SetB2T(uint16_t value)
{
uint16_t u16TimeOut;
u16TimeOut = 1000;
M0P_PCNT->BUF = value;
M0P_PCNT->CMD_f.B2T = 1;
while(u16TimeOut--)
{
if(M0P_PCNT->SR2_f.B2T == FALSE)
{
break;
}
}
if(u16TimeOut == 0)
{
return ErrorTimeout;
}
return Ok;
}
/**
******************************************************************************
** \brief 将BUF中的值同步到CNT
** @param value : 要同步到CNT的数值
** \retval ok 或 ErrorTimeout
**
******************************************************************************/
en_result_t Pcnt_SetB2C(uint16_t value)
{
uint16_t u16TimeOut;
u16TimeOut = 1000;
M0P_PCNT->BUF = value;
M0P_PCNT->CMD_f.B2C = 1;
while(u16TimeOut--)
{
if(M0P_PCNT->SR2_f.B2C == FALSE)
{
break;
}
}
if(u16TimeOut == 0)
{
return ErrorTimeout;
}
return Ok;
}
/**
******************************************************************************
** \brief 将TOP中的值同步到CNT
** @param value : 要同步到CNT的数值
** \retval ok 或 ErrorTimeout
**
******************************************************************************/
en_result_t Pcnt_SetT2C(void)
{
uint16_t u16TimeOut;
u16TimeOut = 1000;
M0P_PCNT->CMD_f.T2C = 1;
while(u16TimeOut--)
{
if(M0P_PCNT->SR2_f.T2C == FALSE)
{
break;
}
}
if(u16TimeOut == 0)
{
return ErrorTimeout;
}
return Ok;
}
/**
******************************************************************************
** \brief 赋值BUF
** @param value : 要赋值给BUF的数值
** \retval 无
**
******************************************************************************/
void Pcnt_SetBuf(uint16_t value)
{
M0P_PCNT->TOP_f.TOP = value;
}
/**
******************************************************************************
** \brief 初始化
** @param start : 要同步到TOP的数值
** @param end : 要同步到CNT的数值
** \retval ok 或 ErrorTimeout
**
******************************************************************************/
void Pcnt_Init(stc_pcnt_initstruct_t* InitStruct)
{
M0P_PCNT->CTRL_f.S1P = InitStruct->Pcnt_S1Sel;
M0P_PCNT->CTRL_f.S0P = InitStruct->Pcnt_S0Sel;
M0P_PCNT->CTRL_f.CLKSEL = InitStruct->Pcnt_Clk;
M0P_PCNT->CTRL_f.MODE = InitStruct->Pcnt_Mode;
if(InitStruct->Pcnt_Mode == PcntDoubleMode)//如果是双通道正交脉冲计数模式
{
M0P_PCNT->SR1_f.DIR = InitStruct->Pcnt_Dir;
}
else
{
M0P_PCNT->CTRL_f.DIR = InitStruct->Pcnt_Dir;
}
M0P_PCNT->FLT_f.EN = InitStruct->Pcnt_FltEn;
M0P_PCNT->FLT_f.DEBTOP = InitStruct->Pcnt_DebTop;
M0P_PCNT->FLT_f.CLKDIV = InitStruct->Pcnt_ClkDiv;
M0P_PCNT->TOCR_f.EN = InitStruct->Pcnt_TocrEn;
M0P_PCNT->TOCR_f.TH = InitStruct->Pcnt_TocrTh;
M0P_PCNT->DBG_f.DBG = InitStruct->Pcnt_Dbg;
}
/**
******************************************************************************
** \brief 配置中断源的使能
** @param IT_Src : 中断源再PCNT_IEN内部的位位置
** @param NewState : FALSE 或TRUE
** \retval 无
**
******************************************************************************/
void Pcnt_ItCfg(en_pcnt_itfce_t IT_Src, boolean_t NewState)
{
if(NewState == TRUE)
{
M0P_PCNT->IEN |= (uint32_t)(1<<IT_Src);
}
else if(NewState == FALSE)
{
M0P_PCNT->IEN &= ~(uint32_t)(1<<IT_Src);
}
else
{
;
}
}
/**
******************************************************************************
** \brief 获取中断源的标志位
** @param IT_Src : 中断源标志位
** \retval FALSE 或TRUE
**
******************************************************************************/
boolean_t Pcnt_GetItStatus(en_pcnt_itfce_t IT_Src)
{
return ((M0P_PCNT->IFR >> IT_Src) & 1u) > 0 ? TRUE : FALSE;
}
/**
******************************************************************************
** \brief 清除中断源的标志位
** @param IT_Src : 中断源标志位
** \retval 无
**
******************************************************************************/
void Pcnt_ClrItStatus(en_pcnt_itfce_t IT_Src)
{
M0P_PCNT->ICR &= ~(uint32_t)(1<<(uint32_t)IT_Src);
}
/**
******************************************************************************
** \brief 获取PCNT_CNT寄存器的数值
** @param 无
** \retval PCNT_CNT数值
**
******************************************************************************/
uint16_t Pcnt_GetCnt(void)
{
return (uint16_t)(M0P_PCNT->CNT);
}
/**
******************************************************************************
** \brief 获取PCNT_TOP寄存器的数值
** @param 无
** \retval PCNT_TOP数值
**
******************************************************************************/
uint16_t Pcnt_GetTop(void)
{
return (uint16_t)(M0P_PCNT->TOP);
}
/**
******************************************************************************
** \brief 获取PCNT_BUF寄存器的数值
** @param 无
** \retval PCNT_BUF数值
**
******************************************************************************/
uint16_t Pcnt_GetBuf(void)
{
return (uint16_t)(M0P_PCNT->BUF);
}
//@} // Group
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+156
View File
@@ -0,0 +1,156 @@
/******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file ram.c
**
** Common API of ram.
** @link RamGroup Some description @endlink
**
** - 2018-05-08
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "ram.h"
/**
*******************************************************************************
** \addtogroup ramGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief Ram奇偶校验出错地址获取
**
**
** \retval ERROR ADDRESS
*****************************************************************************/
uint32_t Ram_ErrAddrGet(void)
{
return M0P_RAM->ERRADDR;
}
/**
*****************************************************************************
** \brief Ram中断标志获取
**
**
** \retval TRUE or FALSE
*****************************************************************************/
boolean_t Ram_GetIntFlag(void)
{
if(M0P_RAM->IFR & 0x1)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
*****************************************************************************
** \brief Ram中断标志清除
**
**
** \retval Null
*****************************************************************************/
void Ram_ClearIntFlag(void)
{
M0P_RAM->ICLR = 0u;
}
/**
*****************************************************************************
** \brief Ram中断使能
**
** \retval Null
*****************************************************************************/
void Ram_EnableIrq (void)
{
M0P_RAM->CR |= 0x2u;
}
/**
*****************************************************************************
** \brief ram中断禁止
**
** \retval Null
*****************************************************************************/
void Ram_DisableIrq(void)
{
M0P_RAM->CR &= 0x1;
}
//@} // RamGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+184
View File
@@ -0,0 +1,184 @@
/******************************************************************************
*Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file reset.c
**
** Common API of reset.
** @link resetGroup Some description @endlink
**
** - 2017-05-04
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "reset.h"
/**
*******************************************************************************
** \addtogroup ResetGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*******************************************************************************
** \brief 获取复位源类型.
**
** \param [out] enRstFlg @ref en_reset_flag_t
**
** \retval TRUE or FALSE
******************************************************************************/
boolean_t Reset_GetFlag(en_reset_flag_t enRstFlg)
{
if(M0P_RESET->RESET_FLAG&enRstFlg)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
*******************************************************************************
** \brief 清除复位源类型.
**
** \param [in] pstcFlag @ref en_reset_flag_t
**
** \retval Null
******************************************************************************/
void Reset_ClearFlag(en_reset_flag_t enRstFlg)
{
M0P_RESET->RESET_FLAG &= ~(uint32_t)enRstFlg;
}
/**
*******************************************************************************
** \brief 清除所有复位源类型.
**
** \param Null
**
** \retval Null
******************************************************************************/
void Reset_ClearFlagAll(void)
{
M0P_RESET->RESET_FLAG = 0;
}
/**
*******************************************************************************
** \brief 所有模块进行一次复位.
**
**
** \retval Null
******************************************************************************/
void Reset_RstPeripheralAll(void)
{
M0P_RESET->PERI_RESET0 = 0u;
M0P_RESET->PERI_RESET0 = 0xFFFFFFFFu;
M0P_RESET->PERI_RESET1 = 0u;
M0P_RESET->PERI_RESET1 = 0xFFFFFFFFu;
}
/**
*******************************************************************************
** \brief 对外设源0模块进行一次复位.
**
** \param [in] enPeri @ref en_reset_peripheral0_t
**
** \retval Null
******************************************************************************/
void Reset_RstPeripheral0(en_reset_peripheral0_t enPeri)
{
M0P_RESET->PERI_RESET0 &= ~(uint32_t)enPeri;
M0P_RESET->PERI_RESET0 |= (uint32_t)enPeri;
}
/**
*******************************************************************************
** \brief 对外设源1模块进行一次复位.
**
** \param [in] enPeri @ref en_reset_peripheral1_t
**
** \retval Null
******************************************************************************/
void Reset_RstPeripheral1(en_reset_peripheral1_t enPeri)
{
M0P_RESET->PERI_RESET1 &= ~(uint32_t)enPeri;
M0P_RESET->PERI_RESET1 |= (uint32_t)enPeri;
}
//@} // ResetGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+520
View File
@@ -0,0 +1,520 @@
/*************************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file rtc.c
**
** RTC function driver API.
** @link SampleGroup Some description @endlink
**
** - 2019-04-10 First version
**
******************************************************************************/
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "rtc.h"
/**
******************************************************************************
** \addtogroup RtcGroup
******************************************************************************/
//@{
/******************************************************************************/
/* Local pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************/
/* Local function prototypes ('const') */
/******************************************************************************/
const uint8_t Leap_Month_Base[] = {3,6,0,3,5,1,3,6,2,4,0,2};
const uint8_t NonLeap_Month_Base[] = {4,0,0,3,5,1,3,6,2,4,0,2};
const uint8_t Cnst_Month_Tbl[12]={0x31,0x28,0x31,0x30,0x31,0x30,0x31,0x31,0x30,0x31,0x30,0x31};
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/******************************************************************************/
/* Local variable prototypes ('static') */
/******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
******************************************************************************
** \brief RTC计数器的使能或停止
**
** @param NewState : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Rtc_Cmd(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_RTC->CR0)), 7, NewState);
}
/**
******************************************************************************
** \brief RTC计数器启动等待函数,如启动RTC计数器后立即进入低功耗模式,
** 进入低功耗模式之前需执行此函数,以确保RTC已启动完成
**
** @param NewState : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Rtc_StartWait(void)
{
M0P_RTC->CR1_f.WAIT = 1;
while (M0P_RTC->CR1_f.WAITF != 1) //等待直到WAITF=1
{
;
}
M0P_RTC->CR1_f.WAIT = 0;
while (M0P_RTC->CR1_f.WAITF != 0) //等待直到WAITF=0
{
;
}
}
/**
******************************************************************************
** \brief RTC的1Hz输出的使能或停止
** @param pricision : RtcHz1selGeneralPricision 或 RtcHz1selHighPricision
** @param NewState : Hz1o_Disable 或 HZ1o_Enable
** \retval 无
**
******************************************************************************/
void Rtc_Hz1Cmd(en_rtc_hz1sel_t pricision, boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_RTC->CR0)), 6, pricision); //设置普通精度或者高精度1Hz输出
SetBit((uint32_t)(&(M0P_RTC->CR0)), 5, NewState); //设置1Hz输出使能或禁止
}
/**
******************************************************************************
** \brief 设置周期中断的类型(PRDSEL)及其所选类型的时间(PRDS或PRDX)
**
** @param pstCyc: 根据结构体的定义设置PRDSEL、PRDS与PRDX
** \retval Ok、Error 或 ErrorInvalidParameter
**
******************************************************************************/
en_result_t Rtc_SetCyc(stc_rtc_cyccfg_t* pstCyc)
{
en_result_t enRet = Error;
M0P_RTC->CR0_f.PRDSEL = pstCyc->rtcPrdsel;
if(pstCyc->rtcPrdsel == RtcPrds)
{
M0P_RTC->CR0_f.PRDS = pstCyc->rtcPrds;
}
else if(pstCyc->rtcPrdsel == RtcPrdx)
{
if(pstCyc->rtcPrdx>=64)
{
enRet = ErrorInvalidParameter;
return enRet;
}
M0P_RTC->CR0_f.PRDX = pstCyc->rtcPrdx;
}
else
{
;
}
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief RTC闹钟中断的使能或停止
**
** @param NewState : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Rtc_AlmIeCmd(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_RTC->CR1)), 3, 0); //清除周期中断标志位
SetBit((uint32_t)(&(M0P_RTC->CR1)), 4, 0); //清除周期中断标志位
SetBit((uint32_t)(&(M0P_RTC->CR1)), 6, NewState);
}
/**
******************************************************************************
** \brief RTC闹钟的使能或停止
**
** @param NewState : Almen_Disable 或 Almen_Enable
** \retval 无
**
******************************************************************************/
void Rtc_AlmEnCmd(boolean_t NewState)
{
SetBit((uint32_t)(&(M0P_RTC->CR1)), 7, NewState);
}
/**
******************************************************************************
** \brief 获取RTC闹钟中断状态位
**
** @param 无
** \retval TRUE 或 FALSE
**
******************************************************************************/
boolean_t Rtc_GetAlmfItStatus(void)
{
return GetBit((uint32_t)(&(M0P_RTC->CR1)), 4);
}
/**
******************************************************************************
** \brief 清除RTC闹钟中断状态位
**
** @param 无
** \retval 无
**
******************************************************************************/
void Rtc_ClearAlmfItStatus(void)
{
SetBit((uint32_t)(&(M0P_RTC->CR1)), 4, 0);
}
/**
******************************************************************************
** \brief 清除RTC周期中断状态位
**
** @param 无
** \retval 无
**
******************************************************************************/
void Rtc_ClearPrdfItStatus(void)
{
SetBit((uint32_t)(&(M0P_RTC->CR1)), 3, 0);
}
/**
******************************************************************************
** \brief 获取RTC周期中断状态位
**
** @param 无
** \retval TRUE 或 FALSE
**
******************************************************************************/
boolean_t Rtc_GetPridItStatus(void)
{
return GetBit((uint32_t)(&(M0P_RTC->CR1)), 3);
}
/**
******************************************************************************
** \brief 配置RTC的误差补偿寄存器
**
** @param CompValue:数值的范围为:32-256
** @param NewStatus: RtcCompenDisable 或 RtcAmCompenEnable
** \retval Ok ErrorInvalidParameter
**
******************************************************************************/
en_result_t Rtc_CompCfg(uint16_t CompVlue, en_rtc_compen_t NewStatus)
{
en_result_t enRet = Error;
if(CompVlue<=256)
{
M0P_RTC->COMPEN_f.EN = NewStatus;
M0P_RTC->COMPEN_f.CR = CompVlue;
}
else
{
enRet = ErrorInvalidParameter;
}
return enRet;
}
/**
******************************************************************************
** \brief RTC根据日期计算周数
**
** \param pu8buf时间数据
** \param u8limit_min最小值
** \param u8limit_max最大值
**
** \retval Error 错误,Ok校验正确
**
******************************************************************************/
en_result_t Check_BCD_Format(uint8_t u8data,uint8_t u8limit_min, uint8_t u8limit_max)
{
if (((u8data & 0x0F) > 0x09) || ((u8data & 0xF0) > 0x90)
||(u8data > u8limit_max) || (u8data < u8limit_min))
{
return Error;
}
return Ok;
}
/**
******************************************************************************
** \brief RTC 平、闰年检测
**
** \param u8year:年十进制低两位:0-99
**
** \retval 1:闰年 0:平年
**
******************************************************************************/
uint8_t Rtc_CheckLeapYear(uint8_t u8year)
{
uint16_t tmp;
tmp=2000+u8year;
if((((tmp % 4)==0) && ((tmp % 100) !=0))|| ((tmp % 400) ==0))
{
return 1;
}
else
{
return 0;
}
}
/**
******************************************************************************
** \brief RTC根据年获取二月的天数
**
** \param [in] u8month月份,u8year年份
**
** \retval u8day天数:28或29
**
******************************************************************************/
uint8_t Get_Month2_Day( uint8_t u8year)
{
uint8_t u8day = 0;
u8day = 28;
if(Rtc_CheckLeapYear(u8year) == 1)
{
u8day++;
}
return u8day;
}
/**
******************************************************************************
** \brief RTC获取时间函数
**
** \param time: 用于存放读取自时间寄存器的时间数据,格式为BCD码格式
**
** \retval Ok 获取正常
** \retval ErrorTimeout 时间溢出错误
******************************************************************************/
en_result_t Rtc_ReadDateTime(stc_rtc_time_t* time)
{
uint32_t u32TimeOut;
ASSERT(NULL != pstcTimeDate);
u32TimeOut = 1000;
if(1 == M0P_RTC->CR0_f.START)
{
M0P_RTC->CR1_f.WAIT = 1;
while(u32TimeOut--)
{
if(M0P_RTC->CR1_f.WAITF)
{
break;
}
}
if(u32TimeOut==0)
{
return ErrorTimeout;
}
}
time->u8Second = M0P_RTC->SEC;
time->u8Minute = M0P_RTC->MIN;
if(1 == M0P_RTC->CR0_f.AMPM)
{
time->u8Hour = M0P_RTC->HOUR;
}
else
{
time->u8Hour = M0P_RTC->HOUR&0x1f;
}
time->u8Day = M0P_RTC->DAY;
time->u8DayOfWeek = M0P_RTC->WEEK;
time->u8Month = M0P_RTC->MON;
time->u8Year = M0P_RTC->YEAR;
M0P_RTC->CR1_f.WAIT = 0;
if(1 == M0P_RTC->CR0_f.START)
{
while(M0P_RTC->CR1_f.WAITF)
{}
}
return Ok;
}
/**
******************************************************************************
** \brief 向RTC时间寄存器写入时间
**
** \param time: 存放时间的结构体,各个时间均为BCD码格式
**
** \retval ErrorTimeout 或 Ok
**
******************************************************************************/
en_result_t Rtc_SetTime(stc_rtc_time_t* time)
{
en_result_t enRet = Ok;
uint16_t u16TimeOut;
u16TimeOut = 1000;
if(M0P_RTC->CR0_f.START == 1)
{
M0P_RTC->CR1_f.WAIT = 1;
while(--u16TimeOut)
{
if(M0P_RTC->CR1_f.WAITF)
{
break;
}
}
if(u16TimeOut==0)
{
return ErrorTimeout;
}
}
M0P_RTC->SEC = time->u8Second;
M0P_RTC->MIN = time->u8Minute;
M0P_RTC->HOUR = time->u8Hour;
M0P_RTC->DAY = time->u8Day;
M0P_RTC->MON = time->u8Month;
M0P_RTC->YEAR = time->u8Year;
M0P_RTC->WEEK = time->u8DayOfWeek;
M0P_RTC->CR1_f.WAIT = 0;
if(M0P_RTC->CR0_f.START == 1)
{
while(M0P_RTC->CR1_f.WAITF)
{}
}
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief RTC闹钟中断时间获取
**
** \param pstcAlarmTime:存放闹钟时间寄存器数据:秒 分 时 周
**
** \retval 无
**
******************************************************************************/
void Rtc_GetAlarmTime(stc_rtc_alarmtime_t* pstcAlarmTime)
{
pstcAlarmTime->RtcAlarmSec = M0P_RTC->ALMSEC;
pstcAlarmTime->RtcAlarmMinute = M0P_RTC->ALMMIN;
pstcAlarmTime->RtcAlarmHour = M0P_RTC->ALMHOUR;
pstcAlarmTime->RtcAlarmWeek = M0P_RTC->ALMWEEK;
}
/**
******************************************************************************
** \brief RTC闹钟设置
**
** \param [in] pstcAlarmTime闹钟时间:秒 分 时 周
**
** \retval Ok 设置正常
**
******************************************************************************/
en_result_t Rtc_SetAlarmTime(stc_rtc_alarmtime_t* pstcAlarmTime)
{
en_result_t enRet = Ok;
// ASSERT(NULL != pstcAlarmTime);
Rtc_AlmEnCmd(FALSE); //闹钟禁止以后再设置闹钟时间
enRet = Check_BCD_Format(pstcAlarmTime->RtcAlarmSec,0x00,0x59);
if(M0P_RTC->CR0_f.AMPM == RtcAm)
{
enRet = Check_BCD_Format(pstcAlarmTime->RtcAlarmHour,0x00,0x12);
}
else
{
enRet = Check_BCD_Format(pstcAlarmTime->RtcAlarmHour,0x00,0x24);
}
if(enRet != Ok)
{
return enRet;
}
enRet = Check_BCD_Format(pstcAlarmTime->RtcAlarmMinute,0x00,0x59);
if(enRet != Ok)
{
return enRet;
}
if(enRet != Ok)
{
return enRet;
}
M0P_RTC->ALMSEC = pstcAlarmTime->RtcAlarmSec & 0x7f;
M0P_RTC->ALMMIN = pstcAlarmTime->RtcAlarmMinute & 0x7f;
M0P_RTC->ALMHOUR = pstcAlarmTime->RtcAlarmHour & 0x3f;
M0P_RTC->ALMWEEK = pstcAlarmTime->RtcAlarmWeek;
Rtc_AlmEnCmd(TRUE); //闹钟许可
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief 初始化RTC
**
** @param Rtc_InitStruct 存放stc_rtc_initstruct_t类型的结构体
** \retval 无
**
******************************************************************************/
void Rtc_Init(stc_rtc_initstruct_t* Rtc_InitStruct)
{
Rtc_Cmd(FALSE);
M0P_RTC->CR0_f.AMPM = Rtc_InitStruct->rtcAmpm; //实时时钟小时的时制
Rtc_SetCyc(&Rtc_InitStruct->rtcPrdsel); //设置周期中断的类型(PRDSEL)及其所选类型的时间(PRDS或PRDX)
M0P_RTC->CR1_f.CKSEL = Rtc_InitStruct->rtcClksrc; //实时时钟RTC的时钟源
Rtc_CompCfg(Rtc_InitStruct->rtcCompValue, Rtc_InitStruct->rtcCompen); //配置时钟误差补偿寄存器
Rtc_SetTime(&Rtc_InitStruct->rtcTime); //设置初始时钟
}
+363
View File
@@ -0,0 +1,363 @@
/******************************************************************************
* Copyright (C) 2016, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with eaenCh copy of this software, whether used in part or whole,
* at all times.
*/
/*****************************************************************************/
/** \file spi.c
**
** SPI driver API.
** @link Driver Group Some description @endlink
**
** - 2018-05-17 1.0 Devi First version for Device Driver Library of
** Module.
**
*****************************************************************************/
/******************************************************************************
* Include files
*****************************************************************************/
#include "spi.h"
/**
******************************************************************************
** \addtogroup SpiGroup
*****************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
*****************************************************************************/
#define IS_VALID_STAT(x) ( SpiIf == (x)||\
SpiSserr == (x)||\
SpiBusy == (x)||\
SpiMdf == (x)||\
SpiTxe == (x)||\
SpiRxne == (x))
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/******************************************************************************/
/* Local variable prototypes ('static') */
/******************************************************************************/
/**
******************************************************************************
** \brief SPI 请求状态获取
**
** \param [in]SPIx 通道, enStatus 获取请求
**
** \retval 请求状态
**
******************************************************************************/
boolean_t Spi_GetStatus(M0P_SPI_TypeDef* SPIx, en_spi_status_t enStatus)
{
ASSERT(IS_VALID_STAT(enStatus));
if(SPIx->STAT&enStatus)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
******************************************************************************
** \brief SPI中断清除
**
** \param [in]SPIx 通道选择
**
** \retval 请求状态
**
******************************************************************************/
en_result_t Spi_ClearStatus(M0P_SPI_TypeDef* SPIx)
{
SPIx->ICLR = 0;
return Ok;
}
/**
******************************************************************************
** \brief SPI 中断使能函数
**
** \param [in] SPIx 通道
**
** \retval Ok成功
**
******************************************************************************/
en_result_t Spi_IrqEnable(M0P_SPI_TypeDef* SPIx)
{
SPIx->CR2 |= 0x4u;
return Ok;
}
/**
******************************************************************************
** \brief SPI 中断禁止函数
**
** \param [in] enCh通道
**
** \retval Ok成功
**
******************************************************************************/
en_result_t Spi_IrqDisable(M0P_SPI_TypeDef* SPIx)
{
SPIx->CR2 &= ~0x4u;
return Ok;
}
/**
******************************************************************************
** \brief SPI 功能使能函数
**
** \param [in] SPIx 通道,enFunc功能
**
** \retval Ok初始化成功
**
******************************************************************************/
en_result_t Spi_FuncEnable(M0P_SPI_TypeDef* SPIx, en_spi_func_t enFunc)
{
SPIx->CR2 |= enFunc;
return Ok;
}
/**
******************************************************************************
** \brief SPI 功能禁止函数
**
** \param [in] SPIx 通道,enFunc功能
**
** \retval Ok初始化成功
**
******************************************************************************/
en_result_t Spi_FuncDisable(M0P_SPI_TypeDef* SPIx, en_spi_func_t enFunc)
{
SPIx->CR2 &= ~(uint32_t)enFunc;
return Ok;
}
/**
******************************************************************************
** \brief SPI 总体初始化函数
**
** \param [in] SPIx 通道
** \param [in] pstcSpiCfg 初始化结构体
**
** \retval Ok初始化成功
** \retval ErrorInvalidParameter 初始化错误
******************************************************************************/
en_result_t Spi_Init(M0P_SPI_TypeDef* SPIx, stc_spi_cfg_t *pstcSpiCfg)
{
ASSERT(NULL != pstcSpiCfg);
SPIx->CR = 0;
SPIx->SSN = TRUE;
SPIx->CR = (uint32_t)pstcSpiCfg->enSpiMode |
(uint32_t)pstcSpiCfg->enPclkDiv |
(uint32_t)pstcSpiCfg->enCPOL |
(uint32_t)pstcSpiCfg->enCPHA |
(uint32_t)0x40;
SPIx->STAT = 0x00;
return Ok;
}
/**
******************************************************************************
** \brief SPI 配置主发送的电平
**
** \param [in] SPIx 通道选择,bFlag高低电平
**
** \retval 无
**
******************************************************************************/
void Spi_SetCS(M0P_SPI_TypeDef* SPIx, boolean_t bFlag)
{
SPIx->SSN = bFlag;
}
/**
******************************************************************************
** \brief SPI 发送一字节函数
**
** \param [in] SPIx 通道选择,u8Data发送字节
**
** \retval Ok发送成功
**
******************************************************************************/
en_result_t Spi_SendData(M0P_SPI_TypeDef* SPIx, uint8_t u8Data)
{
SPIx->DATA = u8Data;
return Ok;
}
/**
******************************************************************************
** \brief SPI 读/写一字节函数
**
** \param [in] SPIx 通道选择
** \param [in] u8Data 发送一字节数据
**
** \retval 接收一字节数据
**
******************************************************************************/
uint8_t Spi_RWByte(M0P_SPI_TypeDef* SPIx, uint8_t u8Data)
{
uint16_t Dly = 0xffff;
while(FALSE == SPIx->STAT_f.TXE) {
Dly--;
if(Dly == 0)
break;
}
Dly = 0xffff;
SPIx->DATA = u8Data;
while(FALSE == SPIx->STAT_f.RXNE) {
Dly--;
if(Dly == 0)
break;
}
return SPIx->DATA;
}
/**
******************************************************************************
** \brief SPI 从机预准备第一字节数据
**
** \param [in] SPIx 通道选择
** \param [in] u8Data 预准备第一字节数据
**
** \retval None
**
******************************************************************************/
void Spi_Slave_DummyWriteData(M0P_SPI_TypeDef* SPIx, uint8_t u8Data)
{
while(FALSE == SPIx->STAT_f.TXE){;}
SPIx->DATA = u8Data;
}
/**
******************************************************************************
** \brief SPI 连续发送多字节函数
**
** \param [in] SPIx 通道选择
** \param [in] pu8Buf 发送数据指针
**
** \retval Ok发送成功
**
******************************************************************************/
en_result_t Spi_SendBuf(M0P_SPI_TypeDef* SPIx, uint8_t* pu8Buf, uint32_t u32Len)
{
uint32_t u32Index=0;
for(u32Index=0; u32Index<u32Len; u32Index++)
{
while(FALSE == SPIx->STAT_f.TXE){;}
SPIx->DATA = pu8Buf[u32Index];
while(FALSE == SPIx->STAT_f.RXNE){;}
pu8Buf[u32Index] = SPIx->DATA;
}
while(FALSE == SPIx->STAT_f.TXE){;}
while(TRUE == SPIx->STAT_f.BUSY){;}
return Ok;
}
/**
******************************************************************************
** \brief SPI 接收一字节函数
**
** \param [in] SPIx接收通道
**
** \retval 接收一字节数据
**
******************************************************************************/
uint8_t Spi_ReceiveData(M0P_SPI_TypeDef* SPIx)
{
return SPIx->DATA;
}
/**
******************************************************************************
** \brief SPI 连续接收多字节函数
**
** \param [in] SPIx 通道选择
** \param [in] pu8Buf 发送数据指针
**
** \retval Ok发送成功
**
******************************************************************************/
en_result_t Spi_ReceiveBuf(M0P_SPI_TypeDef* SPIx, uint8_t* pu8Buf, uint32_t u32Len)
{
uint32_t u32Index=0;
for(u32Index=0; u32Index<u32Len; u32Index++)
{
while(FALSE == SPIx->STAT_f.TXE){;}
SPIx->DATA = 0x00;
while(FALSE == SPIx->STAT_f.RXNE){;}
pu8Buf[u32Index] = SPIx->DATA;
}
while(TRUE == SPIx->STAT_f.BUSY){;}
return Ok;
}
//@} // SpiGroup
/******************************************************************************
* EOF (not truncated)
*****************************************************************************/
+746
View File
@@ -0,0 +1,746 @@
/******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file sysctrl.c
**
** Common API of sysctrl.
** @link SysctrlGroup Some description @endlink
**
** - 2018-04-22 Lux
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "sysctrl.h"
/**
*******************************************************************************
** \addtogroup SysctrlGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
#define CLK_TIMEOUT (1000000u)
#define IS_VALID_SRC(x) ( ClkRCH == (x)||\
ClkXTH == (x)||\
ClkRCL == (x)||\
ClkXTL == (x) )
#define IS_VALID_FUNC(x) ( ClkFuncWkupRCH == (x)||\
ClkFuncXTHEn == (x)||\
ClkFuncXTLEn == (x)||\
ClkFuncXTLAWSON == (x)||\
ClkFuncFaultEn == (x)||\
ClkFuncRtcLPWEn == (x)||\
ClkFuncLockUpEn == (x)||\
ClkFuncRstPinIOEn == (x)||\
ClkFuncSwdPinIOEn == (x) )
#define RC_TRIM_BASE_ADDR ((volatile uint16_t*) (0x00100C00ul))
#define RCH_CR_TRIM_24M_VAL (*((volatile uint16_t*) (0x00100C00ul)))
#define RCH_CR_TRIM_22_12M_VAL (*((volatile uint16_t*) (0x00100C02ul)))
#define RCH_CR_TRIM_16M_VAL (*((volatile uint16_t*) (0x00100C04ul)))
#define RCH_CR_TRIM_8M_VAL (*((volatile uint16_t*) (0x00100C06ul)))
#define RCH_CR_TRIM_4M_VAL (*((volatile uint16_t*) (0x00100C08ul)))
#define RCL_CR_TRIM_38400_VAL (*((volatile uint16_t*) (0x00100C20ul)))
#define RCL_CR_TRIM_32768_VAL (*((volatile uint16_t*) (0x00100C22ul)))
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
extern uint32_t SystemCoreClock;
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*******************************************************************************
** \brief SYSCTRL0\SYSCTRL1寄存器操作解锁
**
** \retval None
******************************************************************************/
static void _SysctrlUnlock(void)
{
M0P_SYSCTRL->SYSCTRL2 = 0x5A5A;
M0P_SYSCTRL->SYSCTRL2 = 0xA5A5;
}
/**
*******************************************************************************
** \brief 系统时钟源使能
** \param [in] enSource 目标时钟源
** \param [in] bFlag 使能1-开/0-关
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_ClkSourceEnable(en_sysctrl_clk_source_t enSource, boolean_t bFlag)
{
en_result_t enRet = Ok;
uint32_t u32Temp;
_SysctrlUnlock();
bFlag = !!bFlag;
u32Temp = M0P_SYSCTRL->PERI_CLKEN0;
switch (enSource)
{
case SysctrlClkRCH:
M0P_SYSCTRL->SYSCTRL0_f.RCH_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->RCH_CR_f.STABLE))
{
;
}
break;
case SysctrlClkXTH:
M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = TRUE;
M0P_GPIO->PFADS |= 3u;
M0P_SYSCTRL->SYSCTRL0_f.XTH_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->XTH_CR_f.STABLE))
{
;
}
break;
case SysctrlClkRCL:
M0P_SYSCTRL->SYSCTRL0_f.RCL_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->RCL_CR_f.STABLE))
{
;
}
break;
case SysctrlClkXTL:
M0P_SYSCTRL->PERI_CLKEN0_f.GPIO = TRUE;
M0P_GPIO->PCADS |= 0xC000;
M0P_SYSCTRL->SYSCTRL0_f.XTL_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->XTL_CR_f.STABLE))
{
;
}
break;
case SysctrlClkPLL:
M0P_SYSCTRL->PERI_CLKEN0_f.ADC = TRUE;
M0P_BGR->CR_f.BGR_EN = TRUE;
delay10us(20);
M0P_SYSCTRL->SYSCTRL0_f.PLL_EN = bFlag;
while(bFlag && (1 != M0P_SYSCTRL->PLL_CR_f.STABLE))
{
;
}
break;
default:
enRet = ErrorInvalidParameter;
break;
}
M0P_SYSCTRL->PERI_CLKEN0 = u32Temp;
return enRet;
}
/**
*******************************************************************************
** \brief 外部高速晶振驱动配置
** \param [in] enFreq 外部高速晶振频率范围选择
** \param [in] enDriver 外部高速晶振驱动能力选择
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_XTHDriverCfg(en_sysctrl_xtal_driver_t enDriver)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->XTH_CR_f.DRIVER = enDriver;
return enRet;
}
/**
*******************************************************************************
** \brief 外部低速晶振驱动配置
** \param [in] enFreq 外部低速晶振频率范围选择
** \param [in] enDriver 外部低速晶振驱动能力选择
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_XTLDriverCfg(en_sysctrl_xtl_amp_t enAmp, en_sysctrl_xtal_driver_t enDriver)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->XTL_CR_f.AMP_SEL = enAmp;
M0P_SYSCTRL->XTL_CR_f.DRIVER = enDriver;
return enRet;
}
/**
*******************************************************************************
** \brief 外部高速时钟稳定周期配置
** \param [in] enCycle 外部高速时钟稳定周期设置
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetXTHStableTime(en_sysctrl_xth_cycle_t enCycle)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->XTH_CR_f.STARTUP = enCycle;
return enRet;
}
/**
*******************************************************************************
** \brief 内部低速时钟稳定周期配置
** \param [in] enCycle 内部低速时钟稳定周期设置
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetRCLStableTime(en_sysctrl_rcl_cycle_t enCycle)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->RCL_CR_f.STARTUP = enCycle;
return enRet;
}
/**
*******************************************************************************
** \brief 外部低速时钟稳定周期配置
** \param [in] enCycle 外部低速时钟稳定周期设置
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetXTLStableTime(en_sysctrl_xtl_cycle_t enCycle)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->XTL_CR_f.STARTUP = enCycle;
return enRet;
}
/**
*******************************************************************************
** \brief PLL稳定周期配置
** \param [in] enCycle PLL稳定周期设置
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetPLLStableTime(en_sysctrl_pll_cycle_t enCycle)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->PLL_CR_f.STARTUP = enCycle;
return enRet;
}
/**
*******************************************************************************
** \brief 时钟源切换,该函数执行后会开启新时钟源
** \note 选择时钟源之前,需根据需要配置目标时钟源的频率/驱动参数/使能时钟源等
** \param [in] enSource 新时钟源
**
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SysClkSwitch(en_sysctrl_clk_source_t enSource)
{
en_result_t enRet = Ok;
en_sysctrl_clk_source_t ClkNew = enSource;
_SysctrlUnlock();
M0P_SYSCTRL->SYSCTRL0_f.CLKSW = ClkNew;
//更新Core时钟(HCLK
SystemCoreClockUpdate();
return enRet;
}
/**
*******************************************************************************
** \brief 获得系统时钟(HCLK)频率值
** \retval uint32_t HCLK频率值
**
******************************************************************************/
uint32_t Sysctrl_GetHClkFreq(void)
{
uint32_t u32Val = 0;
const uint32_t u32hcr_tbl[] = { 4000000, 8000000, 16000000, 22120000, 24000000};
const uint16_t u32lcr_tbl[] = { 32768, 38400};
en_sysctrl_clk_source_t enSrc;
uint16_t u16Trim[5] = {0};
u16Trim[4] = RCH_CR_TRIM_24M_VAL;
u16Trim[3] = RCH_CR_TRIM_22_12M_VAL;
u16Trim[2] = RCH_CR_TRIM_16M_VAL;
u16Trim[1] = RCH_CR_TRIM_8M_VAL;
u16Trim[0] = RCL_CR_TRIM_38400_VAL;
//获取当前系统时钟
enSrc = (en_sysctrl_clk_source_t)(M0P_SYSCTRL->SYSCTRL0_f.CLKSW);
switch (enSrc)
{
case SysctrlClkRCH:
{
if((M0P_SYSCTRL->RCH_CR_f.TRIM) == (u16Trim[4]))
{
u32Val = u32hcr_tbl[4];
}
else if((M0P_SYSCTRL->RCH_CR_f.TRIM) == (u16Trim[3]))
{
u32Val = u32hcr_tbl[3];
}
else if((M0P_SYSCTRL->RCH_CR_f.TRIM) == (u16Trim[2]))
{
u32Val = u32hcr_tbl[2];
}
else if((M0P_SYSCTRL->RCH_CR_f.TRIM) == (u16Trim[1]))
{
u32Val = u32hcr_tbl[1];
}
else
{
u32Val = u32hcr_tbl[0];
}
}
break;
case SysctrlClkXTH:
u32Val = SYSTEM_XTH;
break;
case SysctrlClkRCL:
{
if(u16Trim[0] == (M0P_SYSCTRL->RCL_CR_f.TRIM))
{
u32Val = u32lcr_tbl[1];
}
else
{
u32Val = u32lcr_tbl[0];
}
}
break;
case SysctrlClkXTL:
u32Val = SYSTEM_XTL;
break;
case SysctrlClkPLL:
{
if (SysctrlPllRch == M0P_SYSCTRL->PLL_CR_f.REFSEL)
{
if(u16Trim[4] == M0P_SYSCTRL->RCH_CR_f.TRIM)
{
u32Val = u32hcr_tbl[4];
}
else if(u16Trim[3] == M0P_SYSCTRL->RCH_CR_f.TRIM)
{
u32Val = u32hcr_tbl[3];
}
else if(u16Trim[2] == M0P_SYSCTRL->RCH_CR_f.TRIM)
{
u32Val = u32hcr_tbl[2];
}
else if(u16Trim[1] == M0P_SYSCTRL->RCH_CR_f.TRIM)
{
u32Val = u32hcr_tbl[1];
}
else
{
u32Val = u32hcr_tbl[0];
}
}
else
{
u32Val = SYSTEM_XTH;
}
u32Val = (u32Val * M0P_SYSCTRL->PLL_CR_f.DIVN);
}
break;
default:
u32Val = 0u;
break;
}
u32Val = (u32Val >> M0P_SYSCTRL->SYSCTRL0_f.HCLK_PRS);
return u32Val;
}
/**
*******************************************************************************
** \brief 获得外设时钟(PCLK)频率值
** \retval uint32_t PCLK频率值(Hz)
**
******************************************************************************/
uint32_t Sysctrl_GetPClkFreq(void)
{
uint32_t u32Val = 0;
u32Val = Sysctrl_GetHClkFreq();
u32Val = (u32Val >> (M0P_SYSCTRL->SYSCTRL0_f.PCLK_PRS));
return u32Val;
}
/**
*******************************************************************************
** \brief 时钟初始化函数
** \param [in] pstcCfg 初始化配置参数
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_ClkInit(stc_sysctrl_clk_cfg_t *pstcCfg)
{
en_result_t enRet = Ok;
//系统时钟参数配置
switch(pstcCfg->enClkSrc)
{
case SysctrlClkRCH:
break;
case SysctrlClkXTH:
Sysctrl_XTHDriverCfg(SysctrlXtalDriver3);
Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
break;
case SysctrlClkRCL:
Sysctrl_SetRCLStableTime(SysctrlRclStableCycle256);
break;
case SysctrlClkXTL:
Sysctrl_XTLDriverCfg(SysctrlXtlAmp3, SysctrlXtalDriver3);
Sysctrl_SetXTLStableTime(SysctrlXtlStableCycle16384);
break;
case SysctrlClkPLL:
Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384);
break;
default:
enRet = ErrorInvalidParameter;
break;
}
//时钟源使能
Sysctrl_ClkSourceEnable(pstcCfg->enClkSrc, TRUE);
//时钟源切换
Sysctrl_SysClkSwitch(pstcCfg->enClkSrc);
//时钟分频设置
Sysctrl_SetHCLKDiv(pstcCfg->enHClkDiv);
Sysctrl_SetPCLKDiv(pstcCfg->enPClkDiv);
return enRet;
}
/**
*******************************************************************************
** \brief 时钟去初始化函数
** \param [in]
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_ClkDeInit(void)
{
en_result_t enRet = Ok;
//配置RCH为内部4Hz
Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);
//时钟源使能
Sysctrl_ClkSourceEnable(SysctrlClkRCH, TRUE);
//时钟源切换
Sysctrl_SysClkSwitch(SysctrlClkRCH);
//其它时钟源使能关闭
Sysctrl_ClkSourceEnable(SysctrlClkXTH, FALSE);
Sysctrl_ClkSourceEnable(SysctrlClkRCL, FALSE);
Sysctrl_ClkSourceEnable(SysctrlClkXTL, FALSE);
Sysctrl_ClkSourceEnable(SysctrlClkPLL, FALSE);
//时钟分频设置
Sysctrl_SetHCLKDiv(SysctrlHclkDiv1);
Sysctrl_SetPCLKDiv(SysctrlPclkDiv1);
return enRet;
}
/**
*******************************************************************************
** \brief 内部高速时钟频率TRIM值加载
** \param [in] enRCHFreq 设定的RCH目标频率值
** \retval Ok 设定成功
** 其他 设定失败或时钟未稳定
******************************************************************************/
en_result_t Sysctrl_SetRCHTrim(en_sysctrl_rch_freq_t enRCHFreq)
{
//加载RCH Trim值
M0P_SYSCTRL->RCH_CR_f.TRIM = *(RC_TRIM_BASE_ADDR + enRCHFreq);
return Ok;
}
/**
*******************************************************************************
** \brief 外部高速时钟频率范围设定
** \param [in] enXTHFreq 设定的频率值
** \retval Ok 设定成功
** 其他 设定失败或时钟未稳定
******************************************************************************/
en_result_t Sysctrl_SetXTHFreq(en_sysctrl_xth_freq_t enXTHFreq)
{
en_result_t enRet = Ok;
M0P_SYSCTRL->XTH_CR_f.XTH_FSEL = enXTHFreq;
return enRet;
}
/**
*******************************************************************************
** \brief PLL时钟配置
** \param [in] pstcPLLCfg PLL配置结构体指针
** \retval Ok 设定成功
** 其他 设定失败或参数值不匹配
******************************************************************************/
en_result_t Sysctrl_SetPLLFreq(stc_sysctrl_pll_cfg_t *pstcPLLCfg)
{
en_result_t enRet = Ok;
uint16_t u16Trim[5] = {0};
u16Trim[4] = RCH_CR_TRIM_24M_VAL;
u16Trim[3] = RCH_CR_TRIM_22_12M_VAL;
u16Trim[2] = RCH_CR_TRIM_16M_VAL;
u16Trim[1] = RCH_CR_TRIM_8M_VAL;
////PLL最高时钟不能超过48MHz
//RCH作为PLL输入
if (SysctrlPllRch == pstcPLLCfg->enPllClkSrc)
{
if( ((u16Trim[4] == M0P_SYSCTRL->RCH_CR_f.TRIM) && (pstcPLLCfg->enPllMul > 2)) ||
((u16Trim[3] == M0P_SYSCTRL->RCH_CR_f.TRIM) && (pstcPLLCfg->enPllMul > 2)) ||
((u16Trim[2] == M0P_SYSCTRL->RCH_CR_f.TRIM) && (pstcPLLCfg->enPllMul > 3)) ||
((u16Trim[1] == M0P_SYSCTRL->RCH_CR_f.TRIM) && (pstcPLLCfg->enPllMul > 6)))
{
return ErrorInvalidMode;
}
}
else //XTH作为PLL输入
{
if ((SYSTEM_XTH * pstcPLLCfg->enPllMul) > 48*1000*1000)
{
return ErrorInvalidMode;
}
}
M0P_SYSCTRL->PLL_CR_f.FRSEL = pstcPLLCfg->enInFreq;
M0P_SYSCTRL->PLL_CR_f.FOSC = pstcPLLCfg->enOutFreq;
M0P_SYSCTRL->PLL_CR_f.DIVN = pstcPLLCfg->enPllMul;
M0P_SYSCTRL->PLL_CR_f.REFSEL = pstcPLLCfg->enPllClkSrc;
return enRet;
}
/**
*******************************************************************************
** \brief 内部低速时钟频率TRIM值加载
** \param [in] enRCLFreq 设定的RCL目标频率值
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetRCLTrim(en_sysctrl_rcl_freq_t enRCLFreq)
{
M0P_SYSCTRL->RCL_CR_f.TRIM = *(RC_TRIM_BASE_ADDR + enRCLFreq);
return Ok;
}
/**
*******************************************************************************
** \brief 系统时钟(HCLK)分频设定
** \param [in] enHCLKDiv 分频设定值
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetHCLKDiv(en_sysctrl_hclk_div_t enHCLKDiv)
{
_SysctrlUnlock();
M0P_SYSCTRL->SYSCTRL0_f.HCLK_PRS = enHCLKDiv;
return Ok;
}
/**
*******************************************************************************
** \brief 外设时钟(PCLK)分频设定
** \param [in] enPCLKDiv 分频设定值
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetPCLKDiv(en_sysctrl_pclk_div_t enPCLKDiv)
{
_SysctrlUnlock();
M0P_SYSCTRL->SYSCTRL0_f.PCLK_PRS = enPCLKDiv;
return Ok;
}
///<< for Sysctrl_SetPeripheralGate() & Sysctrl_GetPeripheralGate()
static volatile boolean_t bDacPeriBac = FALSE;
/**
*******************************************************************************
** \brief 设置外设时钟门控开关
** \param [in] enPeripheral 目标外设
** \param [in] bFlag 使能开关
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetPeripheralGate(en_sysctrl_peripheral_gate_t enPeripheral, boolean_t bFlag)
{
if(enPeripheral&0x20u)
{
enPeripheral &= ~0x20u;
SetBit((uint32_t)(&(M0P_SYSCTRL->PERI_CLKEN1)), enPeripheral, bFlag);
if((SysctrlPeripheralDac & ~0x20u) == enPeripheral)
{
bDacPeriBac = bFlag;
}
else
{
SetBit((uint32_t)(&(M0P_SYSCTRL->PERI_CLKEN1)), (SysctrlPeripheralDac & ~0x20u), bDacPeriBac);
}
}
else
{
SetBit((uint32_t)(&(M0P_SYSCTRL->PERI_CLKEN0)), enPeripheral, bFlag);
}
return Ok;
}
/**
*******************************************************************************
** \brief 获得外设时钟门控开关状态
** \param [in] enPeripheral 目标外设
** \retval TRUE 开
** FALSE 关
******************************************************************************/
boolean_t Sysctrl_GetPeripheralGate(en_sysctrl_peripheral_gate_t enPeripheral)
{
if(enPeripheral&0x20u)
{
if(SysctrlPeripheralDac == enPeripheral)
{
return bDacPeriBac;
}
else
{
enPeripheral &= ~0x20u;
return GetBit((uint32_t)(&(M0P_SYSCTRL->PERI_CLKEN1)), enPeripheral);
}
}
else
{
return GetBit((uint32_t)(&(M0P_SYSCTRL->PERI_CLKEN0)), enPeripheral);
}
}
/**
*******************************************************************************
** \brief 系统功能设定
** \param [in] enFunc 系统功能枚举类型
** \param [in] bFlag 1-开/0-关
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetFunc(en_sysctrl_func_t enFunc, boolean_t bFlag)
{
_SysctrlUnlock();
SetBit((uint32_t)(&(M0P_SYSCTRL->SYSCTRL1)), enFunc, bFlag);
return Ok;
}
/**
*******************************************************************************
** \brief 设定RTC校准时钟频率
** \param [in] enRtcAdj 校准频率值
** \retval Ok 设定成功
** 其他 设定失败
******************************************************************************/
en_result_t Sysctrl_SetRTCAdjustClkFreq(en_sysctrl_rtc_adjust_t enRtcAdj)
{
_SysctrlUnlock();
M0P_SYSCTRL->SYSCTRL1_f.RTC_FREQ_ADJUST = enRtcAdj;
return Ok;
}
//@} // SysctrlGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+1368
View File
File diff suppressed because it is too large Load Diff
+248
View File
@@ -0,0 +1,248 @@
/******************************************************************************
*Copyright(C)2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file trim.c
**
** Common API of trim.
** @link trimGroup Some description @endlink
**
** - 2017-05-16
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "trim.h"
/**
*******************************************************************************
** \addtogroup TrimGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
#define IS_VALID_TRIMINT(x) (TrimStop == (x) ||\
TrimCalCntOf == (x) ||\
TrimXTLFault == (x) ||\
TrimXTHFault == (x) ||\
TrimPLLFault == (x))
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief Trim中断标志获取
**
**
** \param [in] enIntType 中断类型(RefStop、CalCntOf、XTAL32KFault、XTAL32MFault
**
** \retval TRUE or FALSE
*****************************************************************************/
boolean_t Trim_GetIntFlag(en_trim_inttype_t enIntType)
{
ASSERT(IS_VALID_TRIMINT(enIntType));
if(M0P_CLK_TRIM->IFR&enIntType)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
*****************************************************************************
** \brief Trim中断标志清除
**
**
** \param [in] enIntType 中断类型(RefStop、CalCntOf、XTAL32KFault、XTAL32MFault
**
** \retval Ok or Error
*****************************************************************************/
en_result_t Trim_ClearIntFlag(en_trim_inttype_t enIntType)
{
en_result_t enResult = Error;
ASSERT(IS_VALID_TRIMINT(enIntType));
M0P_CLK_TRIM->ICLR &= ~(uint32_t)enIntType;
return enResult;
}
/**
*****************************************************************************
** \brief Trim中断使能
**
**
**
** \retval Null
*****************************************************************************/
void Trim_EnableIrq (void)
{
M0P_CLK_TRIM->CR_f.IE = TRUE;
}
/**
*****************************************************************************
** \brief Trim中断禁止
**
**
**
**
** \retval Ok or Error
*****************************************************************************/
void Trim_DisableIrq(void)
{
M0P_CLK_TRIM->CR_f.IE = FALSE;
}
/**
*****************************************************************************
** \brief Trim初始化配置
**
**
** \param [in] pstcCfg Trim配置结构体指针
**
** \retval Ok or Error
*****************************************************************************/
en_result_t Trim_Init(stc_trim_cfg_t* pstcCfg)
{
en_result_t enResult = Error;
M0P_CLK_TRIM->CR = 0;
M0P_CLK_TRIM->CR = (uint32_t)pstcCfg->enCALCLK |
(uint32_t)pstcCfg->enREFCLK |
(uint32_t)pstcCfg->enMON;
M0P_CLK_TRIM->REFCON = pstcCfg->u32RefCon;
M0P_CLK_TRIM->CALCON = pstcCfg->u32CalCon;
enResult = Ok;
return enResult;
}
/**
*****************************************************************************
** \brief Trim校准/监测启动运行
**
**
**
** \retval Null
*****************************************************************************/
void Trim_Run(void)
{
M0P_CLK_TRIM->CR_f.TRIM_START = TRUE;
}
/**
*****************************************************************************
** \brief Trim校准/监测停止
**
**
**
**
** \retval Null
*****************************************************************************/
void Trim_Stop(void)
{
M0P_CLK_TRIM->CR_f.TRIM_START = FALSE;
}
/**
*****************************************************************************
** \brief Trim参考计数器计数值获取
**
**
** \retval u32Data 参考计数器计数值
*****************************************************************************/
uint32_t Trim_RefCntGet(void)
{
return (uint32_t)M0P_CLK_TRIM->REFCNT;
}
/**
*****************************************************************************
** \brief Trim校准计数器计数值获取
**
**
**
**
** \retval u32Data 校准计数器计数值
*****************************************************************************/
uint32_t Trim_CalCntGet(void)
{
return (uint32_t)M0P_CLK_TRIM->CALCNT;
}
//@} // TrimGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+191
View File
@@ -0,0 +1,191 @@
/******************************************************************************
*Copyright(C)2018, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/** \file rng.c
**
** Common API of rng.
** @link flashGroup Some description @endlink
**
** - 2018-05-08
**
******************************************************************************/
/*******************************************************************************
* Include files
******************************************************************************/
#include "trng.h"
/**
*******************************************************************************
** \addtogroup FlashGroup
******************************************************************************/
//@{
/*******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/*******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/*******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/*******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/*******************************************************************************
* Function implementation - global ('extern') and local ('static')
******************************************************************************/
/**
*****************************************************************************
** \brief 随机数初始化(上电第一次生成随机数)
**
**
** \retval TRUE or FALSE
*****************************************************************************/
en_result_t Trng_Init(void)
{
//==>>生成64bits随机数(上电第一次)
M0P_TRNG->CR_f.RNGCIR_EN = 1;
//模式配置0
M0P_TRNG->MODE_f.LOAD = 1;
M0P_TRNG->MODE_f.FDBK = 1;
M0P_TRNG->MODE_f.CNT = 6;
//生成随机数0
M0P_TRNG->CR_f.RNG_RUN = 1;
while(M0P_TRNG->CR_f.RNG_RUN)
{
;
}
//模式配置1
M0P_TRNG->MODE_f.LOAD = 0;
M0P_TRNG->MODE_f.FDBK = 0;
M0P_TRNG->MODE_f.CNT = 4;
//生成随机数1
M0P_TRNG->CR_f.RNG_RUN = 1;
while(M0P_TRNG->CR_f.RNG_RUN)
{
;
}
//关闭随机源电路,节省功耗
M0P_TRNG->CR_f.RNGCIR_EN = 0;
return Ok;
}
/**
*****************************************************************************
** \brief 生成随机数(非上电第一次生成随机数)
**
**
** \retval TRUE or FALSE
*****************************************************************************/
en_result_t Trng_Generate(void)
{
//==>>生成64bits随机数(非上电第一次生成)
M0P_TRNG->CR_f.RNGCIR_EN = 1;
//模式配置0
M0P_TRNG->MODE_f.LOAD = 0;
M0P_TRNG->MODE_f.FDBK = 1;
M0P_TRNG->MODE_f.CNT = 6;
//生成随机数0
M0P_TRNG->CR_f.RNG_RUN = 1;
while(M0P_TRNG->CR_f.RNG_RUN)
{
;
}
//模式配置1
M0P_TRNG->MODE_f.FDBK = 0;
M0P_TRNG->MODE_f.CNT = 4;
M0P_TRNG->MODE_f.CNT = 4;
//生成随机数1
M0P_TRNG->CR_f.RNG_RUN = 1;
while(M0P_TRNG->CR_f.RNG_RUN)
{
;
}
//关闭随机源电路,节省功耗
M0P_TRNG->CR_f.RNGCIR_EN = 0;
return Ok;
}
/**
*****************************************************************************
** \brief 随机数获取
**
** \retval data0
*****************************************************************************/
uint32_t Trng_GetData0(void)
{
return M0P_TRNG->DATA0;
}
/**
*****************************************************************************
** \brief 随机数获取
**
** \retval data1
*****************************************************************************/
uint32_t Trng_GetData1(void)
{
return M0P_TRNG->DATA1;
}
//@} // TrngGroup
/*******************************************************************************
* EOF (not truncated)
******************************************************************************/
+405
View File
@@ -0,0 +1,405 @@
/*************************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file uart.c
**
** UART function driver API.
** @link SampleGroup Some description @endlink
**
** - 2017-05-17 1.0 CJ First version for Device Driver Library of Module.
**
******************************************************************************/
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "uart.h"
/**
******************************************************************************
** \addtogroup UartGroup
******************************************************************************/
//@{
/******************************************************************************/
/* Local pre-processor symbols/macros ('#define') */
/******************************************************************************/
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/******************************************************************************/
/* Local variable definitions ('static') */
/******************************************************************************/
/**
******************************************************************************
** \brief UART通信中断使能函数设置
**
** \param [in] UARTx通道号,enIrqSel发送or接收中断使能
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_EnableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel)
{
SetBit((uint32_t)(&(UARTx->SCON)), enIrqSel, TRUE);
return Ok;
}
/**
******************************************************************************
** \brief UART通信中断禁止函数设置
**
** \param [in] UARTx通道号,enIrqSel发送or接收中断禁止
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_DisableIrq(M0P_UART_TypeDef* UARTx, en_uart_irq_sel_t enIrqSel)
{
SetBit((uint32_t)(&(UARTx->SCON)), enIrqSel, FALSE);
return Ok;
}
/**
******************************************************************************
** \brief UART通道多主机模式配置
**
** \param [in] UARTx通道号,stcMultiCfg多主机模式结构
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_SetMultiMode(M0P_UART_TypeDef* UARTx, stc_uart_multimode_t* pstcMultiCfg)
{
if(NULL != pstcMultiCfg)
{
UARTx->SCON_f.ADRDET = TRUE;
UARTx->SADDR = pstcMultiCfg->u8SlaveAddr;
UARTx->SADEN = pstcMultiCfg->u8SaddEn;
}
else
{
return ErrorInvalidParameter;
}
return Ok;
}
/**
******************************************************************************
** \brief UART单线半双工模式使能
**
** \param [in] UARTx 通道号
**
** \retval Null
******************************************************************************/
void Uart_HdModeEnable(M0P_UART_TypeDef* UARTx)
{
UARTx->SCON_f.HDSEL = TRUE;
}
/**
******************************************************************************
** \brief UART单线半双工模式关闭
**
** \param [in] UARTx 通道号
**
** \retval Null
******************************************************************************/
void Uart_HdModeDisable(M0P_UART_TypeDef* UARTx)
{
UARTx->SCON_f.HDSEL = FALSE;
}
/**
******************************************************************************
** \brief UART通道多机模式发送数据/地址帧配置TB8
**
** \param [in] UARTx 通道号
** \param [in] TRUE-TB8为地址帧标志;FALSE-TB8为数据帧标志;
**
** \retval Null
******************************************************************************/
void Uart_SetTb8(M0P_UART_TypeDef* UARTx, boolean_t bTB8Value)
{
UARTx->SCON_f.B8CONT = bTB8Value;
}
/**
******************************************************************************
** \brief 获取RB8数值
**
** \param [in] UARTx通道号
**
** \retval RB8
******************************************************************************/
boolean_t Uart_GetRb8(M0P_UART_TypeDef* UARTx)
{
return (UARTx->SBUF_f.DATA8);
}
/**
******************************************************************************
** \brief UART通道多主机模式从机地址配置函数
**
** \param [in] UARTx通道号,addr地址
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_SetSaddr(M0P_UART_TypeDef* UARTx,uint8_t u8Addr)
{
UARTx->SADDR = u8Addr;
return Ok;
}
/**
******************************************************************************
** \brief UART通道发送或接收等功能使能设置
**
** \param [in] UARTx通道号,enFunc功能
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_EnableFunc(M0P_UART_TypeDef* UARTx, en_uart_func_t enFunc)
{
SetBit((uint32_t)(&(UARTx->SCON)), enFunc, TRUE);
return Ok;
}
/**
******************************************************************************
** \brief UART通道发送或接收等功能禁止设置
**
** \param [in] UARTx通道号,enFunc功能
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_DisableFunc(M0P_UART_TypeDef* UARTx, en_uart_func_t enFunc)
{
SetBit((uint32_t)(&(UARTx->SCON)), enFunc, FALSE);
return Ok;
}
/**
******************************************************************************
** \brief UART通道通信状态获取
**
** \param [in] UARTx通道号
**
** \retval 状态值
******************************************************************************/
uint8_t Uart_GetIsr(M0P_UART_TypeDef* UARTx)
{
return (UARTx->ISR);
}
/**
******************************************************************************
** \brief UART通道通信状态获取
**
** \param [in] UARTx通道号,enStatus获取哪个状态
**
** \retval 状态值
******************************************************************************/
boolean_t Uart_GetStatus(M0P_UART_TypeDef* UARTx, en_uart_status_t enStatus)
{
boolean_t bStatus = FALSE;
ASSERT(IS_VALID_STATUS(enStatus));
bStatus = GetBit((uint32_t)(&(UARTx->ISR)), enStatus);
return bStatus;
}
/**
******************************************************************************
** \brief UART通道通信状态清除
**
** \param [in] UARTx通道号
**
** \retval OK
** \retval ErrorInvalidParameter清除失败
******************************************************************************/
en_result_t Uart_ClrIsr(M0P_UART_TypeDef* UARTx)
{
UARTx->ICR = 0u;
return Ok;
}
/**
******************************************************************************
** \brief UART通道通信状态清除
**
** \param [in] UARTx通道号,enStatus清除哪个状态
**
** \retval OK
** \retval ErrorInvalidParameter清除失败
******************************************************************************/
en_result_t Uart_ClrStatus(M0P_UART_TypeDef* UARTx,en_uart_status_t enStatus)
{
ASSERT(IS_VALID_STATUS(enStatus));
SetBit((uint32_t)(&(UARTx->ICR)), enStatus, FALSE);
return Ok;
}
/**
******************************************************************************
** \brief UART通道发送数据函数,查询方式调用此函数,中断方式发送不适用
**
** \param [in] UARTx通道号,Data发送数据
**
** \retval Ok发送成功
** \retval ErrorInvalidParameter发送失败
******************************************************************************/
en_result_t Uart_SendDataPoll(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
{
while(FALSE == Uart_GetStatus(UARTx,UartTxe))
{}
UARTx->SBUF_f.DATA = u8Data;
while(FALSE == Uart_GetStatus(UARTx,UartTC))
{}
Uart_ClrStatus(UARTx,UartTC);
return Ok;
}
/**
******************************************************************************
** \brief UART通道发送数据函数,中断方式调用此函数
**
** \param [in] UARTx通道号,Data发送数据
**
** \retval Ok发送成功
** \retval ErrorInvalidParameter发送失败
******************************************************************************/
en_result_t Uart_SendDataIt(M0P_UART_TypeDef* UARTx, uint8_t u8Data)
{
UARTx->SBUF_f.DATA = u8Data;
return Ok;
}
/**
******************************************************************************
** \brief UART通道接收数据函数
**
** \param [in] UARTx通道号
**
** \retval 接收数据
******************************************************************************/
uint8_t Uart_ReceiveData(M0P_UART_TypeDef* UARTx)
{
return (UARTx->SBUF_f.DATA);
}
/**
******************************************************************************
** \brief UART通道初始化函数
**
** \param [in] UARTx通道号,pstcCfg初始化结构体 @ref stc_uart_cfg_t
**
** \retval OK配置成功
** \retval ErrorInvalidParameter配置失败
******************************************************************************/
en_result_t Uart_Init(M0P_UART_TypeDef* UARTx, stc_uart_cfg_t* pstcCfg)
{
en_result_t enRet = Error;
uint32_t u32Over[2] = {0x4, 0x3};
uint16_t u16OverShift;
float32_t f32Scnt=0;
if(NULL == pstcCfg)
{
return ErrorInvalidParameter;
}
UARTx->SCON = 0;
UARTx->SCON = (uint32_t)pstcCfg->enStopBit |
(uint32_t)pstcCfg->enMmdorCk |
(uint32_t)pstcCfg->stcBaud.enClkDiv |
(uint32_t)pstcCfg->enRunMode;
if((UartMskMode1 == pstcCfg->enRunMode) || (UartMskMode3 == pstcCfg->enRunMode))
{
u16OverShift = u32Over[pstcCfg->stcBaud.enClkDiv/UartMsk8Or16Div];
f32Scnt = (float32_t)(pstcCfg->stcBaud.u32Pclk)/(float32_t)(pstcCfg->stcBaud.u32Baud<<u16OverShift);
UARTx->SCNT = (uint16_t)(float32_t)(f32Scnt + 0.5f);
Uart_EnableFunc(UARTx,UartRenFunc); ///<使能收发
}
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief UART发送字符串
**
** \param [in] UARTx通道号,SendDataString要发送的字符串
**
** \retval
** \retval
******************************************************************************/
void USART_SendString(M0P_UART_TypeDef* USARTx,uint16_t Len, uint8_t *SendDataString)
{
int i = 0;
while(i < Len) //字符串结束符
{
Uart_SendDataPoll(USARTx,SendDataString[i]); //每次发送字符串的一个字符
//Uart_ClrStatus(USARTx, UartTC); //发送字符后清空标志位
i++;
}
}
//@} // UartGroup
+298
View File
@@ -0,0 +1,298 @@
/******************************************************************************
* Copyright (C) 2019, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file vc.c
**
** voltage comparator driver API.
** @link VC Group Some description @endlink
**
** - 2019-04-10 First Version
**
******************************************************************************/
/******************************************************************************
* Include files
******************************************************************************/
#include "vc.h"
/**
******************************************************************************
** \addtogroup VcGroup
******************************************************************************/
//@{
/******************************************************************************
* Local pre-processor symbols/macros ('#define')
******************************************************************************/
/******************************************************************************
* Global variable definitions (declared in header file with 'extern')
******************************************************************************/
/******************************************************************************
* Local type definitions ('typedef')
******************************************************************************/
/******************************************************************************
* Local function prototypes ('static')
******************************************************************************/
/******************************************************************************
* Local variable definitions ('static')
******************************************************************************/
/*****************************************************************************
* Function implementation - global ('extern') and local ('static')
*****************************************************************************/
/**
******************************************************************************
** \brief 配置VC中断触发方式
**
** @param Channelx : VcChannelx x=0、1、2
** @param enSel : VcIrqRise、VcIrqFall、VcIrqHigh
** \retval 无
**
******************************************************************************/
void Vc_CfgItType(en_vc_channel_t Channelx, en_vc_irq_sel_t ItType)
{
stc_vc_vc0_cr_field_t *stcVcnCr;
switch(Channelx)
{
case VcChannel0:
stcVcnCr = (stc_vc_vc0_cr_field_t*)&M0P_VC->VC0_CR_f;
break;
case VcChannel1:
stcVcnCr = (stc_vc_vc0_cr_field_t*)&M0P_VC->VC1_CR_f;
break;
case VcChannel2:
stcVcnCr = (stc_vc_vc0_cr_field_t*)&M0P_VC->VC2_CR_f;
break;
default:
break;
}
switch (ItType)
{
case VcIrqNone:
stcVcnCr->RISING = 0u;
stcVcnCr->FALLING = 0u;
stcVcnCr->LEVEL = 0u;
break;
case VcIrqRise:
stcVcnCr->RISING = 1u;
break;
case VcIrqFall:
stcVcnCr->FALLING = 1u;
break;
case VcIrqHigh:
stcVcnCr->LEVEL = 1u;
break;
default:
break;
}
}
/**
******************************************************************************
** \brief VC 中断使能与禁止
**
** @param Channelx : VcChannelx x=0、1、2
** @param NewStatus : TRUE 或 FALSE
** \retval 无
**
******************************************************************************/
void Vc_ItCfg(en_vc_channel_t Channelx, boolean_t NewStatus)
{
switch(Channelx)
{
case VcChannel0:
SetBit((uint32_t)(&(M0P_VC->VC0_CR)), 15, NewStatus);
break;
case VcChannel1:
SetBit((uint32_t)(&(M0P_VC->VC1_CR)), 15, NewStatus);
break;
case VcChannel2:
SetBit((uint32_t)(&(M0P_VC->VC2_CR)), 15, NewStatus);
break;
default:
break;
}
}
/**
******************************************************************************
** \brief VC 比较结果获取,包含中断标志位和滤波结果
**
** @param Result : 所要读取的结果
** \retval TRUE 或 FALSE
**
******************************************************************************/
boolean_t Vc_GetItStatus(en_vc_ifr_t Result)
{
boolean_t bFlag;
bFlag = GetBit((uint32_t)(&(M0P_VC->IFR)), Result);
return bFlag;
}
/**
******************************************************************************
** \brief VC 清除中断标志位
**
** @param NewStatus : Vc0_Intf、Vc1_Intf、Vc2_Intf
** \retval 无
**
******************************************************************************/
void Vc_ClearItStatus(en_vc_ifr_t NewStatus)
{
SetBit((uint32_t)(&(M0P_VC->IFR)), NewStatus, 0);
}
/**
******************************************************************************
** \brief VC 配置DAC相关的内容 VC_CR中 VC_REF2P5_SEL VC_DIV_EN VC_DIV
**
** @param pstcDacCfg :
** \retval Ok 或 ErrorInvalidParameter
**
******************************************************************************/
en_result_t Vc_DacInit(stc_vc_dac_cfg_t *pstcDacCfg)
{
if (NULL == pstcDacCfg)
{
return ErrorInvalidParameter;
}
M0P_VC->CR_f.DIV_EN = pstcDacCfg->bDivEn;
M0P_VC->CR_f.REF2P5_SEL = pstcDacCfg->enDivVref;
if (pstcDacCfg->u8DivVal < 0x40)
{
M0P_VC->CR_f.DIV = pstcDacCfg->u8DivVal;
}
else
{
return ErrorInvalidParameter;
}
return Ok;
}
/**
******************************************************************************
** \brief VC通道初始化
**
** @param pstcDacCfg :
** \retval 无
**
******************************************************************************/
void Vc_Init(stc_vc_channel_cfg_t *pstcChannelCfg)
{
if (VcChannel0 == pstcChannelCfg->enVcChannel)
{
M0P_VC->CR_f.VC0_HYS_SEL = pstcChannelCfg->enVcCmpDly;
M0P_VC->CR_f.VC0_BIAS_SEL = pstcChannelCfg->enVcBiasCurrent;
M0P_VC->VC0_CR_f.DEBOUNCE_TIME = pstcChannelCfg->enVcFilterTime;
M0P_VC->VC0_CR_f.P_SEL = pstcChannelCfg->enVcInPin_P;
M0P_VC->VC0_CR_f.N_SEL = pstcChannelCfg->enVcInPin_N;
M0P_VC->VC0_CR_f.FLTEN = pstcChannelCfg->bFlten;
M0P_VC->VC0_OUT_CFG = 1<<pstcChannelCfg->enVcOutCfg;
}
else if (VcChannel1 == pstcChannelCfg->enVcChannel)
{
M0P_VC->CR_f.VC1_HYS_SEL = pstcChannelCfg->enVcCmpDly;
M0P_VC->CR_f.VC1_BIAS_SEL = pstcChannelCfg->enVcBiasCurrent;
M0P_VC->VC1_CR_f.DEBOUNCE_TIME = pstcChannelCfg->enVcFilterTime;
M0P_VC->VC1_CR_f.P_SEL = pstcChannelCfg->enVcInPin_P;
M0P_VC->VC1_CR_f.N_SEL = pstcChannelCfg->enVcInPin_N;
M0P_VC->VC1_CR_f.FLTEN = pstcChannelCfg->bFlten;
M0P_VC->VC1_OUT_CFG = 1<<pstcChannelCfg->enVcOutCfg;
}
else if(VcChannel2 == pstcChannelCfg->enVcChannel)
{
M0P_VC->CR_f.VC2_HYS_SEL = pstcChannelCfg->enVcCmpDly;
M0P_VC->CR_f.VC2_BIAS_SEL = pstcChannelCfg->enVcBiasCurrent;
M0P_VC->VC2_CR_f.DEBOUNCE_TIME = pstcChannelCfg->enVcFilterTime;
M0P_VC->VC2_CR_f.P_SEL = pstcChannelCfg->enVcInPin_P;
M0P_VC->VC2_CR_f.N_SEL = pstcChannelCfg->enVcInPin_N;
M0P_VC->VC2_CR_f.FLTEN = pstcChannelCfg->bFlten;
M0P_VC->VC2_OUT_CFG = 1<<pstcChannelCfg->enVcOutCfg;
}
else
{
;
}
}
/**
******************************************************************************
** \brief VC 通道使能
**
** \param enChannel : 通道号VcChannel0 VcChannel1 VcChannel2
** \param NewStatus : TRUE FALSE
** \retval NewStatus : TRUE FALSE
**
******************************************************************************/
void Vc_Cmd(en_vc_channel_t enChannel, boolean_t NewStatus)
{
switch(enChannel)
{
case VcChannel0:
SetBit((uint32_t)(&(M0P_VC->VC0_CR)), 16, NewStatus);
break;
case VcChannel1:
SetBit((uint32_t)(&(M0P_VC->VC1_CR)), 16, NewStatus);
break;
case VcChannel2:
SetBit((uint32_t)(&(M0P_VC->VC2_CR)), 16, NewStatus);
break;
default:
break;
}
}
//@} // VcGroup
/******************************************************************************
* EOF (not truncated)
******************************************************************************/
+203
View File
@@ -0,0 +1,203 @@
/*************************************************************************************
* Copyright (C) 2017, Huada Semiconductor Co.,Ltd All rights reserved.
*
* This software is owned and published by:
* Huada Semiconductor Co.,Ltd ("HDSC").
*
* BY DOWNLOADING, INSTALLING OR USING THIS SOFTWARE, YOU AGREE TO BE BOUND
* BY ALL THE TERMS AND CONDITIONS OF THIS AGREEMENT.
*
* This software contains source code for use with HDSC
* components. This software is licensed by HDSC to be adapted only
* for use in systems utilizing HDSC components. HDSC shall not be
* responsible for misuse or illegal use of this software for devices not
* supported herein. HDSC is providing this software "AS IS" and will
* not be responsible for issues arising from incorrect user implementation
* of the software.
*
* Disclaimer:
* HDSC MAKES NO WARRANTY, EXPRESS OR IMPLIED, ARISING BY LAW OR OTHERWISE,
* REGARDING THE SOFTWARE (INCLUDING ANY ACOOMPANYING WRITTEN MATERIALS),
* ITS PERFORMANCE OR SUITABILITY FOR YOUR INTENDED USE, INCLUDING,
* WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, THE IMPLIED
* WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE OR USE, AND THE IMPLIED
* WARRANTY OF NONINFRINGEMENT.
* HDSC SHALL HAVE NO LIABILITY (WHETHER IN CONTRACT, WARRANTY, TORT,
* NEGLIGENCE OR OTHERWISE) FOR ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT
* LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION,
* LOSS OF BUSINESS INFORMATION, OR OTHER PECUNIARY LOSS) ARISING FROM USE OR
* INABILITY TO USE THE SOFTWARE, INCLUDING, WITHOUT LIMITATION, ANY DIRECT,
* INDIRECT, INCIDENTAL, SPECIAL OR CONSEQUENTIAL DAMAGES OR LOSS OF DATA,
* SAVINGS OR PROFITS,
* EVEN IF Disclaimer HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
* YOU ASSUME ALL RESPONSIBILITIES FOR SELECTION OF THE SOFTWARE TO ACHIEVE YOUR
* INTENDED RESULTS, AND FOR THE INSTALLATION OF, USE OF, AND RESULTS OBTAINED
* FROM, THE SOFTWARE.
*
* This software may be replicated in part or whole for the licensed use,
* with the restriction that this Disclaimer and Copyright notice must be
* included with each copy of this software, whether used in part or whole,
* at all times.
*/
/******************************************************************************/
/** \file wdt.c
**
** WDT function driver API.
** @link WdtGroup Some description @endlink
**
** - 2017-05-17 1.0 CJ First version for Device Driver Library of Module.
**
******************************************************************************/
/******************************************************************************/
/* Include files */
/******************************************************************************/
#include "wdt.h"
/**
******************************************************************************
** \defgroup WdtGroup
**
******************************************************************************/
//@{
/******************************************************************************/
/* Local function prototypes ('static') */
/******************************************************************************/
/**
******************************************************************************
** \brief WDT溢出时间设置函数
**
** \param [in] u8LoadValue 溢出时间
**
** \retval 无
**
******************************************************************************/
void Wdt_WriteWdtLoad(uint8_t u8LoadValue)
{
M0P_WDT->CON_f.WOV = u8LoadValue;
}
/**
******************************************************************************
** \brief WDT初始化函数
**
** \param [in] enFunc @ref en_wdt_func_t
** \param [in] enTime @ref en_wdt_time_t
**
** \retval Ok
**
******************************************************************************/
en_result_t Wdt_Init(en_wdt_func_t enFunc, en_wdt_time_t enTime)
{
en_result_t enRet = Error;
Wdt_WriteWdtLoad(enTime);
M0P_WDT->CON_f.WINT_EN = enFunc;
enRet = Ok;
return enRet;
}
/**
******************************************************************************
** \brief WDT复位及启动函数
**
** \param [in] 无
**
** \retval 无
**
******************************************************************************/
void Wdt_Start(void)
{
M0P_WDT->RST = 0x1E;
M0P_WDT->RST = 0xE1;
}
/**
******************************************************************************
** \brief WDT喂狗
**
** \param [in] 无
**
** \retval Ok
**
******************************************************************************/
void Wdt_Feed(void)
{
M0P_WDT->RST = 0x1E;
M0P_WDT->RST = 0xE1;
}
/**
******************************************************************************
** \brief WDT中断标志清除
**
** \param [in] 无
**
** \retval Ok
**
******************************************************************************/
void Wdt_IrqClr(void)
{
M0P_WDT->RST = 0x1E;
M0P_WDT->RST = 0xE1;
}
/**
******************************************************************************
** \brief WDT读取当前计数值函数
**
** \param [in] 无
**
** \retval 计数值
**
******************************************************************************/
uint8_t Wdt_ReadWdtValue(void)
{
uint8_t u8Count;
u8Count = M0P_WDT->CON_f.WCNTL;
return u8Count;
}
/**
******************************************************************************
** \brief WDT读取当前运行状态
**
** \param [in] 无
**
** \retval 状态值
**
******************************************************************************/
boolean_t Wdt_ReadwdtStatus(void)
{
if(M0P_WDT->CON&0x10u)
{
return TRUE;
}
else
{
return FALSE;
}
}
/**
*******************************************************************************
** \brief WDT 中断状态标记获取
**
**
** \retval 中断状态
******************************************************************************/
boolean_t Wdt_GetIrqStatus(void)
{
if(M0P_WDT->CON&0x80u)
{
return TRUE;
}
else
{
return FALSE;
}
}
//@} // WdtGroup
+30
View File
@@ -0,0 +1,30 @@
del *.bak /s
del *.ddk /s
del *.edk /s
del *.lst /s
del *.lnp /s
del *.mpf /s
del *.mpj /s
del *.obj /s
del *.omf /s
::del *.opt /s ::不允许删除JLINK的设置
del *.plg /s
del *.rpt /s
del *.tmp /s
del *.__i /s
del *.crf /s
del *.o /s
del *.d /s
del *.axf /s
del *.tra /s
del *.dep /s
del JLinkLog.txt /s
del *.iex /s
del *.htm /s
del *.sct /s
del *.map /s
del *.dbgconf /s
del *.Administrator /s
exit
+37132
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<flash_device>
<exe>$PROJ_DIR$\config\flashloader\FlashHC32L17X.out</exe>
<page>1</page>
<block>256 0x200</block>
<flash_base>0x00000000</flash_base>
<macro>$PROJ_DIR$\config\flashloader\FlashHC32L17X.mac</macro>
<aggregate>0</aggregate>
</flash_device>
@@ -0,0 +1,23 @@
setup()
{
__message "----- setup hardware for Flashloader -----\n";
/*Wait*/
__delay(5);
__emulatorSpeed(0);
/*Vectors at RAM*/
__writeMemory32(0x20000000, 0xE000ED08, "Memory");
}
execUserPreload()
{
__message "----- execUserPreload -----\n";
setup();
}
execUserFlashInit() // Called by debugger before loading flash loader in RAM.
{
__message "----- execUserFlashInit -----\n";
setup();
}
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<flash_board>
<pass>
<loader>$PROJ_DIR$\config\flashloader\FlashHC32L17X.flash</loader>
<range>CODE 0x00000000 0x0001FFFF</range>
</pass>
</flash_board>
+29
View File
@@ -0,0 +1,29 @@
/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\cortex_v1_0.xml" */
/*-Specials-*/
define symbol __ICFEDIT_intvec_start__ = 0x20000000;
/*-Memory Regions-*/
define symbol __ICFEDIT_region_ROM_start__ = 0x20000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x20001FFF;
define symbol __ICFEDIT_region_RAM_start__ = 0x20002000;
define symbol __ICFEDIT_region_RAM_end__ = 0x20003FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_cstack__ = 0x200;
define symbol __ICFEDIT_size_heap__ = 0x200;
/**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G;
define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__ to __ICFEDIT_region_ROM_end__];
define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { };
define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite };
do not initialize { section .noinit };
place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec };
place in ROM_region { readonly };
place in RAM_region { readwrite, block CSTACK, block HEAP };

Some files were not shown because too many files have changed in this diff Show More