第三次上传

已实现功能:
1.波形输出
2.定时器
3.串口调试与通信

尚未完成:正确时间计算,平滑的梯形方波输出
This commit is contained in:
Shocky 2025-08-29 11:30:52 +08:00
parent 8a454bcd9e
commit 77e6088821
51 changed files with 5024 additions and 3681 deletions

6
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,6 @@
{
"files.associations": {
"ens1_gpio.h": "c",
"ens1_boost.h": "c"
}
}

File diff suppressed because one or more lines are too long

View File

@ -152,6 +152,22 @@
<Bp>
<Number>0</Number>
<Type>0</Type>
<LineNumber>36</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>0</Address>
<ByteObject>0</ByteObject>
<HtxType>0</HtxType>
<ManyObjects>0</ManyObjects>
<SizeOfObject>0</SizeOfObject>
<BreakByAccess>0</BreakByAccess>
<BreakIfRCount>0</BreakIfRCount>
<Filename>.\USER\mian.c</Filename>
<ExecCommand></ExecCommand>
<Expression></Expression>
</Bp>
<Bp>
<Number>1</Number>
<Type>0</Type>
<LineNumber>283</LineNumber>
<EnabledFlag>1</EnabledFlag>
<Address>268441304</Address>
@ -166,7 +182,7 @@
<Expression>\\ENS001_BASIC_PRJ\FWLIB/source/ENS1_UART.c\283</Expression>
</Bp>
<Bp>
<Number>1</Number>
<Number>2</Number>
<Type>0</Type>
<LineNumber>36</LineNumber>
<EnabledFlag>1</EnabledFlag>
@ -289,7 +305,7 @@
<GroupNumber>2</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\FWLIB\source\ENS1_UART.c</PathWithFileName>
@ -349,7 +365,7 @@
<GroupNumber>2</GroupNumber>
<FileNumber>7</FileNumber>
<FileType>1</FileType>
<tvExp>1</tvExp>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\FWLIB\source\ENS1_TIMER.c</PathWithFileName>

View File

@ -34,4 +34,4 @@ void boost_voltage_select_45V(void);
//32MHz频率下设置升压电压为55V
void boost_voltage_select_55V(void);
#endif
#endif

View File

@ -19,13 +19,14 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#ifndef ENS1_GPIO_H
#define ENS1_GPIO_H
#include "my_header.h"
#include "CMSDK_CM0.h"
extern uint8_t GPIO_AltFunction(GPIO_NUM GPIO_X , GPIO_AltFuncSel GPIO_AltFuncSelx);
extern int8_t GPIO_IO_Init(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,GPIOOType_TypeDef GPIO_OType,GPIO_PUPD_TypeDef GPIO_PUPD,OUTPUT_SPEED_TypeDef OUTPUT_SPEED,OUTPUT_PDRV_TypeDef OUTPUT_PDRV,FunctionalState ENABLEorNOT);
extern int8_t GPIO_IO_Select(GPIO_NUM GPIO_X, I_O_SELECT INorOUT ,FunctionalState ENABLEorNOT);
extern uint8_t GPIO_GetInputValue(GPIO_NUM GPIO_X);
extern uint8_t GPIO_GetOutputValue(GPIO_NUM GPIO_X);

View File

@ -14,7 +14,7 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#ifndef _ENS1_UART_H_
#define _ENS1_UART_H_
@ -37,7 +37,38 @@ Modification:
#define InterruptEnable __enable_irq
typedef enum uartRcvfifoTrigger{byte_1=0 , bytes_4=1,bytes_8=2,bytes_14=3}uartRcvTrigger;
typedef enum {OverSamp_16 = 0,OverSamp_13}UART_OverSamp;
/*uart参数设置结构体*/
typedef enum {
StopLen_1 = 0,
StopLen_Other
}UART_StopLen;
typedef enum {
WordLen_5,
WordLen_6,
WordLen_7,
WordLen_8
}UART_WordLen;
typedef enum {
Stick_RESET = 0,
Stick_SET
}UART_Stick_EN;
typedef enum {
Odd_SET = 0,
Even_SET
}UART_Even_EN;
typedef enum {
Parity_RESET = 0,
Parity_SET
}UART_Parity_EN;
/*uart<72><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýṹ<C3BD><E1B9B9>*/
typedef struct uart_fifo{
uartRcvTrigger level;
@ -48,8 +79,13 @@ typedef struct uart_fifo{
typedef struct uart_para{
uint8_t UART_OverSampMode;
uint32_t UART_BaudRate;
uint8_t UART_HardwareFlowControl; //硬件流控是否开启
uint8_t UART_HardwareFlowControl; //Ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>
UART_FifoStructrue* FifoSetting ;
UART_StopLen stop_len; //停止位长度
UART_WordLen Word_len; //数据位长度
UART_Stick_EN Stick_EN; //固定奇偶校验使能
UART_Even_EN Even_EN; //奇偶校验选择
UART_Parity_EN Parity_EN; //奇偶校验使能
}UART_InitStructure;
extern UART_FifoStructrue UART0_Fifo;
@ -58,19 +94,19 @@ extern UART_FifoStructrue UART1_Fifo;
extern UART_InitStructure UART1_Init;
/*
1THREINT THR发送寄存器或发送FIFO空
2RDAINT FIFO模式下触发接收阈值
3RTOINT FIFO模式下接收超时FIFO中
4RLSINT 线
5MSIINT CTS更改状态autoflowDSR/RI/DCD更改状态
<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Դ˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD>THREINT THR<EFBFBD><EFBFBD><EFBFBD>ͼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD>RDAINT <EFBFBD><EFBFBD><EFBFBD>ռĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>FIFOģʽ<EFBFBD>´<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
3<EFBFBD><EFBFBD>RTOINT FIFOģʽ<EFBFBD>½<EFBFBD><EFBFBD>ճ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><EFBFBD>ֽ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>Ƴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD><EFBFBD>FIFO<EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD>RLSINT <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֡<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
5<EFBFBD><EFBFBD>MSIINT <EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>CTS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>autoflow<EFBFBD><EFBFBD><EFBFBD><EFBFBD>DSR/RI/DCD<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
*/
/*中断使能*/
/*<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>*/
#define MSI_EN (uint8_t)0X8
#define RLSI_EN (uint8_t)0X4
#define THRE_EN (uint8_t)0X2
#define RDAI_EN (uint8_t)0X1
/*中断信息*/
/*<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Ϣ*/
#define INT_MODEM_STATUS (uint8_t)0X0
#define INT_THR_EMPTY (uint8_t)0X1
#define INT_RCV_DATA_AVAILABLE (uint8_t)0X2
@ -78,8 +114,8 @@ extern UART_InitStructure UART1_Init;
#define INT_CHAR_TIMEOUT_INDICATION (uint8_t)0X6
typedef struct uart_it_para{
uint8_t UartIntModel ; //选择中断的模式
uint8_t UartDMAEnable; //选择是否开启DMA
uint8_t UartIntModel ; //ѡ<EFBFBD><EFBFBD><EFBFBD>жϵ<EFBFBD>ģʽ
uint8_t UartDMAEnable; //ѡ<EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><EFBFBD><EFBFBD>DMA
}UART_ITStructure;
extern UART_ITStructure UART0_ITSet;
@ -91,34 +127,34 @@ extern UART_ITStructure UART1_ITSet;
#define UART_WordLength_8b ((uint8_t)0x03)
#define UART_NO_PARITY ((uint8_t)0x00 & 0xff)
#define UART_LOGIC_1_ODD_NUM ((uint8_t)0x08 & 0xff) //逻辑1奇数个
#define UART_LOGIC_1_EVEN_NUM ((uint8_t)0x18 & 0xff) //逻辑1偶数个
#define UART_STICK_PARITY_AS1 ((uint8_t)0x28 & 0xff) //固定奇偶校验为1
#define UART_LOGIC_1_ODD_NUM ((uint8_t)0x08 & 0xff) //<EFBFBD>߼<EFBFBD>1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define UART_LOGIC_1_EVEN_NUM ((uint8_t)0x18 & 0xff) //<EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define UART_STICK_PARITY_AS1 ((uint8_t)0x28 & 0xff) //<EFBFBD>̶<EFBFBD><EFBFBD><EFBFBD>żУ<EFBFBD><EFBFBD>Ϊ1
#define UART_STICK_PARITY_AS0 ((uint8_t)0x38 & 0xff)
/*中断信息读取*/
/*中断挂起*/
uint8_t UART_INT_PEND(CMSDK_UART_TypeDef* UARTx); //为0时有UART的中断挂起
/*中断状态判断*/
/*<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD>ȡ*/
/*<EFBFBD>жϹ<EFBFBD><EFBFBD><EFBFBD>*/
uint8_t UART_INT_PEND(CMSDK_UART_TypeDef* UARTx); //Ϊ0ʱ<EFBFBD><EFBFBD>UART<EFBFBD><EFBFBD><EFBFBD>жϹ<EFBFBD><EFBFBD><EFBFBD>
/*<EFBFBD>ж<EFBFBD>״̬<EFBFBD>ж<EFBFBD>*/
uint8_t UART_INT_TYPE(CMSDK_UART_TypeDef* UARTx);
/*fifo 使用指示器*/
uint8_t UART_FIFO_USE(CMSDK_UART_TypeDef* UARTx); //0:非fifo模式 1fifo 使能
/*清除传输FIFO*/
/*fifo ʹ<EFBFBD><EFBFBD>ָʾ<EFBFBD><EFBFBD>*/
uint8_t UART_FIFO_USE(CMSDK_UART_TypeDef* UARTx); //0:<EFBFBD><EFBFBD>fifoģʽ 1<><31>fifo ʹ<><CAB9>
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO*/
void UART_TXCLR(CMSDK_UART_TypeDef* UARTx);
/*清除接收FIFO*/
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>FIFO*/
void UART_RXCLR(CMSDK_UART_TypeDef* UARTx);
/*FIFO使能*/
/*FIFOʹ<EFBFBD><EFBFBD>*/
void UART_FIFOEnable(CMSDK_UART_TypeDef* UARTx);
/*FIFO关闭*/
/*FIFO<EFBFBD>ر<EFBFBD>*/
void UART_FIFODisable(CMSDK_UART_TypeDef* UARTx);
/*接收数据*/
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
uint8_t READ_UART_RCVBuff(CMSDK_UART_TypeDef* UARTx );
/*发送数据*/
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void WRITE_UART_THRBuff(CMSDK_UART_TypeDef* UARTx ,uint8_t data);
/*FIFO状态获取*/
/*FIFO״̬<EFBFBD><EFBFBD>ȡ*/
uint8_t UART_RX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ;
uint8_t UART_TX_FIFO_LEN(CMSDK_UART_TypeDef* UARTx) ;
uint8_t UART_RX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ;
@ -126,19 +162,20 @@ uint8_t UART_RX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ;
uint8_t UART_TX_FIFO_FULL(CMSDK_UART_TypeDef* UARTx) ;
uint8_t UART_TX_FIFO_EMPTY(CMSDK_UART_TypeDef* UARTx) ;
/*收发线状态获取*/
/*<EFBFBD>շ<EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD>ȡ*/
uint8_t UARTLine_RCVError(CMSDK_UART_TypeDef* UARTx);
/*判断发送缓存是否为空*/
/*<EFBFBD>жϷ<EFBFBD><EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD>*/
uint8_t UARTLine_TRANSEmpty(CMSDK_UART_TypeDef* UARTx);
/*判断THR是否为空*/
/*<EFBFBD>ж<EFBFBD>THR<EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><EFBFBD>*/
uint8_t UARTLine_THREmpty(CMSDK_UART_TypeDef* UARTx);
/*UART初始化*/
/*UART<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>*/
void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX);
void UART_ITConfig(CMSDK_UART_TypeDef *CMSDK_UART, UART_ITStructure* uart_paraX);
unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch);
void Uart_Send(CMSDK_UART_TypeDef *CMSDK_UART ,uint8_t *data, uint8_t len);

View File

@ -42,6 +42,12 @@ typedef struct {
uint16_t intensity; // 强度 (0-255)
uint16_t rest_time; // 休息时间 (ms)
uint16_t silent_time; // 静默时间 (ms)
// 缓进缓出控制参数
uint8_t ramp_up_time; // 缓进时间2秒
uint8_t hold_time; // 保持时间6秒
uint8_t ramp_down_time; // 缓出时间2秒
uint8_t enable_ramp; // 启用渐进控制
} EMS_Config_TypeDef;
// 电刺激控制函数
@ -50,5 +56,6 @@ void EMS_Start(void);
void EMS_Stop(void);
void EMS_UpdateIntensity(uint16_t intensity);
void EMS_Process(void);
void EMS_Process_Ramp(void); // 缓进缓出处理函数
#endif

View File

@ -11,7 +11,7 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#include "ENS1_IIC.h"
@ -33,37 +33,37 @@ IIC_ConfigStructure IIC1_Config =
};
//bus error 判断ITERREN使能
//bus error <EFBFBD>жϣ<EFBFBD>ITERRENʹ<EFBFBD>ܣ<EFBFBD>
bool IIC_BUS_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 8)&0x1) ? true :false);}
//应答错误判断
//Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
bool IIC_ACK_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 10)&0x1) ? true :false);}
//仲裁
//<EFBFBD>ٲ<EFBFBD>
bool IIC_ARBITRAT_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 9)&0x1) ? true :false);}
//溢出/下溢错误
//<EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IIC_OVERRUN_ERROR(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 11)&0x1) ? true :false);}
//ITEVFEN使能后有如下事件
//起始状态,起始位发送(主机模式)
//ITEVFENʹ<EFBFBD>ܺ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
//<EFBFBD><EFBFBD>ʼ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD>
bool IIC_SB_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS)&0x1) ? true :false);}
//地址发送(主机模式) / 地址匹配(从机事件)
//<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD> / <20><>ַƥ<D6B7><EFBFBD>ӻ<EFBFBD><D3BB>¼<EFBFBD><C2BC><EFBFBD>
bool IIC_ADDR_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 1)&0x1) ? true :false);}
//主机模式下主机已发送10bit地址数据的第一个字节
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD>£<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѷ<EFBFBD><EFBFBD><EFBFBD>10bit<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD>ݵĵ<EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ֽڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IIC_ADD10_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 3)&0x1) ? true :false);}
//从机模式下,停止条件被接收到
//<EFBFBD>ӻ<EFBFBD>ģʽ<EFBFBD>£<EFBFBD>ֹͣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>
bool IIC_STOPF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 4)&0x1) ? true :false);}
//数据字节传输成功
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>
bool IIC_BTF_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 2)&0x1) ? true :false);}
//ITEVFEN 且 ITBUFEN 使能后,有如下事件
//数据寄存器非空(接受器读到数据)
//ITEVFEN <EFBFBD><EFBFBD> ITBUFEN ʹ<>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD>ݼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿգ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
bool IIC_RxNE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 5)&0x1) ? true :false);}
//数据寄存器空(传输完数据)
//<EFBFBD><EFBFBD><EFBFBD>ݼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
bool IIC_TxE_EVENT(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 6)&0x1) ? true :false);}
//总线状态:繁忙与否
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>æ<EFBFBD><EFBFBD><EFBFBD>
uint8_t IIC_Bus_BUSY(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (uint8_t)(((CMSDK_I2Cx->I2C_STS >> 13)&0x1) ? 1 :0);};
//模式确认
//ģʽȷ<EFBFBD><EFBFBD>
bool IIC_MASTER_MODE(CMSDK_I2C_TypeDef* CMSDK_I2Cx){return (bool)(((CMSDK_I2Cx->I2C_STS >> 12)&0x1) ? true :false);}
uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* IIC_Para )
@ -80,7 +80,7 @@ uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* II
}
if(IIC_Para->MODE == IIC_SLAVE)
{
// CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//中断使能--bit8buffer中断 / bit7事件中断 / bit6错误中断
// CMSDK_I2Cx->I2C_CR2|=(1<<7);//|(1<<8);//<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
CMSDK_I2Cx->I2C_CR1|=(1);
CMSDK_I2Cx->I2C_OAR = IIC_Para->OWN_ADDRESS ;
if(IIC_Para->ACK_EN == true)
@ -90,9 +90,9 @@ uint8_t IIC_Config_init(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,IIC_ConfigStructure* II
{
/*
IIC master transmitter:
IIC_CR2:
IIC_CR1:使IIC接口
IIC_CR1:START IIC主机
IIC_CR2:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>
IIC_CR1:ʹ<EFBFBD><EFBFBD>IIC<EFBFBD>ӿ<EFBFBD>
IIC_CR1:<EFBFBD><EFBFBD><EFBFBD><EFBFBD>START λ IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
CMSDK_I2Cx->I2C_CR2 |= IIC_Para->IIC_SPEED ;
CMSDK_I2Cx->I2C_CR1 |= (1) ;
@ -125,7 +125,7 @@ void IIC_ITConfig(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint16_t IIC_IT_SEL ,Functional
}
}
void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //使能IIC外设
void IIC_Cmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,FunctionalState NewState) //ʹ<EFBFBD><EFBFBD>IIC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if(CMSDK_I2Cx ==CMSDK_I2C0)
{
@ -157,8 +157,8 @@ void IIC_GenerateSTOP(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
CMSDK_I2Cx->I2C_CR1 |= (1<<4);
}
//general call 用于向总线所有设备发送消息,用于初始化从设备与设备同步
//主设备通过向总线发送0x00地址来触发GENERAL CALL
//general call <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>豸ͬ<EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD>豸ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><EFBFBD><EFBFBD>0x00<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>GENERAL CALL
void IIC_GeneralCallCmd(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
{
@ -172,7 +172,7 @@ void IIC_Send7bitAddress(CMSDK_I2C_TypeDef* CMSDK_I2Cx ,uint8_t Address)
void IIC_SendData(CMSDK_I2C_TypeDef* CMSDK_I2Cx , uint8_t data)
{
CMSDK_I2Cx->I2C_DR = data;
while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //字节传输完成
while(IIC_BTF_EVENT(CMSDK_I2Cx) == false); //<EFBFBD>ֽڴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
uint8_t IIC_ReadData(CMSDK_I2C_TypeDef* CMSDK_I2Cx)
@ -211,9 +211,9 @@ void I2C0_Event_Handler(void)
}
if(IIC_STOPF_EVENT(CMSDK_I2C0) == true)
{
//如果不再接收,则关闭IIC!!!
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><EFBFBD>գ<EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>IIC!!!
IIC_Cmd(CMSDK_I2C0 ,DISABLE) ;
CMSDK_I2C0->I2C_CR2|=(1<<7); //中断使能--bit8buffer中断 / bit7事件中断 / bit6错误中断
CMSDK_I2C0->I2C_CR2|=(1<<7); //<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
CMSDK_I2C0->I2C_CR1|=(1);
CMSDK_I2C0->I2C_OAR = 0X78 ;
CMSDK_I2C0->I2C_CR1 |= (1<<5);
@ -230,7 +230,6 @@ void I2C0_Event_Handler(void)
if(IIC_RxNE_EVENT(CMSDK_I2C0) == true)
{
uint8_t read_data = (uint8_t)(CMSDK_I2C0->I2C_DR & 0xff);
printf("%d\n", read_data);
}
if(IIC_TxE_EVENT(CMSDK_I2C0) == true)
@ -246,25 +245,21 @@ void I2C0_Error_Handler(void)
if(IIC_BUS_ERROR(CMSDK_I2C0) == true)
{
printf("bus error\n");
return ;
}
if(IIC_ACK_ERROR(CMSDK_I2C0) == true)
{
printf("IIC_ACK_ERROR\n");
return ;
}
if(IIC_ARBITRAT_ERROR(CMSDK_I2C0) == true)
{
printf("IIC_ARBITRAT_ERROR\n");
return ;
}
if(IIC_OVERRUN_ERROR(CMSDK_I2C0) == true)
{
printf("IIC_OVERRUN_ERROR\n");
return ;
}
@ -293,17 +288,16 @@ void I2C1_Event_Handler(void)
}
else
{
if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //作为从机,进入此处则地址匹配!
if(IIC_ADDR_EVENT(CMSDK_I2C1) == true) //<EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַƥ<EFBFBD>
{
return ;
}
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //作为从机接收到STOP信号
if(IIC_STOPF_EVENT(CMSDK_I2C1) == true) //<EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>STOP<EFBFBD>ź<EFBFBD>
{
printf("get stop\n");
//如果不再接收则关闭IIC!!!
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٽ<EFBFBD><D9BD>գ<EFBFBD><D5A3><EFBFBD>ر<EFBFBD>IIC!!!
IIC_Cmd(CMSDK_I2C1 ,DISABLE) ;
CMSDK_I2C1->I2C_CR2|=(1<<7); //中断使能--bit8buffer中断 / bit7事件中断 / bit6错误中断
CMSDK_I2C1->I2C_CR2|=(1<<7); //<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>--bit8<74><38>buffer<65>ж<EFBFBD> / bit7<74><37><EFBFBD>¼<EFBFBD><C2BC>ж<EFBFBD> / bit6<74><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
CMSDK_I2C1->I2C_CR1|=(1);
CMSDK_I2C1->I2C_OAR = 0X78 ;
CMSDK_I2C1->I2C_CR1 |= (1<<5);
@ -317,10 +311,9 @@ void I2C1_Event_Handler(void)
{
}
if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //作为从机buffer非空读IIC_DR中的数据
if((IIC_RxNE_EVENT(CMSDK_I2C1) == true)) //<EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><EFBFBD><EFBFBD>buffer<EFBFBD>ǿգ<EFBFBD><EFBFBD><EFBFBD>IIC_DR<EFBFBD>е<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
uint8_t read_data = (uint8_t)(CMSDK_I2C1->I2C_DR & 0xff);
printf("%d\n", read_data);
}
if(IIC_TxE_EVENT(CMSDK_I2C1) == true)
{
@ -335,25 +328,21 @@ void I2C1_Error_Handler(void)
if(IIC_BUS_ERROR(CMSDK_I2C1) == true)
{
printf("bus error\n");
return ;
}
if(IIC_ACK_ERROR(CMSDK_I2C1) == true)
{
printf("IIC_ACK_ERROR\n");
return ;
}
if(IIC_ARBITRAT_ERROR(CMSDK_I2C1) == true)
{
printf("IIC_ARBITRAT_ERROR\n");
return ;
}
if(IIC_OVERRUN_ERROR(CMSDK_I2C1) == true)
{
printf("IIC_OVERRUN_ERROR\n");
return ;
}

View File

@ -11,14 +11,14 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
/*
MTP说明
1MTP部分只能按块写入,1024
MTP˵<EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD>MTP<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD>ܰ<EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>,ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>1024<EFBFBD>ֽڴ<EFBFBD>С
<EFBFBD><EFBFBD>ı<EFBFBD>ţ<EFBFBD>
SECTOR 0 : 0000H - 03FFH
SECTOR 1 : 0400H - 07FFH
SECTOR 2 : 0800H - 0BFFH
@ -34,8 +34,8 @@ SECTOR 7 : 1C00H - 1FFFH
uint16_t write_current_data[4]={0,0,0,0};
STRUCT_MTP_TRIM MTP_FT_SET=
{
.OSCA_FT = 0x10, //默认值为 0X10
.OSC32K_RTRIM = 0x10, //默认值为 0X10
.OSCA_FT = 0x10, //Ĭ<EFBFBD><EFBFBD>ֵΪ 0X10
.OSC32K_RTRIM = 0x10, //Ĭ<EFBFBD><EFBFBD>ֵΪ 0X10
.BG_TRIM = 0x88,
};
@ -52,30 +52,29 @@ uint8_t MTP_init(void)
//MTP内保存的电流检测数据读取
//MTP<EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ
void flash_read(uint32_t start_addr,uint16_t *test_i){
uint16_t result = 0;
result = HW16_REG(start_addr);
*test_i = result ;
}
//向MTP中写入数据仅限于向用户自定义块写入
//可自定义读写的区域为MTP的第0x1BC0块MTP_BASE_ADDR + 0x6F00
//<EFBFBD><EFBFBD>MTP<EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪMTP<EFBFBD>ĵ<EFBFBD>0x1BC0<EFBFBD>飨MTP_BASE_ADDR + 0x6F00<30><30>
int8_t flash_buff_write(uint32_t start_addr, uint16_t *buff) {
HW32_REG(start_addr) = ((uint32_t)((*(buff+1)<<16)&0xffff0000) + ((*buff)&0x0000ffff));
// while(!(CMSDK_MTPREG->MTP_SR&0x00000002)){};
if(HW32_REG(start_addr) != ((uint32_t)(*(buff+1)<<16) + *buff ))
{
printf("write error\n");
return -1;
}
return 0;
}
int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){
CMSDK_MTPREG->MTP_CLR = 0xffffffff; //SR寄存器
CMSDK_MTPREG->MTP_CR = 0x00000002; //2等待周期
CMSDK_MTPREG->MTP_ACLR = 0x00000000; //允许软件读写从sector0 -sector 6 sector7 作为bootloader区
CMSDK_MTPREG->MTP_CLR = 0xffffffff; //SR<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>
CMSDK_MTPREG->MTP_CR = 0x00000002; //2<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMSDK_MTPREG->MTP_ACLR = 0x00000000; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>sector0 -sector 6 <20><>sector7 <20><>Ϊbootloader<65><72><EFBFBD><EFBFBD>
CMSDK_MTPREG->MTP_KEYR = 0x5a5a5a5a; //key
return flash_buff_write(start_addr, buff);
}
@ -83,8 +82,8 @@ int8_t flash_write_ctrl(uint16_t *buff , uint32_t start_addr){
int8_t write_data(void){
uint16_t *wr_data = (uint16_t *)malloc(8*sizeof(uint8_t));
memcpy(wr_data , write_current_data, 8);
int8_t val = flash_write_ctrl(wr_data,DATA_SAVE_ADDR); //第 0x1BC0块
int8_t val = flash_write_ctrl(wr_data,DATA_SAVE_ADDR); //<EFBFBD><EFBFBD> 0x1BC0<43><30>
val = flash_write_ctrl(wr_data+2, DATA_SAVE_ADDR + 4);
return val;
}
}

View File

@ -11,13 +11,13 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: 2023-11-15
*/
#include "ENS1_SPI.h"
#include "ENS1_GPIO.h"
/*---------------------------------------------------fifo相关的函数头--------------------------------------------------*/
/*清除FIFO和计数清0*/
/*---------------------------------------------------fifo????????--------------------------------------------------*/
/* Clear FIFO and reset to 0 */
uint8_t CLR_TX_FIFO( CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)(SPIx->FCR>>8 & 0x1);
@ -27,47 +27,47 @@ uint8_t CLR_RX_FIFO(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)(SPIx->FCR>>1 & 0x1);
}
/*FIFO 状态读取*/
/*FIFO ?????*/
uint8_t RX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x001f0000)>>16)):0); //读取当前接收FIFO数据长度
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x001f0000)>>16)):0); //??????????FIFO???????
}
uint8_t TX_FIFO_LEN(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x00001f00)>>8)):0); //读取当前发送FIFO数据长度
return (uint8_t)(((SPIx->FCR & 0x1) == 0x1) ? ((uint8_t)((SPIx->FSR & 0x00001f00)>>8)):0); //??????????FIFO???????
}
SPI_BUSY_STATE BUSY_STATE(CMSDK_SPI_TypeDef* SPIx)
{
return (SPI_BUSY_STATE)((((SPIx->FSR & 0x10) >> 4)==1) ? ( BUSY ) : ( NOTBUSY )); //读取当前SPI是否繁忙
return (SPI_BUSY_STATE)((((SPIx->FSR & 0x10) >> 4)==1) ? ( BUSY ) : ( NOTBUSY )); //??????SPI????
}
uint8_t RX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)((((SPIx->FSR & 0x8)>> 3 )==1) ? (1) : (0)) ; //当前读取FIFO是否为满
return (uint8_t)((((SPIx->FSR & 0x8)>> 3 )==1) ? (1) : (0)) ; //??????FIFO????????
}
uint8_t RX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)((((SPIx->FSR & 0x4) >> 2)==1) ? (1) : (0) ) ; //当前读取FIFO是否为空
return (uint8_t)((((SPIx->FSR & 0x4) >> 2)==1) ? (1) : (0) ) ; //??????FIFO???????
}
uint8_t TX_FIFO_FULL(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)((((SPIx->FSR & 0x2) >> 1)==1) ? (1) : (0)) ; //当前发送FIFO是否为满
return (uint8_t)((((SPIx->FSR & 0x2) >> 1)==1) ? (1) : (0)) ; //???????FIFO????????
}
uint8_t TX_FIFO_EMPTY(CMSDK_SPI_TypeDef* SPIx)
{
return (uint8_t)(((SPIx->FSR & 0x1)==1) ? (1) : (0)) ; //当前发送FIFO是否为空
return (uint8_t)(((SPIx->FSR & 0x1)==1) ? (1) : (0)) ; //???????FIFO???????
}
/*FIFO使能/DMA使能*/
uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx) //读FIFO设置
/*FIFO???/DMA???*/
uint8_t SPI_FIFO_STATE(CMSDK_SPI_TypeDef* SPIx) //??FIFO????
{
return (uint8_t)(SPIx->FCR & 0x1) ;
}
@ -97,16 +97,16 @@ uint8_t SPI_FIFODMA_SET(CMSDK_SPI_TypeDef* SPIx ,bool TXDMA_SET ,bool RXDMA_SET)
return (uint8_t)((SPIx->CTRL2>>4)&0x3);
}
/*------------------------------------------------------fifo相关的函数尾--------------------------------------------------*/
/*------------------------------------------------------fifo???????<3F><>--------------------------------------------------*/
/*----------------------------------------------------------SPI配置-------------------------------------------------------*/
//读取当前的SPI模式
/*----------------------------------------------------------SPI????-------------------------------------------------------*/
//????????SPI??
uint8_t READ_SPI_MODE(CMSDK_SPI_TypeDef* SPIx)
{
return ((SPIx->CTRL1 & 0x7000) >> 12);
}
//NSS通道选择
//NSS??????
uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,FunctionalState ENorDIS)
{
if(ENorDIS == ENABLE)
@ -117,12 +117,12 @@ uint8_t SPI_NSS_CHANNEL(CMSDK_SPI_TypeDef* SPIx ,NSS_CHANNEL_SEL NSSx ,Functiona
return (uint8_t)((SPIx->CTRL2 & 0x0f00) >> 8);
}
//spi的参数配置
//spi?????????
uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
struct SPI_ModeConfig_Struct SPI_Config,
struct SPI_FIFO_Struct FIFO_Struct)
{
/*1GPIO ALTER*/
/*1??GPIO ALTER*/
if(SPIx == CMSDK_SPI1)
{
@ -144,21 +144,21 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
}
/*
2SPI_CTRL1寄存器
1BAUD_RATE[2:0]
2 CPOL and CPHA bits
3 BIDI_EN, BIDI_MODE, UNIDI_MODE bits
4LSB_SEL位来定义帧格式
5NSS_TOGGLENSS_MST_CTRLNSS_MST_SW bits来选择NSS控制方式 bit11 9 8
6MST_SLV_SEL位选择主模式或从模式
2??<EFBFBD><EFBFBD>SPI_CTRL1?????
??1??????????????BAUD_RATE[2:0]
??2???????????????<EFBFBD><EFBFBD> CPOL and CPHA bits
??3????????? BIDI_EN, BIDI_MODE, UNIDI_MODE bits
??4??????LSB_SEL<EFBFBD><EFBFBD>??????????
??5?????????NSS_TOGGLE??NSS_MST_CTRL??NSS_MST_SW bits?????NSS?????? bit11 9 8
??6?????????MST_SLV_SEL<EFBFBD><EFBFBD>????????????
*/
SPIx->CTRL1 = (SPIx->CTRL1&~ 0xffff) | ( SPI_Config.BAUD_FPCLKdivx << 4);
SPIx->CTRL1 |= (SPI_Config.SPI_MODE << 2);
SPIx->CTRL1 |= (SPI_Config.SPI_TRANS_MODE << 12 );
SPIx->CTRL1 &=~ (0x1 << 7); //帧格式默认大端模式
SPIx->CTRL1 &=~ (0x1 << 8); //帧格式默认大端模式
SPIx->CTRL1 &=~ (0x1 << 7); //???????????
SPIx->CTRL1 &=~ (0x1 << 8); //???????????
SPIx->CTRL1 &=~ (1 << 11);
SPIx->CTRL1 |= (1 << 11) ; // 默认硬件生成NSS
SPIx->CTRL1 |= (1 << 11) ; // ??????????NSS
if(SPI_Config.MS_SEL == MASTER)
{
@ -169,12 +169,12 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
SPIx->CTRL1 &=~ (1<<1);
}
/*
3SPI_CTRL2寄存器
1CHAR_LEN[3:0]
2NSS端口 NSS0_EN, NSS1_EN, NSS2_EN
3RX数据采集阶段 SAMP_PHASE(1:0)
4C2T_DELAY和T2C_DELAY位C2T/T2C延迟
5TXDMA_EN和RXDMA_EN位使能或使能FIFO模式的TX/RX DMA
3??<EFBFBD><EFBFBD>SPI_CTRL2?????
??1??????CHAR_LEN[3:0]<EFBFBD><EFBFBD>???????????????
??2?????NSS???? NSS0_EN, NSS1_EN, NSS2_EN
??3????????????????????RX????????? SAMP_PHASE(1:0)<EFBFBD><EFBFBD>
??4?????????C2T_DELAY??T2C_DELAY<EFBFBD><EFBFBD>???????????<EFBFBD><EFBFBD>?????????????C2T/T2C???
??5?????????TXDMA_EN??RXDMA_EN<EFBFBD><EFBFBD>???????FIFO????TX/RX DMA??
*/
SPIx->CTRL2 = (SPIx->CTRL2&~ 0xffff);
if(SPI_Config.CHAR_LEN < 4)
@ -190,22 +190,22 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
}
SPI_NSS_CHANNEL(SPIx ,SPI_Config.NSSx ,ENABLE);
//rx读采集相位, 仅仅在主模式下有效,默认选normal
//C2T_DELAY ,仅在主模式下有效
//T2C_DELAY, 仅在主模式下有效
//rx???????<3F><>?? ??????????????<3F><>??????normal
//C2T_DELAY ,????????????<3F><>
//T2C_DELAY, ????????????<3F><>
if(SPI_Config.MS_SEL == MASTER)
{
SPIx->CTRL2 |= (SPI_Config.SAMP_PHASE << 6);
//T2C 是Transmit-end-to-chip-inactive 的延迟时间,默认为1T SCK
//C2T 是Chip-select-active-to-transmit-start 的时间 默认1T SCK ,这里对这两参数没做设置
//T2C ??Transmit-end-to-chip-inactive ????????????1T SCK
//C2T ??Chip-select-active-to-transmit-start ????? ???1T SCK ,????????????????????
}
/*
4FIFO
1TX_FIFO_TH或RX_FIFO_TH来定义触发级别阈值
2TX_FIFO_CLR和RX_FIFO_CLR位清除TX/RX FIFO
3fif_en位使能或禁用FIFO模式
4??<EFBFBD><EFBFBD>FIFO ?????
??1??????TX_FIFO_TH??RX_FIFO_TH?????<EFBFBD><EFBFBD>?????????
??2?????????TX_FIFO_CLR??RX_FIFO_CLR<EFBFBD><EFBFBD>???TX/RX FIFO
??3?????????fif_en<EFBFBD><EFBFBD>???????FIFO??
*/
SPIx->FCR |= (FIFO_Struct.TX_FIFO_TH << 9 );
SPIx->FCR |= (FIFO_Struct.RX_FIFO_TH << 2 );
@ -217,7 +217,7 @@ uint8_t SPI_Config_init(CMSDK_SPI_TypeDef* SPIx ,
return 0;
}
/*---------------------------------------------SPI启动和停止-------------------------------------------------*/
/*---------------------------------------------SPI????????-------------------------------------------------*/
uint8_t SPI_START(CMSDK_SPI_TypeDef* SPIx )
{
SPIx->CTRL1 |= (1);
@ -230,7 +230,7 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx)
{
if(SPI_FIFO_STATE(SPIx) == 1)
{
//读 RX的FIFO 直到 FIFO长度为 0
//?? RX??FIFO ??? FIFO????? 0
while((RX_FIFO_LEN(SPIx) != 0) || (BUSY_STATE(SPIx) == BUSY))
{
//save_data = READ_SPI_RCVBuff(SPIx);
@ -249,7 +249,7 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx)
{
while((TX_FIFO_LEN(SPIx)!= 0) || (BUSY_STATE(SPIx) == BUSY));
SPIx->CTRL1 &=~ (1);
//读 RX的FIFO 直到 FIFO长度为 0
//?? RX??FIFO ??? FIFO????? 0
while(RX_FIFO_LEN(SPIx) != 0)
{
uint16_t save_data = READ_SPI_RCVBuff(SPIx);
@ -264,21 +264,21 @@ uint8_t SPI_STOP(CMSDK_SPI_TypeDef* SPIx)
return (uint8_t)(SPIx->CTRL1*0x1);
}
/*-----------------------------------------读 / 写 SPI BUFFER的数据-------------------------------------------------*/
//读被接收的数据 最多16bits
/*-----------------------------------------?? / <20><> SPI BUFFER??????-------------------------------------------------*/
//????????????? ???16bits
uint16_t READ_SPI_RCVBuff(CMSDK_SPI_TypeDef* SPIx)
{
return (uint16_t)(SPIx->RBR & 0xffff);
}
//写数据
//<EFBFBD><EFBFBD>????
void WRITE_SPI_THRBuff(CMSDK_SPI_TypeDef* SPIx,uint8_t data)
{
SPIx->THR = data;
while(BUSY_STATE(SPIx) == BUSY);
}
/*------------------------------------------------------SPI中断------------------------------------------------------*/
/*------------------------------------------------------SPI?<3F><>?------------------------------------------------------*/
uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET)
{
NVIC_DisableIRQ(IRQn);
@ -303,22 +303,22 @@ uint8_t SPI_INT_SET(IRQn_Type IRQn, bool SPI_INT_ENABLE, uint8_t SPI_INT_BIT_SET
return 0;
}
//中断处理函数
//?<3F><>????????
/*
1
2
3
4
5
?<EFBFBD><EFBFBD>????????????
1??????????? ???? ?<EFBFBD><EFBFBD>?????????????????
2??????????? ??? ?<EFBFBD><EFBFBD>??????????
3?????????<EFBFBD><EFBFBD>??
4????????????? ?<EFBFBD><EFBFBD>?
5?????????????? ?<EFBFBD><EFBFBD>?
*/
void SPI1_Handler(void)
{
NVIC_ClearPendingIRQ(SPI1_IRQn);
uint8_t read_fifo=0;
if((CMSDK_SPI1->INTSTATUS & 0x10 )== UNDERRUN_INT) //下溢-发送时发送数据已为空时触发
if((CMSDK_SPI1->INTSTATUS & 0x10 )== UNDERRUN_INT) //????-???????????????????????
{
CMSDK_SPI1->INTCLEAR |= (1<<4); //清除中断
CMSDK_SPI1->INTCLEAR |= (1<<4); //????<3F><>?
}
if((CMSDK_SPI1->INTSTATUS & 0x8) ==OVERRUN_INT)
{
@ -338,7 +338,6 @@ void SPI1_Handler(void)
while(!RX_FIFO_EMPTY(CMSDK_SPI1))
{
read_fifo = READ_SPI_RCVBuff(CMSDK_SPI1);
printf("masterrcv:%d\n",read_fifo);
}
}
@ -349,9 +348,9 @@ void SPI0_Handler(void)
{
NVIC_ClearPendingIRQ(SPI0_IRQn);
uint8_t read_fifo=0;
if((CMSDK_SPI0->INTSTATUS & 0x10 )== UNDERRUN_INT) //下溢-发送时发送数据已为空时触发
if((CMSDK_SPI0->INTSTATUS & 0x10 )== UNDERRUN_INT) //????-???????????????????????
{
CMSDK_SPI0->INTCLEAR |= (1<<4); //清除中断
CMSDK_SPI0->INTCLEAR |= (1<<4); //????<3F><>?
}
if((CMSDK_SPI0->INTSTATUS & 0x8) ==OVERRUN_INT)
{
@ -371,7 +370,6 @@ void SPI0_Handler(void)
while(!RX_FIFO_EMPTY(CMSDK_SPI0))
{
read_fifo = READ_SPI_RCVBuff(CMSDK_SPI0);
printf("masterrcv:%d\n",read_fifo);
}
}
}

View File

@ -1,6 +1,7 @@
#include "ENS1_TIMER.h"
#include "ENS_CURRENT_CALIBRATION.h"
#include "ENS1_CLOCK.h"
#include <string.h>
void TIMER0_Init(uint32_t Int_Period) //定时器中断周期 单位ms
{
@ -9,12 +10,9 @@ void TIMER0_Init(uint32_t Int_Period) //定时器中断周期 单位ms
NVIC_ClearPendingIRQ(TIMER0_IRQn);
uint32_t reload_value = (uint32_t)(APB_Clock_Freq / 1000 * Int_Period);
printf("TIMER0重装载值: %d\n", reload_value);
CMSDK_timer_Init(CMSDK_TIMER0, reload_value, 1); //
NVIC_EnableIRQ(TIMER0_IRQn);
printf("TIMER0_Init完成中断周期: %d ms\n", Int_Period);
}
void TIMER1_Init(uint32_t Int_Period)

View File

@ -35,13 +35,18 @@ ENS1 uart特性说明
#include "ENS1_GPIO.h"
UART_FifoStructrue UART1_Fifo = {
.level = bytes_8 ,
.DMA_Enable = 0 ,
.FIFO_Enable = 1 ,
.DMA_Enable =0 ,
.FIFO_Enable =1 ,
};
UART_InitStructure UART1_Init = {
.UART_BaudRate = 115200 , //计算出来的DLL DLH不为整数 1、需要校准RC精确度2、需要调整此处的波特率
.UART_HardwareFlowControl = 0,
.UART_BaudRate = 110000 , //计算出来的DLL DLH不为整数 1、需要校准RC精确度2、需要调整此处的波特率
.UART_HardwareFlowControl =0,
.FifoSetting = &UART1_Fifo ,
.stop_len = StopLen_1, //固定停止位1位
.Word_len = WordLen_8, //数据位8位
.Stick_EN = Stick_RESET, //禁用固定奇偶校验
.Even_EN = Even_SET, //奇偶校验选择
.Parity_EN = Parity_RESET, //禁用奇偶检验
};
UART_ITStructure UART1_ITSet = {
.UartIntModel = RLSI_EN | RDAI_EN ,
@ -185,19 +190,36 @@ void UART_Init(CMSDK_UART_TypeDef *CMSDK_UART, UART_InitStructure* uart_paraX){
{
overSamp_mode = 13;
}
//波特率校准反推处DLL和DLH外设时钟主频/设置波特率/过采样模式)-1
divisor_value = (uint16_t)((uint32_t)(APB_Clock_Freq / uart_paraX->UART_BaudRate / overSamp_mode) - 1);
CMSDK_UART->DLL = (uint8_t)(divisor_value & 0x0011);
CMSDK_UART->DLH = (uint8_t)((divisor_value & 0x1100)>>8);
CMSDK_UART->DLL = (uint8_t)(divisor_value & 0x00FF);
CMSDK_UART->DLH = (uint8_t)((divisor_value & 0xFF00)>>8);
/*FCR配置 FIFO control*/
CMSDK_UART->FCR |= (uart_paraX->FifoSetting->level <<6);
CMSDK_UART->FCR |= (uart_paraX->FifoSetting->level <<6);//接收多少字节后触发中断
if(uart_paraX->FifoSetting->FIFO_Enable == 1)
{
CMSDK_UART->FCR |= (1);
}
//配置停止位
CMSDK_UART->LCR &= ~(0x01 << 2);
CMSDK_UART->LCR |= uart_paraX->stop_len<<2;
/*LCR配置,不做配置默认N 8 1 */
//配置数据位
CMSDK_UART->LCR &= ~(0x03 << 0);
CMSDK_UART->LCR |= uart_paraX->Word_len<<0;
//配置是否启用校验位
CMSDK_UART->LCR &= ~(0x01 << 3);
CMSDK_UART->LCR |= uart_paraX->Parity_EN<<3;
//启用校验位
if(uart_paraX->Parity_EN==Parity_SET)
{
CMSDK_UART->LCR &= ~(0x03 << 4);
CMSDK_UART->LCR |= uart_paraX->Even_EN<<4;
CMSDK_UART->LCR |= uart_paraX->Stick_EN<<5;
}
/*MCR自动流控配置*/
if(uart_paraX->UART_HardwareFlowControl == 1)
@ -239,6 +261,18 @@ unsigned char UartPutc(CMSDK_UART_TypeDef *CMSDK_UART ,unsigned char my_ch)
WRITE_UART_THRBuff(CMSDK_UART,my_ch);
return (my_ch);
}
//串口发送一定字节的数据
void Uart_Send(CMSDK_UART_TypeDef *CMSDK_UART ,uint8_t *data, uint8_t len)
{
uint8_t t;
for(t=0;t<len;t++) //循环发送数据
{
while(UARTLine_THREmpty(CMSDK_UART) == 0x0);//等待发送结束
WRITE_UART_THRBuff(CMSDK_UART,data[t]);
}
while(UARTLine_THREmpty(CMSDK_UART) == 0x0);//等待发送结束
}

View File

@ -1,19 +1,19 @@
/*
*Copyright (C),2023 , NANOCHAP
*File name: ENS1_WAVEGEN.C
*Author:
*Version: V1.0
*Date: 2023-11-
*File name: ENS1_WAVEGEN.C
*Author:
*Version: V1.0
*Date: 2023-11-
*Description:
*Function List:
*Function List:
1 int wavegen_driverA_sine_test(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t incount);
2 void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA);
3 void wavegen_Init(void);
4 void wavegen_Start(void);
History:
History:
1.V1.0
Date:
Author:
Date:
Author:
Modification:
*/
@ -27,89 +27,98 @@ static EMS_Config_TypeDef g_ems_config = {0};
static volatile uint8_t g_ems_running = 0;
static volatile uint32_t g_ems_count = 0;
// 缓进缓出控制变量
static volatile uint16_t g_current_intensity = 0; // 当前强度
static volatile uint8_t g_ramp_phase = 0; // 渐进阶段0=缓进, 1=保持, 2=缓出
static volatile uint32_t g_wave_counter = 0; // 方波周期计数器
static volatile uint32_t g_ramp_step_counter = 0; // 缓进步进计数器
/* --------------------------------------------------------------- */
/* 波形生成器驱动器A正弦波测试 */
/* --------------------------------------------------------------- */
int wavegen_driverA_sine_test(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA, uint16_t incount)
{
int return_val = 0;
int err_code = 0;
puts("\n驱动器A正弦波测试\n");
int err_code = 0;
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_REST_T_REG = 100; //死区时间10ms //交替模式下死区时间失效即使CONFIG_REG使能了死区时间也无效
//CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_SILENT_T_REG = 200; //静默时间20ms
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 0x00000020; //32MHz ==PCLK
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 32; //32MHz ==PCLK //MHz为单位
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = 100; //正半周期脉宽10ms有交替方波
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = 100; //负半周期脉宽10ms无交替方波
#if 1//无需静默时间
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x00000050; //bit 0:rest enable 正半周期和负半周期中间的休息时间
//1:negative enable 负半周期发生使能,如果不使能,则没有负半周期的波形(注意交替模式只会对正半周期起作用)
//2: silent enable 负半周期结束后的静默时间
//3: source B enable 负脉宽方向使能位1负脉宽在负半周期0负脉宽在正半周期
//4: alternating the positive side ,正极交替产生包络
//5: continue mode ,连续模式
//6: multi-electrode ,多电极模式
#else //需要静默时间
/*交替模式下config寄存器说明
0x50 0x51 0x58 0x59
0x54 0x55 0x5C 0x5D
0x5A 0x5B
B失能了 0x52 0x53
B失能了 0x56 0x57
0x5E 0x5F
*/
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x5F; //bit 0:rest enable 正半周期和负半周期中间的死区时间
//1:negative enable 负半周期发生使能,如果不使能,则没有负半周期的波形
//2: silent enable 负半周期结束后的静默时间
//3: source B enable
//4: alternating the positive side ,正极交替产生包络
//5: continue mode ,连续模式
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x34; //静默时间、交替模式和多电极使能 //6: multi-electrode ,多电极模式
printf("\n驱动器A正弦波测试\n");
#endif
CMSDK_WAVEGEN_DRVA ->WAVE_GEN_DRV_ISEL_REG = 0x04; // 总电流 = 单元电流ISEL * WAVE_GEN_DRV_IN_WAVE_REG
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_REST_T_REG = 100; // 死区时间10ms //交替模式下死区时间失效即使CONFIG_REG使能了死区时间也无效
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_SILENT_T_REG = 200; //静默时间20ms
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 0x00000020; // 32MHz ==PCLK
for(int i=0; i<64; i++){
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
//CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = sine_data[i]; //正弦波数据数组,根据数组中的点描绘正半周期的波形
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = saw_data[i]; //三角波数据
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = incount; //方波数据固定值0x80
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CLK_FREQ_REG = 32; // 32MHz ==PCLK //MHz为单位
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = 100; // 正半周期脉宽10ms有交替方波
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = 100; // 负半周期脉宽10ms无交替方波
#if 1 // 无需静默时间
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x00000050; // bit 0:rest enable 正半周期和负半周期中间的休息时间
// 1:negative enable 负半周期发生使能,如果不使能,则没有负半周期的波形(注意交替模式只会对正半周期起作用)
// 2: silent enable 负半周期结束后的静默时间
// 3: source B enable 负脉宽方向使能位1负脉宽在负半周期0负脉宽在正半周期
// 4: alternating the positive side ,正极交替产生包络
// 5: continue mode ,连续模式
// 6: multi-electrode ,多电极模式
#else // 需要静默时间
/*交替模式下config寄存器说明
0x50 0x51 0x58 0x59
0x54 0x55 0x5C 0x5D
0x5A 0x5B
B失能了 0x52 0x53
B失能了 0x56 0x57
0x5E 0x5F
*/
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x5F; //bit 0:rest enable 正半周期和负半周期中间的死区时间
// 1:negative enable 负半周期发生使能,如果不使能,则没有负半周期的波形
// 2: silent enable 负半周期结束后的静默时间
// 3: source B enable
// 4: alternating the positive side ,正极交替产生包络
// 5: continue mode ,连续模式
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CONFIG_REG = 0x34; // 静默时间、交替模式和多电极使能 //6: multi-electrode ,多电极模式
#endif
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ISEL_REG = 0x04; // 总电流 = 单元电流ISEL * WAVE_GEN_DRV_IN_WAVE_REG
for (int i = 0; i < 64; i++)
{
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = sine_data[i]; //正弦波数据数组,根据数组中的点描绘正半周期的波形
// CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = saw_data[i]; //三角波数据
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = incount; // 方波数据固定值0x80
}
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_LIM_REG = 3200;// 3200 需要设置一个正半周期下需要再生成多少个周期波形。设置10kHz=0.1ms=100us100us=A*(1/32us),所以A=3200。
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_SILENT_LIM_REG = 0; // 交替后静默的时钟数无死区时间设置。在这种情况下驱动器B连续交替。//包络下波形的静默时间
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_DELAY_LIM_REG = 0x00000000; // 延迟时钟数
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_SCALE_REG = 0x00000001; //负半周期幅值倍乘系数如超过255则从0开始增长
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_OFFSET_REG = 0x00000000; //负半周期幅值偏移量如超过255则从0开始增长
//如正半周期幅值为250此处设置为10则负半周期幅值为5
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_INT_REG = 0x0;// 中断寄存器设置为0
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CTRL_REG = 0x00000001; //使能驱动器
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_LIM_REG = 3200; // 3200 需要设置一个正半周期下需要再生成多少个周期波形。设置10kHz=0.1ms=100us100us=A*(1/32us),所以A=3200。
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ALT_SILENT_LIM_REG = 0; // 交替后静默的时钟数无死区时间设置。在这种情况下驱动器B连续交替。//包络下波形的静默时间
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_DELAY_LIM_REG = 0x00000000; // 延迟时钟数
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_SCALE_REG = 0x00000001; // 负半周期幅值倍乘系数如超过255则从0开始增长
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_NEG_OFFSET_REG = 0x00000000; // 负半周期幅值偏移量如超过255则从0开始增长
// 如正半周期幅值为250此处设置为10则负半周期幅值为5
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_INT_REG = 0x0; // 中断寄存器设置为0
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_CTRL_REG = 0x00000001; // 使能驱动器
/* 生成返回值 */
if (err_code != 0) {
puts("\n错误 : 驱动器A测试失败\n");
return_val = 1;
err_code = 0;
if (err_code != 0)
{
printf("\n错误 : 驱动器A测试失败\n");
return_val = 1;
err_code = 0;
}
return(return_val);
return (return_val);
}
void wavegen_Stop(CMSDK_WAVE_GEN_TypeDef *CMSDK_WAVEGEN_DRVA)
{
CMSDK_WAVEGEN_DRVA ->WAVE_GEN_DRV_ISEL_REG = 0; //范围 0x00 - 0x07
for(int i=0; i<64; i++){
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = 0; //最大值0xff
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_ISEL_REG = 0; // 范围 0x00 - 0x07
for (int i = 0; i < 64; i++)
{
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
CMSDK_WAVEGEN_DRVA->WAVE_GEN_DRV_IN_WAVE_REG = 0; // 最大值0xff
}
}
@ -118,18 +127,20 @@ void wavegen_Init(void)
{
// 设置MTP等待周期
CMSDK_MTPREG->MTP_CR = 0x00000002;
// 注意时钟配置已在ClockInit()中完成,这里不再重复配置
// 使用HSI作为主频 32MHz
// CMSDK_SYSCON->HSI_CTRL = (CMSDK_SYSCON->HSI_CTRL & ~CMSDK_SYSCON_HSI_FREQ_Msk) | (0x3 << CMSDK_SYSCON_HSI_FREQ_Pos); //HSI=32MHz
// 使能UART和WAVE_GEN外设时钟不覆盖TIMER0时钟
CMSDK_SYSCON->APB_CLKEN |= 0x1003|0x4000; // 使用|=而不是=,避免覆盖其他时钟使能
CMSDK_SYSCON->APB_CLKEN |= 0x1003 | 0x4000; // 使用|=而不是=,避免覆盖其他时钟使能
// 升压电压选择
boost_voltage_select_26V();
puts("ENS1 - WAVE_GENERATOR_DRIVER_A_Test - $Revision: R001\n");
//boost_voltage_select_11V();
//boost_voltage_select_15V();
//boost_voltage_select_26V();
//boost_voltage_select_45V();
boost_voltage_select_55V();
}
// 启动波形生成器
@ -137,12 +148,26 @@ void wavegen_Start(void)
{
g_ems_running = 1;
g_ems_count = 0;
// 初始化缓进缓出控制
if (g_ems_config.enable_ramp)
{
g_current_intensity = 0; // 从0开始
g_ramp_phase = 0; // 缓进阶段
g_wave_counter = 0; // 重置方波计数器
g_ramp_step_counter = 0; // 重置步进计数器
}
else
{
g_current_intensity = g_ems_config.intensity; // 直接使用设定强度
}
}
// 电刺激参数配置
void EMS_Configure(EMS_Config_TypeDef *config)
{
if(config != NULL) {
if (config != NULL)
{
g_ems_config = *config;
}
}
@ -151,16 +176,18 @@ void EMS_Configure(EMS_Config_TypeDef *config)
void EMS_Start(void)
{
wavegen_Start();
printf("电刺激已启动\n");
}
// 停止电刺激
void EMS_Stop(void)
{
g_ems_running = 0;
g_ems_count = 0; // 重置计数器
g_ems_count = 0; // 重置计数器
g_current_intensity = 0; // 重置强度
g_ramp_phase = 0; // 重置渐进阶段
g_wave_counter = 0; // 重置方波计数器
g_ramp_step_counter = 0; // 重置步进计数器
wavegen_Stop(WAVE_GEN_DRVA_BLK0);
printf("电刺激已停止\n");
}
// 更新电刺激强度
@ -169,23 +196,125 @@ void EMS_UpdateIntensity(uint16_t intensity)
g_ems_config.intensity = intensity;
}
// 缓进缓出处理函数(在电刺激处理中调用)
void EMS_Process_Ramp(void)
{
if (!g_ems_config.enable_ramp || !g_ems_running)
{
return; // 如果未启用缓进缓出或未运行,直接返回
}
// 计算每个强度步进需要的方波周期数
// 2秒 = 2000000微秒每个方波周期100微秒所以2秒内有20000个方波周期
// 需要从0增加到128所以每156.25个方波周期增加1个强度单位
uint32_t waves_per_step = 0;
uint32_t total_waves_ramp_up = g_ems_config.ramp_up_time * 5; // 缓进阶段总方波周期数
uint32_t total_waves_ramp_down = g_ems_config.ramp_down_time * 1; // 缓出阶段总方波周期数
uint32_t total_waves_hold = g_ems_config.hold_time * 5; // 保持阶段总方波周期数
if (g_ems_config.intensity > 0)
{
waves_per_step = total_waves_ramp_up / g_ems_config.intensity; // 每个强度步进需要的方波周期数
}
g_wave_counter++; // 每次调用增加一个方波周期计数
switch (g_ramp_phase)
{
case 0: // 缓进阶段
if (g_ramp_step_counter < total_waves_ramp_up)
{
// 检查是否需要增加强度
if (g_wave_counter >= waves_per_step)
{
g_wave_counter = 0; // 重置方波计数器
if (g_current_intensity < g_ems_config.intensity)
{
g_current_intensity++;
}
}
g_ramp_step_counter++;
}
else
{
// 缓进完成,进入保持阶段
g_ramp_phase = 1;
g_ramp_step_counter = 0;
g_current_intensity = g_ems_config.intensity; // 确保达到最大强度
}
break;
case 1: // 保持阶段
if (g_ramp_step_counter < total_waves_hold)
{
// 保持最大强度
g_current_intensity = g_ems_config.intensity;
g_ramp_step_counter++;
}
else
{
// 保持完成,进入缓出阶段
g_ramp_phase = 2;
g_ramp_step_counter = 0;
g_wave_counter = 0; // 重置方波计数器
}
break;
case 2: // 缓出阶段
if (g_ramp_step_counter < total_waves_ramp_down)
{
// 检查是否需要减少强度
if (g_wave_counter >= waves_per_step)
{
g_wave_counter = 0; // 重置方波计数器
if (g_current_intensity > 0)
{
g_current_intensity--;
}
}
g_ramp_step_counter++;
}
else
{
// 缓出完成,停止电刺激
g_current_intensity = 0;
// 这里不直接停止,让主循环控制停止
}
break;
}
}
// 电刺激主循环处理函数(在主循环中调用)
void EMS_Process(void)
{
if(g_ems_running) {
if (g_ems_running)
{
g_ems_count++;
// 处理缓进缓出控制
EMS_Process_Ramp();
// 使用当前缓进缓出的强度
uint16_t current_intensity = g_current_intensity;
// 根据配置生成不同强度的方波
if(g_ems_count < 1280) {
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, g_ems_config.intensity);
} else if(g_ems_count < 1280*256) {
if (g_ems_count < 1280)
{
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity);
}
else if (g_ems_count < 1280 * 256)
{
// 休息时间
} else if(g_ems_count < 1280*2) {
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, g_ems_config.intensity);
} else {
}
else if (g_ems_count < 1280 * 2)
{
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity);
}
else
{
// 重置计数器,开始新的周期
g_ems_count = 0;
}
}
}

View File

@ -11,86 +11,86 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#include "ENS1_ADC.h"
#include "ENS1_GPIO.h"
#include "ENS1_CLOCK.h"
#include "ENS1_ANAC.h"
/* 一、寄存器说明:
ADC配置
ADC控制 ADC使能 ADC启动
ADC中断使能 EOC中断使能 使
ADC中断状态 EOC中断发生
ADC状态 EOC标志 ADC空闲或繁忙状态
ADC时钟分频 2 4 6 8 10 12 16 32
ADC采样时间 ADC采样时间时钟数 2 3 4 5
ADC数据
ADC通道选择
ADCEOC配置 EOC标志后开启下次转换
/* һ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC<EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>ת<EFBFBD><EFBFBD>ģʽ <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD>ģʽ <EFBFBD>ȴ<EFBFBD>ģʽ
ADC<EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD> ADCʹ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC<EFBFBD>ж<EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD> EOC<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>
ADC<EFBFBD>ж<EFBFBD>״̬<EFBFBD><EFBFBD> EOC<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD>
ADC״̬ <EFBFBD><EFBFBD> EOC<EFBFBD><EFBFBD>־ ADC<EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>æ״̬
ADCʱ<EFBFBD>ӷ<EFBFBD>Ƶ <EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶֵ 2 4 6 8 10 12 16 32
ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 3 4 5
ADC<EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
ADCͨ<EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>
ADCEOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD>Ƿ<EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>ת<EFBFBD><EFBFBD>
*/
/* 二、单次转换模式
*ADC控制启将 ADC_START 0 EOC或者EOC_WAIT_COUNT_DONE
*EOC_WAIT_COUNT_DONE EOC
*ADC将停止转换ADC_CTRL_REG ADC_EN 1
*ADC_EN 0 EOC/EOC_WAIT_COUNT_DONE
*EOC
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ
*ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD>ADC_START λ<EFBFBD><EFBFBD>0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>EOC_WAIT_COUNT_DONE <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD>
*<EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><EFBFBD>EOC_WAIT_COUNT_DONE <EFBFBD><EFBFBD>û<EFBFBD>н<EFBFBD><EFBFBD>յ<EFBFBD>EOC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*ADC<EFBFBD><EFBFBD>ֹͣת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CTRL_REG <EFBFBD><EFBFBD> ADC_EN λ Ϊ1
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD>ڼADC_EN λ<EFBFBD><EFBFBD>Ϊ0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><EFBFBD>е<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC/EOC_WAIT_COUNT_DONE ֹͣת<EFBFBD><EFBFBD>
*<EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>EOC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC单次转换流程
1
2ADC_CONFIG_reg bit0 = 0 bit2 = 0
3
4 ADC_Data register
5ADC_EOC_IE中断生成
6使 IER寄存器的 EOC_INT_EN OVER_RUN_INT_EN
7ADC
ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޵ȴ<EFBFBD>ģʽ<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit0 = 0 bit2 = 0
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_Data register
5<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ADC_EOC_IE<EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>
6<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> IER<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC_INT_EN <EFBFBD><EFBFBD>OVER_RUN_INT_EN λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
7<EFBFBD><EFBFBD>Ӳ<EFBFBD><EFBFBD>ֹͣADC
*/
/*三、连续转换模式
1ADC_CONFIG_reg bit0 = 1
21 ADC_EN bit and ADC_START bits
3adc_eoc_config_regsiter[0]
Adc_eoc_config_register[0] =1 EOC后开始下次转换
4ADC_EOC_IE
5使 IER寄存器的 EOC_INT_EN OVER_RUN_INT_EN
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>ģʽ
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit0 = 1
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>1 ADC_EN bit and ADC_START bits
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>󣬻<EFBFBD><EFBFBD><EFBFBD>adc_eoc_config_regsiter[0] <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>´<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>Adc_eoc_config_register[0] =1 <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD>ʼ<EFBFBD>´<EFBFBD>ת<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
4<EFBFBD><EFBFBD>ADC_EOC_IE <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> IER<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC_INT_EN <EFBFBD><EFBFBD>OVER_RUN_INT_EN λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
ADC_eoc_config_reg寄存器仅仅在连续采样- 0EOC即开始启动下一次转换
1EOC后开始启动下一次转换
-ADC_eoc_config_reg应该被设置为0
ע<EFBFBD>ADC_eoc_config_reg<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD>ǵȴ<EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч <EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<EFBFBD>ȴ<EFBFBD>ģʽ<EFBFBD>£<EFBFBD>ADC_eoc_config_regӦ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
/*四、等待模式
1ADC_CONFIG_reg bit2 = 1 使
2
3
ADC数据到相应寄存器中
ADC_EOC_IE
使 IER寄存器的 EOC_INT_EN OVER_RUN_INT_EN
4ADC控制器进入到ADC_WAIT EOC中断被清除 ADC数据被系统读走
5EOC中断被清除ADC开始下一次的转换
/*<EFBFBD>ġ<EFBFBD><EFBFBD>ȴ<EFBFBD>ģʽ
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_CONFIG_reg bit2 = 1 <EFBFBD><EFBFBD>ʹ<EFBFBD>ܵȴ<EFBFBD>ģʽ<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD>
3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD>
<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ADC_EOC_IE <EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> IER<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> EOC_INT_EN <EFBFBD><EFBFBD>OVER_RUN_INT_EN λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
4<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_WAIT <EFBFBD>ȴ<EFBFBD>״ֱ̬<EFBFBD><EFBFBD>EOC<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD>ϵͳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
5<EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>EOC<EFBFBD>жϱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD>ת<EFBFBD><EFBFBD>
*/
/*五、数据锁存器
1ADC控制启接收到EOC后
2 OVERRUN模式被使能 overrun
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OVERRUNģʽ<EFBFBD><EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD><EFBFBD>µ<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<EFBFBD><EFBFBD><EFBFBD>
overrun 使 overrun
overrun
overrun
ע<EFBFBD> <EFBFBD><EFBFBD><EFBFBD>overrun ģʽû<EFBFBD>б<EFBFBD>ʹ<EFBFBD>ܣ<EFBFBD> <EFBFBD>µĻ<EFBFBD><EFBFBD>߾ɵ<EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬ѡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
/*六、中断说明
1EOC后 EOC_IR
2OVERRUN错误发生后OVERRUN_IR
3EOC_IR overrun ADC中断被
data_reg adc数据后 EOC_IR EOC_IR_CLEAR
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>˵<EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC<EFBFBD><EFBFBD> EOC_IR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD>OVERRUN<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OVERRUN_IR <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
3<EFBFBD><EFBFBD>EOC_IR <EFBFBD><EFBFBD>overrun <EFBFBD><EFBFBD>ΪADC<EFBFBD>жϱ<EFBFBD> ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ
<EFBFBD><EFBFBD>ϵͳͨ<EFBFBD><EFBFBD> data_reg <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>adc<EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD> EOC_IR <EFBFBD><EFBFBD> EOC_IR_CLEAR <EFBFBD><EFBFBD><EFBFBD>
*/
/*overrun 错误
ADC控制器在系统读取走ADC数据前EOC_IR前EOC
/*overrun <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD>˴<EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD> ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>EOC_IRǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><EFBFBD>µ<EFBFBD>EOC
*/
@ -148,13 +148,13 @@ uint8_t ENS1_ADC_CONFIG(ENS_ADC_SEL channelx ,
CMSDK_ADC->ADC_SAMP_TIME = (CMSDK_ADC->ADC_SAMP_TIME &~ 0x3) | SIMLING_TIME;
//配置ADC_eoc_config_reg寄存器仅仅在连续采样-非等待模式下有效)
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ADC_eoc_config_reg<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D>ǵȴ<C7B5>ģʽ<C4A3><CABD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>
if( ((MODE_SEL & 0X1 )== 1 ) && (MODE_SEL & 0X4) == 0)
{
CMSDK_ADC->ADC_EOC_CONFG = (CMSDK_ADC->ADC_EOC_CONFG &~ (0x1)) | EOC_CONFIG;
}
//中断使能
//<EFBFBD>ж<EFBFBD>ʹ<EFBFBD><EFBFBD>
CMSDK_ADC->ADC_IER = (CMSDK_ADC->ADC_IER &~ (0x3)) | ( INT_MODE_SEL );
return CMSDK_ADC->ADC_CONFG;
}
@ -176,11 +176,11 @@ uint8_t ENS1_ADC_STOP(ENS_ADC_SEL channelx)
return 0;
}
//连续读取数据
//ADC在不同模式下有不同的采集方式根据Adc_config_register的配置不同共8种模式
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//ADC<EFBFBD>ڲ<EFBFBD>ͬģʽ<EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ͬ<EFBFBD>IJɼ<EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Adc_config_register<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ò<EFBFBD>ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>8<EFBFBD><EFBFBD>ģʽ
uint16_t save_data;
uint8_t ADC_CONFIG_READ;
//此函数未完成,测试使用连续采集+中断模式,此函数暂时用不到
//<EFBFBD>˺<EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>ɣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD>+<2B>ж<EFBFBD>ģʽ<C4A3><CABD><EFBFBD>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ò<EFBFBD><C3B2><EFBFBD>
uint16_t ADC_READ_DATA(void)
{
@ -188,8 +188,8 @@ uint16_t ADC_READ_DATA(void)
ADC_CONFIG_READ = CMSDK_ADC->ADC_CONFG;
switch(ADC_CONFIG_READ & 0x7) {
case single_mode_without_overrun_without_wait :
while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //等待在中断中EOC的到来
ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //中断发生已经有ADC的数据了此时再将状态切换到等待下一次数据
while(ADC_READ_STATUS == ADC_READ_DATA_IS_WAITING); //<EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><EFBFBD><EFBFBD>EOC<EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD>
ADC_READ_STATUS = ADC_READ_DATA_IS_WAITING; //<EFBFBD>жϷ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><EFBFBD><EFBFBD>ADC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ٽ<EFBFBD>״̬<EFBFBD>л<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
break;
@ -230,12 +230,11 @@ uint16_t ADC_READ_DATA(void)
//ADC interrupt handler
void ADC_Handler(void) __irq
{
if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //接收到EOC
if((CMSDK_ADC->ADC_ISR & 0x01) == 0x01) //<EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>EOC
{
CMSDK_ADC->ADC_INT_CLR = (0x01<<0);
ADC_READ_STATUS = ADC_READ_DATA_IS_READY;
save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //读走数据后,可以进行下一次采集
printf("%d\n",save_data);
save_data = (CMSDK_ADC->ADC_DATA & 0x0fff); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݺ󣬿<DDBA><F3A3ACBF>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>βɼ<CEB2>
ADC_UART_BYTE_LOW = save_data&0xff;
ADC_UART_BYTE_HIGH = (save_data&0x0f00)>>8;
}

View File

@ -11,106 +11,106 @@ History:
1.V1.0
Date:
Author:
Modification:
Modification: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#include "ENS_CURRENT_CALIBRATION.h"
#include "ENS1_MTP.h"
#include "ENS1_UART.h"
#include "ENS1_TIMER.h"
/*--------------------------------波形参数的初始化幅值结构体-----------------------------*/
/*--------------------------------<EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>-----------------------------*/
STRUCT_WAVEFORM_PARA ParaSet_waveform[4] =
{
/*通道1 -- ST0 ST1 */
/*ͨ<EFBFBD><EFBFBD>1 -- ST0 ST1 */
{
.Type = SQUARE_WAVE , //波形种类选择
.PositivePulseWidth = 100 , //正半周期脉宽-微秒
.DeadTime = 10, //死区时间-微秒
.NegativePulseWidth = 100 , //负半周期脉宽-微秒
.ClientTime = 1000 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
.Type = SQUARE_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
.PositivePulseWidth = 100 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.DeadTime = 10, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.NegativePulseWidth = 100 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.ClientTime = 1000 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD><><CEA2>
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
},
/*通道2 -- ST2 ST3 */
/*ͨ<EFBFBD><EFBFBD>2 -- ST2 ST3 */
{
.Type = TRIANGULAR_WAVE , //波形种类选择
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
.DeadTime = 0, //死区时间-微秒
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
.ClientTime = 0 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
.Type = TRIANGULAR_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
.PositivePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.DeadTime = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.NegativePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.ClientTime = 0 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD><><CEA2>
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
},
/*通道3 -- ST4 ST5 */
/*ͨ<EFBFBD><EFBFBD>3 -- ST4 ST5 */
{
.Type = TRIANGULAR_WAVE , //波形种类选择
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
.DeadTime = 0, //死区时间-微秒
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
.ClientTime = 0 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
.Type = TRIANGULAR_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
.PositivePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.DeadTime = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.NegativePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.ClientTime = 0 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD><><CEA2>
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
},
/*通道4 -- ST6 ST7 */
/*ͨ<EFBFBD><EFBFBD>4 -- ST6 ST7 */
{
.Type = TRIANGULAR_WAVE , //波形种类选择
.PositivePulseWidth = 0 , //正半周期脉宽-微秒
.DeadTime = 0, //死区时间-微秒
.NegativePulseWidth = 0 , //负半周期脉宽-微秒
.ClientTime = 0 , //静默时间-微秒
.DelayOutputTime_US = 0, //延迟输出时间-微秒
.OtherWaveformPara.AlternatingFreq_HZ = 0, //交替波形频率 //
.OtherWaveformPara.TotalOutputTime_S = 0, //设置总输出时间 秒
.OtherWaveformPara.NumOfPulseGroups = 0, //脉冲群模式下的每组脉冲数量
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //脉冲群模式下的组间隔时间 毫秒
.Type = TRIANGULAR_WAVE , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><EFBFBD>
.PositivePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.DeadTime = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.NegativePulseWidth = 0 , //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><CEA2>
.ClientTime = 0 , //<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD><><CEA2>
.DelayOutputTime_US = 0, //<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><><CEA2>
.OtherWaveformPara.AlternatingFreq_HZ = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD> //
.OtherWaveformPara.TotalOutputTime_S = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><>
.OtherWaveformPara.NumOfPulseGroups = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD>ÿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
.OtherWaveformPara.TimeOfPulseGroups_MS = 0, //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥģʽ<EFBFBD>µ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
},
};
/*-------------------------------------------------------------------------------------*/
/*-------------------------获取到FT测试后的实际测量单元电流值---------------------------*/
uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //用于保存FT读取出的数据
uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //用于自定义单元电流值
uint8_t unit_current[4] ={0,0,0,0}; //保存计算好的实际单元电流值
uint8_t GET_FT_CURRENT(void) //电流设置:208*4
/*-------------------------<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><EFBFBD>ʵ<EFBFBD>ʲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ---------------------------*/
uint16_t FT_CURRENT_SAVE[4]={0,0,0,0}; //<EFBFBD><EFBFBD><EFBFBD>ڱ<EFBFBD><EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uint8_t CUSTOM_UNIT_CURRENT[4]={33,33,33,33}; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD>嵥Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
uint8_t unit_current[4] ={0,0,0,0}; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
uint8_t GET_FT_CURRENT(void) //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD>208*4
{
//当需要使用FT后的芯片时打开注释 此时自动计算单元电流
//当手动校准时修改CUSTOM_UNIT_CURRENT[4] 数组中的数据并将下面4行注释掉
// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//读出保存在MTP中的实际检测电流值用于计算实际单元电流
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫʹ<EFBFBD><EFBFBD>FT<EFBFBD><EFBFBD><EFBFBD>оƬʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ע<EFBFBD>ͣ<EFBFBD> <20><>ʱ<EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>㵥Ԫ<E3B5A5><D4AA><EFBFBD><EFBFBD>
//<EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>У׼ʱ<EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>CUSTOM_UNIT_CURRENT[4] <20><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>4<EFBFBD><34>ע<EFBFBD>͵<EFBFBD>
// flash_read(DATA_SAVE_ADDR ,&FT_CURRENT_SAVE[0]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// flash_read(DATA_SAVE_ADDR+2 ,&FT_CURRENT_SAVE[1]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// flash_read(DATA_SAVE_ADDR+4 ,&FT_CURRENT_SAVE[2]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// flash_read(DATA_SAVE_ADDR+6 ,&FT_CURRENT_SAVE[3]);//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MTP<EFBFBD>е<EFBFBD>ʵ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>ڼ<EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
for(int i = 0 ;i<4;i++)
{
if(FT_CURRENT_SAVE[i] != 0)
unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //计算实际单元电流
unit_current[i] = (uint8_t)(FT_CURRENT_SAVE[i] /( 208 * 4 )) ; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else
unit_current[i] = CUSTOM_UNIT_CURRENT[i] ;
}
return 0;
}
/*-------------------------------------输出电流大小设置--------------------------------*/
//正弦波计算数据填充值
/*-------------------------------------<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD><EFBFBD><EFBFBD><EFBFBD>--------------------------------*/
//<EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
double sin_cal(uint8_t angle) //0-180
{
double radian = angle*PI/180;
return sin(radian);
}
//计算不同波形下的的64个点的值当前有方波正弦波三角波
uint16_t unit_t[4]; //保存计算后的单元电流系数0-7 共四个通道
uint32_t isel_t[4][64]; //保存计算后得到的电流挡位0-255共四个通道
//<EFBFBD><EFBFBD><EFBFBD>㲻ͬ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µĵ<EFBFBD>64<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD>
uint16_t unit_t[4]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>Ԫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>0-7<><37> <20><><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><CDA8>
uint32_t isel_t[4][64]; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><EFBFBD>ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD>0-255<35><35><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><CDA8>
BasicWaveformType wavePara_type[4];
uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType type, uint16_t* unit , uint32_t (*isel)[64]) // uint16_t read_current_data
{
@ -134,7 +134,7 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t
{
if(type == SQUARE_WAVE)
{
//保存计算结果,用于给电流相关的寄存器赋值
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
for(int i = 0 ;i<64;i++)
{
@ -143,37 +143,35 @@ uint8_t cal_output_current_mA(CHANNEL_NUM CHANNEL_X,float mA,BasicWaveformType t
}
else if(type== SINE_WAVE)
{
//保存计算结果,用于给电流相关的寄存器赋值
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
for(int i = 0 ;i<64;i++)
{
*(isel[0]+CHANNEL_X*64+i) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X) + 1)*unit_current[CHANNEL_X])*sin_cal(i*2.85714)); // 0 - 255
}
}
else //三角波赋值(type == TRIANGULAR_WAVE )
else //<EFBFBD><EFBFBD><EFBFBD>Dz<EFBFBD><EFBFBD><EFBFBD>ֵ(type == TRIANGULAR_WAVE )
{
//保存计算结果,用于给电流相关的寄存器赋值
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ֵ
*(unit+CHANNEL_X) = (uint16_t)(mA * 1000 / (unit_current[CHANNEL_X] * 255)); // 0 - 7
*(isel[0]+CHANNEL_X*64) = 0;
*(isel[0]+CHANNEL_X*64+63) = 0;
for(int j = 1 ; j<32 ; j++)
{
*(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255
// printf("%d\n",*(isel[0]+CHANNEL_X*64+j));
*(isel[0]+CHANNEL_X*64+j) = (uint16_t)(mA * 1000 / ((*(unit+CHANNEL_X)+1)*unit_current[CHANNEL_X]) * 0.033258*j); // 0 - 255
}
for(int k = 32 ; k<63 ; k++)
{
*(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ;
// printf("%d\n",*(isel[0]+CHANNEL_X*64+k));
*(isel[0]+CHANNEL_X*64+k) =*(isel[0]+CHANNEL_X*64+(63-k)) ;
}
}
}
return 0;
}
/*初始化设置*/
/*CONFIG寄存器设置*/
/*<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/*CONFIG<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
uint8_t ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
@ -223,7 +221,7 @@ uint8_t ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_NUM CHANNEL_X , DRV_CONFIG BIT)
}
/*---------------------------电刺激有关的寄存器的初始化--------------------------------*/
/*---------------------------<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD>йصļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>ʼ<EFBFBD><EFBFBD>--------------------------------*/
uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
{
//uint32_t WaveformFreq=0;
@ -232,9 +230,9 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
else if(CHANNEL_X == CHANNEL_1) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK1;
else if(CHANNEL_X == CHANNEL_2) WAVE_GEN_BLK=WAVE_GEN_DRVA_BLK2;
else WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3;
//config 设置
//config <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,DISABLE_ALL_BIT);
//1 、 死区时间不为0波形不为sine波 ,使能REST
//1 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ʱ<EFBFBD>䲻Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD>Ϊsine<6E><65> ,ʹ<><CAB9>REST
if((ParaSet_waveform[CHANNEL_X].DeadTime > 0)){
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,REST_BIT);
}
@ -242,13 +240,13 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
{
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,REST_BIT);
}
//2 、 负半周期脉宽大于0 使能 NEGATIVE_BIT 和 SOURCE_B_BIT
//2 <EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 ʹ<><CAB9> NEGATIVE_BIT <20><> SOURCE_B_BIT
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth > 0)
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEB不使能则负半周期的数据无效(=0
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SOURCE_B_BIT ); //SOURCEB<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD><EFBFBD>򸺰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD>=0<><30>
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,NEGATIVE_BIT );
}
//3、静默时间不为0开启SILENT_BIT
//3<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭʱ<EFBFBD>䲻Ϊ0<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SILENT_BIT
if(ParaSet_waveform[CHANNEL_X].ClientTime>0)
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,SILENT_BIT);
@ -258,13 +256,13 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SILENT_BIT);
}
//4、交替模式ALTERNATING_POSITIVE_BIT
//4<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽALTERNATING_POSITIVE_BIT
if(ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ > 0 )
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,ALTERNATING_POSITIVE_BIT);
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,SOURCE_B_BIT);
ENS_STIMU_CONFIG_BIT_DISABLE(CHANNEL_X,NEGATIVE_BIT);
//交替时间与主频有关,输入的参数为交替频率,需要转化为时钟个数,时钟个数不能超过2^16
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>й<EFBFBD>,<2C><><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD>Ҫת<D2AA><D7AA>Ϊʱ<CEAA>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>2^16
WAVE_GEN_BLK ->WAVE_GEN_DRV_ALT_LIM_REG =(uint16_t)(ParaSet_waveform[CHANNEL_X].PositivePulseWidth / (uint16_t)ParaSet_waveform[CHANNEL_X].OtherWaveformPara.AlternatingFreq_HZ * (uint16_t)(APB_Clock_Freq/1000000)) ;
ParaSet_waveform[CHANNEL_X].NegativePulseWidth = 0;
}
@ -274,37 +272,37 @@ uint32_t StimulatorInit(CHANNEL_NUM CHANNEL_X)
}
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,CONTINUE_REPEATING_BIT);
//延迟输出时间计算 单位us
//<EFBFBD>ӳ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>λus
WAVE_GEN_BLK->WAVE_GEN_DRV_DELAY_LIM_REG = (uint8_t)(APB_Clock_Freq/1000000)*ParaSet_waveform[CHANNEL_X].DelayOutputTime_US;
//根据初始化后的STRUCT_WAVEFORM_PARA结构体给对应的寄存器赋值
//<EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>STRUCT_WAVEFORM_PARA<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].NegativePulseWidth;
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = ParaSet_waveform[CHANNEL_X].PositivePulseWidth;
WAVE_GEN_BLK->WAVE_GEN_DRV_CLK_FREQ_REG = (uint32_t)(APB_Clock_Freq/1000000); //
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = ParaSet_waveform[CHANNEL_X].ClientTime;
WAVE_GEN_BLK->WAVE_GEN_DRV_REST_T_REG = ParaSet_waveform[CHANNEL_X].DeadTime;
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //寄存器默认为0 必须写大于0的数
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_SCALE_REG = 1; //<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>Ϊ0<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD>
WAVE_GEN_BLK->WAVE_GEN_DRV_NEG_OFFSET_REG = 0;
//WaveformFreq = (uint32_t)(1000000 / (wavePara.ClientTime + wavePara.DeadTime +wavePara.NegativePulseWidth + wavePara.PositivePulseWidth));
//保存波形类型数据
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wavePara_type[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].Type;
TOTAL_TIME_THRESHOLD_VALUE[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TotalOutputTime_S * 1000;
if( (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS > 0) || (ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups >0))
{
TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //间隔时间清零
TRIGGER_TIME_COUNT[CHANNEL_X] = 0; //<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TRIGGER_TIME_THRESHOLD_VALUE[CHANNEL_X]=ParaSet_waveform[CHANNEL_X].OtherWaveformPara.TimeOfPulseGroups_MS ;
NUM_OF_PULSES_THRESHOLD[CHANNEL_X] = ParaSet_waveform[CHANNEL_X].OtherWaveformPara.NumOfPulseGroups ;
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
}
uint8_t returnValue = cal_output_current_mA(CHANNEL_X,0, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //返回波形的频率
return (uint32_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CONFIG_REG); //<EFBFBD><EFBFBD><EFBFBD>ز<EFBFBD><EFBFBD>ε<EFBFBD>Ƶ<EFBFBD><EFBFBD>
}
/*--------------------------------------启动输出-----------------------------------------*/
volatile uint8_t statics_config=0; //明确当前有几个通道在输出 0 / 1 / 2 /4 / 8
/*--------------------------------------<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------------------------*/
volatile uint8_t statics_config=0; //<EFBFBD><EFBFBD>ȷ<EFBFBD><EFBFBD>ǰ<EFBFBD>м<EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 / 1 / 2 /4 / 8
void StartStimulatorOut(CHANNEL_NUM CHANNEL_X)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
@ -314,11 +312,11 @@ void StartStimulatorOut(CHANNEL_NUM CHANNEL_X)
else {WAVE_GEN_BLK = WAVE_GEN_DRVA_BLK3; statics_config |= (1<<3) ;}
if(statics_config > 1)
{
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //多电极使能
ENS_STIMU_CONFIG_BIT_ENABLE(CHANNEL_X,MULTI_ELECTRODE_BIT); //<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>
}
WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG = 1;
}
/*--------------------------------------停止输出----------------------------------------*/
/*--------------------------------------ֹͣ<EFBFBD><EFBFBD><EFBFBD>----------------------------------------*/
void StopStimulatorOut(CHANNEL_NUM CHANNEL_X)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
@ -333,8 +331,8 @@ void StopStimulatorOut(CHANNEL_NUM CHANNEL_X)
}
}
/*-----------------------------电刺激过程中的电流、频率设置-------------------------------*/
/*输出电流大小修改*/
/*-----------------------------<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-------------------------------*/
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С<EFBFBD>޸<EFBFBD>*/
uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA)
{
CMSDK_WAVE_GEN_TypeDef* WAVE_GEN_BLK;
@ -347,18 +345,18 @@ uint8_t CURRENT_AMPLITUDE_MODIFY(CHANNEL_NUM CHANNEL_X , float mA)
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0;
StopStimulatorOut(CHANNEL_X);
cal_output_current_mA(CHANNEL_X,mA, wavePara_type[CHANNEL_X], unit_t , isel_t) ;
WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //范围 0x00 - 0x07 单元电流
WAVE_GEN_BLK ->WAVE_GEN_DRV_ISEL_REG = unit_t[CHANNEL_X]; //<EFBFBD><EFBFBD>Χ 0x00 - 0x07 <20><>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
for(int i=0; i<64; i++){
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_ADDR_REG = i;
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //最大0xff 电流挡位
WAVE_GEN_BLK->WAVE_GEN_DRV_IN_WAVE_REG = isel_t[CHANNEL_X][i]; //<EFBFBD><EFBFBD><EFBFBD>0xff <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
}
WAVE_GEN_BLK->WAVE_GEN_DRV_INT_REG = 0x001f0001;
NVIC_EnableIRQ(WG_DRV_IRQn);
StartStimulatorOut(CHANNEL_X);
return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //返回状态
return (uint8_t)(WAVE_GEN_BLK->WAVE_GEN_DRV_CTRL_REG); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
}
/*输出波形频率的实时修改,输出时,波形频率=(1000000/(正半周期脉宽 + 负半周期脉宽 + 死区时间 + 静默时间))*/
/*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>ʵ<EFBFBD>ʵʱ<EFBFBD>޸ģ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><EFBFBD>=(1000000/(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> + <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1> + <20><>Ĭʱ<C4AC><CAB1>))*/
uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
{
uint32_t Pulse_Width = 0;
@ -371,16 +369,16 @@ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
freq = 50000;
else if(freq < 10)
freq = 10;
//死区数值不改动如果静默时间不为0 ,则通过修改静默时间修改波形频率 如果静默时间为0则修改正半周期/负半周期脉宽修改频率
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭʱ<EFBFBD>䲻Ϊ0 <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>޸ľ<DEB8>Ĭʱ<C4AC><CAB1><EFBFBD>޸IJ<DEB8><C4B2><EFBFBD>Ƶ<EFBFBD><C6B5> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭʱ<C4AC><CAB1>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>Ƶ<EFBFBD><C6B5>
if(ParaSet_waveform[CHANNEL_X].ClientTime > 0)
{
Pulse_Width/*静默时间*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth);
Pulse_Width/*<EFBFBD><EFBFBD>Ĭʱ<EFBFBD><EFBFBD>*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime - ParaSet_waveform[CHANNEL_X].PositivePulseWidth - ParaSet_waveform[CHANNEL_X].NegativePulseWidth);
WAVE_GEN_BLK->WAVE_GEN_DRV_SILENT_T_REG = Pulse_Width;
return Pulse_Width;
}
else if(ParaSet_waveform[CHANNEL_X].ClientTime == 0)
{
Pulse_Width/*正+负脉宽*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ;
Pulse_Width/*<EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/ = (uint32_t)((1000000/freq) - ParaSet_waveform[CHANNEL_X].DeadTime) ;
if(ParaSet_waveform[CHANNEL_X].NegativePulseWidth == 0)
WAVE_GEN_BLK->WAVE_GEN_DRV_HLF_WAVE_PRD_REG = Pulse_Width;
else
@ -397,7 +395,7 @@ uint32_t CURRENT_FREQ_MODIFY(CHANNEL_NUM CHANNEL_X , uint32_t freq)
}
//电刺激时间计时
//<EFBFBD><EFBFBD>̼<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ʱ
uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE)
{
@ -406,20 +404,20 @@ uint32_t StimuTimeCount_S(CHANNEL_NUM CHANNEL_X , TIME_COUNT_MODE MODE)
{
count_time = *(CHANNEL_TIME_COUNT+CHANNEL_X) ;
}
else //MODE == TRIGGER_TIME_MODE 间隔时间
else //MODE == TRIGGER_TIME_MODE <EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>
{
count_time = *(TRIGGER_TIME_COUNT+CHANNEL_X);
}
return count_time;
}
//返回当前波形发生了多少次(需要开启波形发生器的中断)
//<EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD>˶<EFBFBD><EFBFBD>ٴΣ<EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>η<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϣ<EFBFBD>
uint32_t waveformOccurreCount(CHANNEL_NUM CHANNEL_X)
{
return (uint32_t)(wave_gen_irq_occurred[CHANNEL_X]/4);
}
/*-------------------------------电刺激驱动器中断处理函数-----------------------*/
/*-------------------------------<EFBFBD><EFBFBD>̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-----------------------*/
volatile uint32_t NUM_OF_PULSES_THRESHOLD[4]={0,0,0,0};
volatile uint32_t wave_gen_irq_occurred[4]={0,0,0,0};
void WG_DRV_Handler(void)
@ -433,9 +431,9 @@ void WG_DRV_Handler(void)
else if(i==2){ DRVA= WAVE_GEN_DRVA_BLK2; }
else if(i==3){ DRVA= WAVE_GEN_DRVA_BLK3; }
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //判断哪个通道发生了中断
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_DRIVER_NUM_Msk) == i) //<EFBFBD>ж<EFBFBD><EFBFBD>ĸ<EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
{
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//第一中断点发生中断
if((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk) == CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_STS_Msk)//<EFBFBD><EFBFBD>һ<EFBFBD>жϵ㷢<EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
{
if(((DRVA->WAVE_GEN_DRV_INT_REG & CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Msk)>>CMSDK_WAVE_GEN_DRV_INT_READ_FIRST_ADDR_Pos) == 0)
{
@ -448,7 +446,7 @@ void WG_DRV_Handler(void)
{
DRVA->WAVE_GEN_DRV_INT_REG = (31 << CMSDK_WAVE_GEN_DRV_INT_SECOND_ADDR_Pos) | (0 << CMSDK_WAVE_GEN_DRV_INT_FIRST_ADDR_Pos) | CMSDK_WAVE_GEN_DRV_INT_FIRSTADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
}
if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //需要脉冲计数功能才开启计数
if((NUM_OF_PULSES_THRESHOLD[i] > 0)) //<EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܲſ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wave_gen_irq_occurred[i]++;
@ -459,8 +457,8 @@ void WG_DRV_Handler(void)
DRVA->WAVE_GEN_DRV_INT_REG = CMSDK_WAVE_GEN_DRV_INT_SECONDADDR_CLR_Msk | CMSDK_WAVE_GEN_DRV_INT_EN_Msk;
NVIC_DisableIRQ(WG_DRV_IRQn);
DRVA->WAVE_GEN_DRV_INT_REG = 0;
TRIGGER_TIME_COUNT_FLAG |= (1<<i); //脉冲群标志置1
wave_gen_irq_occurred[i] = 0; //清零计数
TRIGGER_TIME_COUNT_FLAG |= (1<<i); //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>1
wave_gen_irq_occurred[i] = 0; //<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -37,11 +37,12 @@ Section Cross References
ens1_uart.o(i.UART_Init) refers to ens1_clock.o(.data) for APB_Clock_Freq
ens1_uart.o(i.UartPutc) refers to ens1_uart.o(i.UARTLine_THREmpty) for UARTLine_THREmpty
ens1_uart.o(i.UartPutc) refers to ens1_uart.o(i.WRITE_UART_THRBuff) for WRITE_UART_THRBuff
ens1_uart.o(i.Uart_Send) refers to ens1_uart.o(i.UARTLine_THREmpty) for UARTLine_THREmpty
ens1_uart.o(i.Uart_Send) refers to ens1_uart.o(i.WRITE_UART_THRBuff) for WRITE_UART_THRBuff
ens1_gpio.o(i.GPIO_IO_Init) refers to ens1_gpio.o(i.GPIO_AltFunction) for GPIO_AltFunction
ens1_gpio.o(i.GPIO_Overturn) refers to ens1_gpio.o(i.GPIO_GetOutputValue) for GPIO_GetOutputValue
ens1_gpio.o(i.GPIO_Overturn) refers to ens1_gpio.o(i.GPIO_ResetOutput) for GPIO_ResetOutput
ens1_gpio.o(i.GPIO_Overturn) refers to ens1_gpio.o(i.GPIO_SetOutput) for GPIO_SetOutput
ens1_mtp.o(i.flash_buff_write) refers to printf1.o(i.__0printf$1) for __2printf
ens1_mtp.o(i.flash_write_ctrl) refers to ens1_mtp.o(i.flash_buff_write) for flash_buff_write
ens1_mtp.o(i.write_data) refers to malloc.o(i.malloc) for malloc
ens1_mtp.o(i.write_data) refers to memcpya.o(.text) for __aeabi_memcpy
@ -66,7 +67,6 @@ Section Cross References
ens1_timer.o(i.TIMER0_Init) refers to ens1_timer.o(i.NVIC_DisableIRQ) for NVIC_DisableIRQ
ens1_timer.o(i.TIMER0_Init) refers to ens1_timer.o(i.NVIC_ClearPendingIRQ) for NVIC_ClearPendingIRQ
ens1_timer.o(i.TIMER0_Init) refers to uidiv.o(.text) for __aeabi_uidivmod
ens1_timer.o(i.TIMER0_Init) refers to printf1.o(i.__0printf$1) for __2printf
ens1_timer.o(i.TIMER0_Init) refers to ens1_timer.o(i.CMSDK_timer_Init) for CMSDK_timer_Init
ens1_timer.o(i.TIMER0_Init) refers to ens1_timer.o(i.NVIC_EnableIRQ) for NVIC_EnableIRQ
ens1_timer.o(i.TIMER0_Init) refers to ens1_clock.o(.data) for APB_Clock_Freq
@ -87,19 +87,20 @@ Section Cross References
ens1_timer.o(i.Time_Manager_Reset) refers to ens1_timer.o(i.Time_Manager_Init) for Time_Manager_Init
ens1_wavegen.o(i.EMS_Configure) refers to memcpya.o(.text) for __aeabi_memcpy
ens1_wavegen.o(i.EMS_Configure) refers to ens1_wavegen.o(.bss) for g_ems_config
ens1_wavegen.o(i.EMS_Process) refers to ens1_wavegen.o(i.EMS_Process_Ramp) for EMS_Process_Ramp
ens1_wavegen.o(i.EMS_Process) refers to ens1_wavegen.o(i.wavegen_driverA_sine_test) for wavegen_driverA_sine_test
ens1_wavegen.o(i.EMS_Process) refers to ens1_wavegen.o(.data) for g_ems_running
ens1_wavegen.o(i.EMS_Process) refers to ens1_wavegen.o(.bss) for g_ems_config
ens1_wavegen.o(i.EMS_Process_Ramp) refers to uidiv.o(.text) for __aeabi_uidivmod
ens1_wavegen.o(i.EMS_Process_Ramp) refers to ens1_wavegen.o(.bss) for g_ems_config
ens1_wavegen.o(i.EMS_Process_Ramp) refers to ens1_wavegen.o(.data) for g_ems_running
ens1_wavegen.o(i.EMS_Start) refers to ens1_wavegen.o(i.wavegen_Start) for wavegen_Start
ens1_wavegen.o(i.EMS_Start) refers to printf1.o(i.__0printf$1) for __2printf
ens1_wavegen.o(i.EMS_Stop) refers to ens1_wavegen.o(i.wavegen_Stop) for wavegen_Stop
ens1_wavegen.o(i.EMS_Stop) refers to printf1.o(i.__0printf$1) for __2printf
ens1_wavegen.o(i.EMS_Stop) refers to ens1_wavegen.o(.data) for g_ems_running
ens1_wavegen.o(i.EMS_UpdateIntensity) refers to ens1_wavegen.o(.bss) for g_ems_config
ens1_wavegen.o(i.wavegen_Init) refers to ens1_boost.o(i.boost_voltage_select_26V) for boost_voltage_select_26V
ens1_wavegen.o(i.wavegen_Init) refers to puts.o(i.puts) for puts
ens1_wavegen.o(i.wavegen_Init) refers to ens1_boost.o(i.boost_voltage_select_55V) for boost_voltage_select_55V
ens1_wavegen.o(i.wavegen_Start) refers to ens1_wavegen.o(.data) for g_ems_running
ens1_wavegen.o(i.wavegen_driverA_sine_test) refers to puts.o(i.puts) for puts
ens1_wavegen.o(i.wavegen_Start) refers to ens1_wavegen.o(.bss) for g_ems_config
ens1_wavegen.o(i.wavegen_driverA_sine_test) refers to printfb.o(i.__0printf$bare) for __2printf
system_cmsdk_cm0.o(i.SystemCoreClockUpdate) refers to system_cmsdk_cm0.o(.data) for SystemCoreClock
system_cmsdk_cm0.o(i.SystemInit) refers to system_cmsdk_cm0.o(.data) for SystemCoreClock
startup_cmsdk_cm0.o(RESET) refers to startup_cmsdk_cm0.o(STACK) for __initial_sp
@ -154,10 +155,6 @@ Section Cross References
entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry9a.o(.ARM.Collect$$$$0000000B) for _main_init
entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry5.o(.ARM.Collect$$$$00000004) for _main_scatterload
entry.o(.ARM.Collect$$$$00000000) refers (Special) to entry2.o(.ARM.Collect$$$$00000001) for _main_stk
puts.o(i.puts) refers to retarget.o(i.fputc) for fputc
puts.o(i.puts) refers to retarget.o(.data) for __stdout
puts_e.o(.text) refers to retarget.o(i.fputc) for fputc
puts_e.o(.text) refers to retarget.o(.data) for __stdout
printfb.o(i.__0fprintf$bare) refers to printfb.o(i._printf_core) for _printf_core
printfb.o(i.__0fprintf$bare) refers to retarget.o(i.fputc) for fputc
printfb.o(i.__0printf$bare) refers to printfb.o(i._printf_core) for _printf_core
@ -509,6 +506,7 @@ Removing Unused input sections from the image.
Removing ens1_uart.o(i.UART_TX_FIFO_EMPTY), (16 bytes).
Removing ens1_uart.o(i.UART_TX_FIFO_FULL), (18 bytes).
Removing ens1_uart.o(i.UART_TX_FIFO_LEN), (14 bytes).
Removing ens1_uart.o(i.Uart_Send), (54 bytes).
Removing ens1_gpio.o(.rev16_text), (4 bytes).
Removing ens1_gpio.o(.revsh_text), (4 bytes).
Removing ens1_gpio.o(i.GPIO_AnalogChannel_Control), (52 bytes).
@ -516,7 +514,7 @@ Removing Unused input sections from the image.
Removing ens1_gpio.o(i.GPIO_IO_Select), (172 bytes).
Removing ens1_mtp.o(.rev16_text), (4 bytes).
Removing ens1_mtp.o(.revsh_text), (4 bytes).
Removing ens1_mtp.o(i.flash_buff_write), (68 bytes).
Removing ens1_mtp.o(i.flash_buff_write), (40 bytes).
Removing ens1_mtp.o(i.flash_read), (8 bytes).
Removing ens1_mtp.o(i.flash_write_ctrl), (44 bytes).
Removing ens1_mtp.o(i.write_data), (56 bytes).
@ -560,8 +558,8 @@ Removing Unused input sections from the image.
Removing ens1_boost.o(.revsh_text), (4 bytes).
Removing ens1_boost.o(i.boost_voltage_select_11V), (20 bytes).
Removing ens1_boost.o(i.boost_voltage_select_15V), (20 bytes).
Removing ens1_boost.o(i.boost_voltage_select_26V), (20 bytes).
Removing ens1_boost.o(i.boost_voltage_select_45V), (20 bytes).
Removing ens1_boost.o(i.boost_voltage_select_55V), (20 bytes).
Removing ens1_wavegen.o(.rev16_text), (4 bytes).
Removing ens1_wavegen.o(.revsh_text), (4 bytes).
Removing ens1_wavegen.o(i.EMS_UpdateIntensity), (12 bytes).
@ -572,7 +570,7 @@ Removing Unused input sections from the image.
Removing dfixul.o(.text), (64 bytes).
Removing cdcmple.o(.text), (40 bytes).
81 unused section(s) (total 2028 bytes) removed from the image.
82 unused section(s) (total 2054 bytes) removed from the image.
==============================================================================
@ -585,64 +583,61 @@ Image Symbol Table
../clib/microlib/division.c 0x00000000 Number 0 uldiv.o ABSOLUTE
../clib/microlib/division.c 0x00000000 Number 0 uidiv.o ABSOLUTE
../clib/microlib/errno.c 0x00000000 Number 0 errno.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry8a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry11b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry11a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry2.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry9b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry5.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry7a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry7b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry8a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry8b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry10a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry2.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry9b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry11a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry9a.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry11b.o ABSOLUTE
../clib/microlib/init/entry.s 0x00000000 Number 0 entry.o ABSOLUTE
../clib/microlib/longlong.c 0x00000000 Number 0 llsshr.o ABSOLUTE
../clib/microlib/longlong.c 0x00000000 Number 0 llshl.o ABSOLUTE
../clib/microlib/longlong.c 0x00000000 Number 0 llushr.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 malloc.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 mallocra.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 malloca.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 mallocr.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 malloc.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 malloca.o ABSOLUTE
../clib/microlib/malloc/malloc.c 0x00000000 Number 0 mallocra.o ABSOLUTE
../clib/microlib/malloc/mvars.c 0x00000000 Number 0 mvars.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf5.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printfa.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf8.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf6.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf4.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf3.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf7.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf2.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf5.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf1.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf0.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printfb.o ABSOLUTE
../clib/microlib/printf/stubs.s 0x00000000 Number 0 stubs.o ABSOLUTE
../clib/microlib/stdio/puts.c 0x00000000 Number 0 puts_e.o ABSOLUTE
../clib/microlib/stdio/puts.c 0x00000000 Number 0 puts.o ABSOLUTE
../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpyb.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf6.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf3.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf7.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printf8.o ABSOLUTE
../clib/microlib/printf/printf.c 0x00000000 Number 0 printfa.o ABSOLUTE
../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpya.o ABSOLUTE
../clib/microlib/string/memcpy.c 0x00000000 Number 0 memcpyb.o ABSOLUTE
../clib/microlib/string/memset.c 0x00000000 Number 0 memseta.o ABSOLUTE
../clib/microlib/stubs.s 0x00000000 Number 0 iusefp.o ABSOLUTE
../clib/microlib/stubs.s 0x00000000 Number 0 useno.o ABSOLUTE
../clib/microlib/stubs.s 0x00000000 Number 0 iusefp.o ABSOLUTE
../fplib/microlib/fpadd.c 0x00000000 Number 0 dadd.o ABSOLUTE
../fplib/microlib/fpdiv.c 0x00000000 Number 0 ddiv.o ABSOLUTE
../fplib/microlib/fpepilogue.c 0x00000000 Number 0 depilogue.o ABSOLUTE
../fplib/microlib/fpfix.c 0x00000000 Number 0 dfixul.o ABSOLUTE
../fplib/microlib/fpfix.c 0x00000000 Number 0 dfixui.o ABSOLUTE
../fplib/microlib/fpflt.c 0x00000000 Number 0 dfltui.o ABSOLUTE
../fplib/microlib/fpfix.c 0x00000000 Number 0 dfixul.o ABSOLUTE
../fplib/microlib/fpflt.c 0x00000000 Number 0 dflti.o ABSOLUTE
../fplib/microlib/fpflt.c 0x00000000 Number 0 dfltui.o ABSOLUTE
../fplib/microlib/fpmul.c 0x00000000 Number 0 dmul.o ABSOLUTE
../fplib/microlib/fpscalb.c 0x00000000 Number 0 dscalb.o ABSOLUTE
../fplib/microlib/fpsqrt.c 0x00000000 Number 0 dsqrt.o ABSOLUTE
../mathlib/dunder.c 0x00000000 Number 0 dunder.o ABSOLUTE
../mathlib/fpclassify.c 0x00000000 Number 0 fpclassify.o ABSOLUTE
../mathlib/poly.c 0x00000000 Number 0 poly.o ABSOLUTE
../mathlib/pow.c 0x00000000 Number 0 pow.o ABSOLUTE
../mathlib/pow.c 0x00000000 Number 0 pow_x.o ABSOLUTE
../mathlib/pow.c 0x00000000 Number 0 pow.o ABSOLUTE
../mathlib/qnan.c 0x00000000 Number 0 qnan.o ABSOLUTE
../mathlib/sqrt.c 0x00000000 Number 0 sqrt_x.o ABSOLUTE
../mathlib/sqrt.c 0x00000000 Number 0 sqrt.o ABSOLUTE
../mathlib/sqrt.c 0x00000000 Number 0 sqrt_x.o ABSOLUTE
CORE\ARM\startup_CMSDK_CM0.s 0x00000000 Number 0 startup_cmsdk_cm0.o ABSOLUTE
CORE\\system_CMSDK_CM0.c 0x00000000 Number 0 system_cmsdk_cm0.o ABSOLUTE
CORE\system_CMSDK_CM0.c 0x00000000 Number 0 system_cmsdk_cm0.o ABSOLUTE
@ -689,8 +684,8 @@ Image Symbol Table
.text 0x1000027c Section 0 dfltui.o(.text)
.text 0x10000298 Section 0 dfixui.o(.text)
.text 0x100002d4 Section 0 llushr.o(.text)
.text 0x100002f6 Section 0 depilogue.o(.text)
.text 0x100002f6 Section 0 iusefp.o(.text)
.text 0x100002f6 Section 0 depilogue.o(.text)
.text 0x100003b4 Section 0 dadd.o(.text)
.text 0x10000518 Section 0 dmul.o(.text)
.text 0x100005e8 Section 0 dscalb.o(.text)
@ -704,95 +699,99 @@ Image Symbol Table
i.ClockInitSet 0x1000077c Section 0 ens1_clock.o(i.ClockInitSet)
i.EMS_Configure 0x100008e0 Section 0 ens1_wavegen.o(i.EMS_Configure)
i.EMS_Process 0x100008f8 Section 0 ens1_wavegen.o(i.EMS_Process)
i.EMS_Start 0x10000960 Section 0 ens1_wavegen.o(i.EMS_Start)
i.EMS_Stop 0x10000988 Section 0 ens1_wavegen.o(i.EMS_Stop)
i.GPIO_AltFunction 0x100009c8 Section 0 ens1_gpio.o(i.GPIO_AltFunction)
i.GPIO_GetOutputValue 0x10000a24 Section 0 ens1_gpio.o(i.GPIO_GetOutputValue)
i.GPIO_IO_Init 0x10000a3c Section 0 ens1_gpio.o(i.GPIO_IO_Init)
i.GPIO_Output 0x10000b98 Section 0 ens1_gpio.o(i.GPIO_Output)
i.GPIO_Overturn 0x10000bc0 Section 0 ens1_gpio.o(i.GPIO_Overturn)
i.GPIO_ResetOutput 0x10000be8 Section 0 ens1_gpio.o(i.GPIO_ResetOutput)
i.GPIO_SetOutput 0x10000bfc Section 0 ens1_gpio.o(i.GPIO_SetOutput)
i.MTP_init 0x10000c10 Section 0 ens1_mtp.o(i.MTP_init)
i.NVIC_ClearPendingIRQ 0x10000c14 Section 0 ens1_uart.o(i.NVIC_ClearPendingIRQ)
NVIC_ClearPendingIRQ 0x10000c15 Thumb Code 14 ens1_uart.o(i.NVIC_ClearPendingIRQ)
i.NVIC_ClearPendingIRQ 0x10000c28 Section 0 ens1_timer.o(i.NVIC_ClearPendingIRQ)
NVIC_ClearPendingIRQ 0x10000c29 Thumb Code 14 ens1_timer.o(i.NVIC_ClearPendingIRQ)
i.NVIC_DisableIRQ 0x10000c3c Section 0 ens1_uart.o(i.NVIC_DisableIRQ)
NVIC_DisableIRQ 0x10000c3d Thumb Code 14 ens1_uart.o(i.NVIC_DisableIRQ)
i.NVIC_DisableIRQ 0x10000c50 Section 0 ens1_timer.o(i.NVIC_DisableIRQ)
NVIC_DisableIRQ 0x10000c51 Thumb Code 14 ens1_timer.o(i.NVIC_DisableIRQ)
i.NVIC_EnableIRQ 0x10000c64 Section 0 ens1_uart.o(i.NVIC_EnableIRQ)
NVIC_EnableIRQ 0x10000c65 Thumb Code 14 ens1_uart.o(i.NVIC_EnableIRQ)
i.NVIC_EnableIRQ 0x10000c78 Section 0 ens1_timer.o(i.NVIC_EnableIRQ)
NVIC_EnableIRQ 0x10000c79 Thumb Code 14 ens1_timer.o(i.NVIC_EnableIRQ)
i.PCLK_Enable 0x10000c8c Section 0 ens1_clock.o(i.PCLK_Enable)
i.SystemInit 0x10000ca4 Section 0 system_cmsdk_cm0.o(i.SystemInit)
i.TIMER0_Handler 0x10000cb4 Section 0 ens1_timer.o(i.TIMER0_Handler)
i.TIMER0_Init 0x10000cd4 Section 0 ens1_timer.o(i.TIMER0_Init)
i.TIMER1_Handler 0x10000d68 Section 0 ens1_timer.o(i.TIMER1_Handler)
i.Time_Manager_GetFlags 0x10000d84 Section 0 ens1_timer.o(i.Time_Manager_GetFlags)
i.Time_Manager_Init 0x10000d8c Section 0 ens1_timer.o(i.Time_Manager_Init)
i.Time_Manager_Process 0x10000da8 Section 0 ens1_timer.o(i.Time_Manager_Process)
i.UART0_Handler 0x10000e60 Section 0 ens1_uart.o(i.UART0_Handler)
i.UART1_Handler 0x10000ecc Section 0 ens1_uart.o(i.UART1_Handler)
i.UARTLine_THREmpty 0x10000f2c Section 0 ens1_uart.o(i.UARTLine_THREmpty)
i.UART_INT_TYPE 0x10000f36 Section 0 ens1_uart.o(i.UART_INT_TYPE)
i.UART_ITConfig 0x10000f40 Section 0 ens1_uart.o(i.UART_ITConfig)
i.UART_Init 0x10000f98 Section 0 ens1_uart.o(i.UART_Init)
i.UartPutc 0x10001044 Section 0 ens1_uart.o(i.UartPutc)
i.WRITE_UART_THRBuff 0x10001062 Section 0 ens1_uart.o(i.WRITE_UART_THRBuff)
i.__0printf$1 0x10001068 Section 0 printf1.o(i.__0printf$1)
i.__ARM_clz 0x10001088 Section 0 depilogue.o(i.__ARM_clz)
i.__ARM_fpclassify 0x100010b8 Section 0 fpclassify.o(i.__ARM_fpclassify)
i.__kernel_poly 0x100010e4 Section 0 poly.o(i.__kernel_poly)
i.__mathlib_dbl_divzero 0x10001190 Section 0 dunder.o(i.__mathlib_dbl_divzero)
i.__mathlib_dbl_infnan2 0x100011a4 Section 0 dunder.o(i.__mathlib_dbl_infnan2)
i.__mathlib_dbl_invalid 0x100011ac Section 0 dunder.o(i.__mathlib_dbl_invalid)
i.__mathlib_dbl_overflow 0x100011bc Section 0 dunder.o(i.__mathlib_dbl_overflow)
i.__mathlib_dbl_underflow 0x100011d0 Section 0 dunder.o(i.__mathlib_dbl_underflow)
i.__scatterload_copy 0x100011e4 Section 14 handlers.o(i.__scatterload_copy)
i.__scatterload_null 0x100011f2 Section 2 handlers.o(i.__scatterload_null)
i.__scatterload_zeroinit 0x100011f4 Section 14 handlers.o(i.__scatterload_zeroinit)
i.__set_errno 0x10001204 Section 0 errno.o(i.__set_errno)
i._printf_core 0x10001210 Section 0 printf1.o(i._printf_core)
_printf_core 0x10001211 Thumb Code 332 printf1.o(i._printf_core)
i.boost_voltage_select_26V 0x10001360 Section 0 ens1_boost.o(i.boost_voltage_select_26V)
i.fputc 0x10001374 Section 0 retarget.o(i.fputc)
i.main 0x10001388 Section 0 mian.o(i.main)
i.pow 0x1000147c Section 0 pow.o(i.pow)
i.puts 0x10001e78 Section 0 puts.o(i.puts)
i.sqrt 0x10001e98 Section 0 sqrt.o(i.sqrt)
i.wavegen_Init 0x10001ee0 Section 0 ens1_wavegen.o(i.wavegen_Init)
i.wavegen_Start 0x10001f44 Section 0 ens1_wavegen.o(i.wavegen_Start)
i.wavegen_Stop 0x10001f5c Section 0 ens1_wavegen.o(i.wavegen_Stop)
i.wavegen_driverA_sine_test 0x10001f74 Section 0 ens1_wavegen.o(i.wavegen_driverA_sine_test)
.constdata 0x1000201c Section 10 mian.o(.constdata)
.constdata 0x10002028 Section 136 pow.o(.constdata)
bp 0x10002028 Data 16 pow.o(.constdata)
dp_h 0x10002038 Data 16 pow.o(.constdata)
dp_l 0x10002048 Data 16 pow.o(.constdata)
L 0x10002058 Data 48 pow.o(.constdata)
P 0x10002088 Data 40 pow.o(.constdata)
.constdata 0x100020b0 Section 8 qnan.o(.constdata)
i.EMS_Process_Ramp 0x10000964 Section 0 ens1_wavegen.o(i.EMS_Process_Ramp)
i.EMS_Start 0x10000a94 Section 0 ens1_wavegen.o(i.EMS_Start)
i.EMS_Stop 0x10000a9c Section 0 ens1_wavegen.o(i.EMS_Stop)
i.GPIO_AltFunction 0x10000adc Section 0 ens1_gpio.o(i.GPIO_AltFunction)
i.GPIO_GetOutputValue 0x10000b38 Section 0 ens1_gpio.o(i.GPIO_GetOutputValue)
i.GPIO_IO_Init 0x10000b50 Section 0 ens1_gpio.o(i.GPIO_IO_Init)
i.GPIO_Output 0x10000cac Section 0 ens1_gpio.o(i.GPIO_Output)
i.GPIO_Overturn 0x10000cd4 Section 0 ens1_gpio.o(i.GPIO_Overturn)
i.GPIO_ResetOutput 0x10000cfc Section 0 ens1_gpio.o(i.GPIO_ResetOutput)
i.GPIO_SetOutput 0x10000d10 Section 0 ens1_gpio.o(i.GPIO_SetOutput)
i.MTP_init 0x10000d24 Section 0 ens1_mtp.o(i.MTP_init)
i.NVIC_ClearPendingIRQ 0x10000d28 Section 0 ens1_uart.o(i.NVIC_ClearPendingIRQ)
NVIC_ClearPendingIRQ 0x10000d29 Thumb Code 14 ens1_uart.o(i.NVIC_ClearPendingIRQ)
i.NVIC_ClearPendingIRQ 0x10000d3c Section 0 ens1_timer.o(i.NVIC_ClearPendingIRQ)
NVIC_ClearPendingIRQ 0x10000d3d Thumb Code 14 ens1_timer.o(i.NVIC_ClearPendingIRQ)
i.NVIC_DisableIRQ 0x10000d50 Section 0 ens1_uart.o(i.NVIC_DisableIRQ)
NVIC_DisableIRQ 0x10000d51 Thumb Code 14 ens1_uart.o(i.NVIC_DisableIRQ)
i.NVIC_DisableIRQ 0x10000d64 Section 0 ens1_timer.o(i.NVIC_DisableIRQ)
NVIC_DisableIRQ 0x10000d65 Thumb Code 14 ens1_timer.o(i.NVIC_DisableIRQ)
i.NVIC_EnableIRQ 0x10000d78 Section 0 ens1_uart.o(i.NVIC_EnableIRQ)
NVIC_EnableIRQ 0x10000d79 Thumb Code 14 ens1_uart.o(i.NVIC_EnableIRQ)
i.NVIC_EnableIRQ 0x10000d8c Section 0 ens1_timer.o(i.NVIC_EnableIRQ)
NVIC_EnableIRQ 0x10000d8d Thumb Code 14 ens1_timer.o(i.NVIC_EnableIRQ)
i.PCLK_Enable 0x10000da0 Section 0 ens1_clock.o(i.PCLK_Enable)
i.SystemInit 0x10000db8 Section 0 system_cmsdk_cm0.o(i.SystemInit)
i.TIMER0_Handler 0x10000dc8 Section 0 ens1_timer.o(i.TIMER0_Handler)
i.TIMER0_Init 0x10000de8 Section 0 ens1_timer.o(i.TIMER0_Init)
i.TIMER1_Handler 0x10000e28 Section 0 ens1_timer.o(i.TIMER1_Handler)
i.Time_Manager_GetFlags 0x10000e44 Section 0 ens1_timer.o(i.Time_Manager_GetFlags)
i.Time_Manager_Init 0x10000e4c Section 0 ens1_timer.o(i.Time_Manager_Init)
i.Time_Manager_Process 0x10000e68 Section 0 ens1_timer.o(i.Time_Manager_Process)
i.UART0_Handler 0x10000f20 Section 0 ens1_uart.o(i.UART0_Handler)
i.UART1_Handler 0x10000f8c Section 0 ens1_uart.o(i.UART1_Handler)
i.UARTLine_THREmpty 0x10000fec Section 0 ens1_uart.o(i.UARTLine_THREmpty)
i.UART_INT_TYPE 0x10000ff6 Section 0 ens1_uart.o(i.UART_INT_TYPE)
i.UART_ITConfig 0x10001000 Section 0 ens1_uart.o(i.UART_ITConfig)
i.UART_Init 0x10001058 Section 0 ens1_uart.o(i.UART_Init)
i.UartPutc 0x10001158 Section 0 ens1_uart.o(i.UartPutc)
i.WRITE_UART_THRBuff 0x10001176 Section 0 ens1_uart.o(i.WRITE_UART_THRBuff)
i.__0printf$bare 0x1000117c Section 0 printfb.o(i.__0printf$bare)
i.__ARM_clz 0x10001190 Section 0 depilogue.o(i.__ARM_clz)
i.__ARM_fpclassify 0x100011c0 Section 0 fpclassify.o(i.__ARM_fpclassify)
i.__kernel_poly 0x100011ec Section 0 poly.o(i.__kernel_poly)
i.__mathlib_dbl_divzero 0x10001298 Section 0 dunder.o(i.__mathlib_dbl_divzero)
i.__mathlib_dbl_infnan2 0x100012ac Section 0 dunder.o(i.__mathlib_dbl_infnan2)
i.__mathlib_dbl_invalid 0x100012b4 Section 0 dunder.o(i.__mathlib_dbl_invalid)
i.__mathlib_dbl_overflow 0x100012c4 Section 0 dunder.o(i.__mathlib_dbl_overflow)
i.__mathlib_dbl_underflow 0x100012d8 Section 0 dunder.o(i.__mathlib_dbl_underflow)
i.__scatterload_copy 0x100012ec Section 14 handlers.o(i.__scatterload_copy)
i.__scatterload_null 0x100012fa Section 2 handlers.o(i.__scatterload_null)
i.__scatterload_zeroinit 0x100012fc Section 14 handlers.o(i.__scatterload_zeroinit)
i.__set_errno 0x1000130c Section 0 errno.o(i.__set_errno)
i._printf_core 0x10001318 Section 0 printfb.o(i._printf_core)
_printf_core 0x10001319 Thumb Code 30 printfb.o(i._printf_core)
i.boost_voltage_select_55V 0x10001338 Section 0 ens1_boost.o(i.boost_voltage_select_55V)
i.fputc 0x1000134c Section 0 retarget.o(i.fputc)
i.main 0x10001360 Section 0 mian.o(i.main)
i.pow 0x10001458 Section 0 pow.o(i.pow)
i.sqrt 0x10001e54 Section 0 sqrt.o(i.sqrt)
i.wavegen_Init 0x10001e9c Section 0 ens1_wavegen.o(i.wavegen_Init)
i.wavegen_Start 0x10001ec4 Section 0 ens1_wavegen.o(i.wavegen_Start)
i.wavegen_Stop 0x10001f14 Section 0 ens1_wavegen.o(i.wavegen_Stop)
i.wavegen_driverA_sine_test 0x10001f2c Section 0 ens1_wavegen.o(i.wavegen_driverA_sine_test)
.constdata 0x10001fd4 Section 14 mian.o(.constdata)
.constdata 0x10001fe8 Section 136 pow.o(.constdata)
bp 0x10001fe8 Data 16 pow.o(.constdata)
dp_h 0x10001ff8 Data 16 pow.o(.constdata)
dp_l 0x10002008 Data 16 pow.o(.constdata)
L 0x10002018 Data 48 pow.o(.constdata)
P 0x10002048 Data 40 pow.o(.constdata)
.constdata 0x10002070 Section 8 qnan.o(.constdata)
.data 0x20000000 Section 2 mian.o(.data)
ems_control_count 0x20000000 Data 1 mian.o(.data)
ems_state 0x20000001 Data 1 mian.o(.data)
.data 0x20000004 Section 22 ens1_uart.o(.data)
.data 0x2000001c Section 14 ens1_clock.o(.data)
.data 0x2000002c Section 8 retarget.o(.data)
.data 0x20000034 Section 28 ens1_timer.o(.data)
g_time_flags 0x20000034 Data 6 ens1_timer.o(.data)
g_time_counters 0x2000003a Data 8 ens1_timer.o(.data)
.data 0x20000050 Section 8 ens1_wavegen.o(.data)
g_ems_running 0x20000050 Data 1 ens1_wavegen.o(.data)
g_ems_count 0x20000054 Data 4 ens1_wavegen.o(.data)
.data 0x20000058 Section 8 system_cmsdk_cm0.o(.data)
.data 0x20000060 Section 4 errno.o(.data)
_errno 0x20000060 Data 4 errno.o(.data)
.bss 0x20000064 Section 10 ens1_wavegen.o(.bss)
g_ems_config 0x20000064 Data 10 ens1_wavegen.o(.bss)
STACK 0x20000070 Section 512 startup_cmsdk_cm0.o(STACK)
.data 0x20000004 Section 30 ens1_uart.o(.data)
.data 0x20000024 Section 14 ens1_clock.o(.data)
.data 0x20000034 Section 8 retarget.o(.data)
.data 0x2000003c Section 28 ens1_timer.o(.data)
g_time_flags 0x2000003c Data 6 ens1_timer.o(.data)
g_time_counters 0x20000042 Data 8 ens1_timer.o(.data)
.data 0x20000058 Section 20 ens1_wavegen.o(.data)
g_ems_running 0x20000058 Data 1 ens1_wavegen.o(.data)
g_ems_count 0x2000005c Data 4 ens1_wavegen.o(.data)
g_current_intensity 0x20000060 Data 2 ens1_wavegen.o(.data)
g_ramp_phase 0x20000062 Data 1 ens1_wavegen.o(.data)
g_wave_counter 0x20000064 Data 4 ens1_wavegen.o(.data)
g_ramp_step_counter 0x20000068 Data 4 ens1_wavegen.o(.data)
.data 0x2000006c Section 8 system_cmsdk_cm0.o(.data)
.data 0x20000074 Section 4 errno.o(.data)
_errno 0x20000074 Data 4 errno.o(.data)
.bss 0x20000078 Section 14 ens1_wavegen.o(.bss)
g_ems_config 0x20000078 Data 14 ens1_wavegen.o(.bss)
STACK 0x20000088 Section 512 startup_cmsdk_cm0.o(STACK)
Global Symbols
@ -808,47 +807,6 @@ Image Symbol Table
__use_no_semihosting 0x00000000 Number 0 useno.o ABSOLUTE
__use_no_semihosting_swi 0x00000000 Number 0 useno.o ABSOLUTE
__use_no_signal_handling 0x00000000 Number 0 useno.o ABSOLUTE
_printf_a 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_c 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_charcount 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_d 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_e 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_f 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_flags 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_fp_dec 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_fp_hex 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_g 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_i 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_int_dec 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_l 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_lc 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_ll 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_lld 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_lli 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_llo 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_llu 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_llx 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_longlong_dec 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_longlong_hex 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_longlong_oct 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_ls 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_mbtowc 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_n 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_o 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_p 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_percent 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_pre_padding 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_return_value 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_s 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_sizespec 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_str 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_truncate_signed 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_truncate_unsigned 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_u 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_wc 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_wctomb 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_widthprec 0x00000000 Number 0 stubs.o ABSOLUTE
_printf_x 0x00000000 Number 0 stubs.o ABSOLUTE
__cpp_initialize__aeabi_ - Undefined Weak Reference
__cxa_finalize - Undefined Weak Reference
__decompress - Undefined Weak Reference
@ -933,74 +891,74 @@ Image Symbol Table
ClockInit 0x10000765 Thumb Code 14 ens1_clock.o(i.ClockInit)
ClockInitSet 0x1000077d Thumb Code 348 ens1_clock.o(i.ClockInitSet)
EMS_Configure 0x100008e1 Thumb Code 20 ens1_wavegen.o(i.EMS_Configure)
EMS_Process 0x100008f9 Thumb Code 86 ens1_wavegen.o(i.EMS_Process)
EMS_Start 0x10000961 Thumb Code 14 ens1_wavegen.o(i.EMS_Start)
EMS_Stop 0x10000989 Thumb Code 26 ens1_wavegen.o(i.EMS_Stop)
GPIO_AltFunction 0x100009c9 Thumb Code 86 ens1_gpio.o(i.GPIO_AltFunction)
GPIO_GetOutputValue 0x10000a25 Thumb Code 18 ens1_gpio.o(i.GPIO_GetOutputValue)
GPIO_IO_Init 0x10000a3d Thumb Code 342 ens1_gpio.o(i.GPIO_IO_Init)
GPIO_Output 0x10000b99 Thumb Code 36 ens1_gpio.o(i.GPIO_Output)
GPIO_Overturn 0x10000bc1 Thumb Code 40 ens1_gpio.o(i.GPIO_Overturn)
GPIO_ResetOutput 0x10000be9 Thumb Code 16 ens1_gpio.o(i.GPIO_ResetOutput)
GPIO_SetOutput 0x10000bfd Thumb Code 16 ens1_gpio.o(i.GPIO_SetOutput)
MTP_init 0x10000c11 Thumb Code 4 ens1_mtp.o(i.MTP_init)
PCLK_Enable 0x10000c8d Thumb Code 20 ens1_clock.o(i.PCLK_Enable)
SystemInit 0x10000ca5 Thumb Code 8 system_cmsdk_cm0.o(i.SystemInit)
TIMER0_Handler 0x10000cb5 Thumb Code 24 ens1_timer.o(i.TIMER0_Handler)
TIMER0_Init 0x10000cd5 Thumb Code 72 ens1_timer.o(i.TIMER0_Init)
TIMER1_Handler 0x10000d69 Thumb Code 18 ens1_timer.o(i.TIMER1_Handler)
Time_Manager_GetFlags 0x10000d85 Thumb Code 4 ens1_timer.o(i.Time_Manager_GetFlags)
Time_Manager_Init 0x10000d8d Thumb Code 20 ens1_timer.o(i.Time_Manager_Init)
Time_Manager_Process 0x10000da9 Thumb Code 174 ens1_timer.o(i.Time_Manager_Process)
UART0_Handler 0x10000e61 Thumb Code 108 ens1_uart.o(i.UART0_Handler)
UART1_Handler 0x10000ecd Thumb Code 92 ens1_uart.o(i.UART1_Handler)
UARTLine_THREmpty 0x10000f2d Thumb Code 10 ens1_uart.o(i.UARTLine_THREmpty)
UART_INT_TYPE 0x10000f37 Thumb Code 10 ens1_uart.o(i.UART_INT_TYPE)
UART_ITConfig 0x10000f41 Thumb Code 84 ens1_uart.o(i.UART_ITConfig)
UART_Init 0x10000f99 Thumb Code 164 ens1_uart.o(i.UART_Init)
UartPutc 0x10001045 Thumb Code 30 ens1_uart.o(i.UartPutc)
WRITE_UART_THRBuff 0x10001063 Thumb Code 4 ens1_uart.o(i.WRITE_UART_THRBuff)
__0printf$1 0x10001069 Thumb Code 24 printf1.o(i.__0printf$1)
__1printf$1 0x10001069 Thumb Code 0 printf1.o(i.__0printf$1)
__2printf 0x10001069 Thumb Code 0 printf1.o(i.__0printf$1)
__ARM_clz 0x10001089 Thumb Code 46 depilogue.o(i.__ARM_clz)
__ARM_fpclassify 0x100010b9 Thumb Code 40 fpclassify.o(i.__ARM_fpclassify)
__kernel_poly 0x100010e5 Thumb Code 172 poly.o(i.__kernel_poly)
__mathlib_dbl_divzero 0x10001191 Thumb Code 16 dunder.o(i.__mathlib_dbl_divzero)
__mathlib_dbl_infnan2 0x100011a5 Thumb Code 8 dunder.o(i.__mathlib_dbl_infnan2)
__mathlib_dbl_invalid 0x100011ad Thumb Code 16 dunder.o(i.__mathlib_dbl_invalid)
__mathlib_dbl_overflow 0x100011bd Thumb Code 16 dunder.o(i.__mathlib_dbl_overflow)
__mathlib_dbl_underflow 0x100011d1 Thumb Code 14 dunder.o(i.__mathlib_dbl_underflow)
__scatterload_copy 0x100011e5 Thumb Code 14 handlers.o(i.__scatterload_copy)
__scatterload_null 0x100011f3 Thumb Code 2 handlers.o(i.__scatterload_null)
__scatterload_zeroinit 0x100011f5 Thumb Code 14 handlers.o(i.__scatterload_zeroinit)
__set_errno 0x10001205 Thumb Code 6 errno.o(i.__set_errno)
boost_voltage_select_26V 0x10001361 Thumb Code 12 ens1_boost.o(i.boost_voltage_select_26V)
fputc 0x10001375 Thumb Code 16 retarget.o(i.fputc)
main 0x10001389 Thumb Code 220 mian.o(i.main)
pow 0x1000147d Thumb Code 2548 pow.o(i.pow)
puts 0x10001e79 Thumb Code 28 puts.o(i.puts)
sqrt 0x10001e99 Thumb Code 66 sqrt.o(i.sqrt)
wavegen_Init 0x10001ee1 Thumb Code 32 ens1_wavegen.o(i.wavegen_Init)
wavegen_Start 0x10001f45 Thumb Code 14 ens1_wavegen.o(i.wavegen_Start)
wavegen_Stop 0x10001f5d Thumb Code 22 ens1_wavegen.o(i.wavegen_Stop)
wavegen_driverA_sine_test 0x10001f75 Thumb Code 98 ens1_wavegen.o(i.wavegen_driverA_sine_test)
__mathlib_zero 0x100020b0 Data 8 qnan.o(.constdata)
Region$$Table$$Base 0x100020b8 Number 0 anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x100020d8 Number 0 anon$$obj.o(Region$$Table)
EMS_Process 0x100008f9 Thumb Code 92 ens1_wavegen.o(i.EMS_Process)
EMS_Process_Ramp 0x10000965 Thumb Code 278 ens1_wavegen.o(i.EMS_Process_Ramp)
EMS_Start 0x10000a95 Thumb Code 8 ens1_wavegen.o(i.EMS_Start)
EMS_Stop 0x10000a9d Thumb Code 36 ens1_wavegen.o(i.EMS_Stop)
GPIO_AltFunction 0x10000add Thumb Code 86 ens1_gpio.o(i.GPIO_AltFunction)
GPIO_GetOutputValue 0x10000b39 Thumb Code 18 ens1_gpio.o(i.GPIO_GetOutputValue)
GPIO_IO_Init 0x10000b51 Thumb Code 342 ens1_gpio.o(i.GPIO_IO_Init)
GPIO_Output 0x10000cad Thumb Code 36 ens1_gpio.o(i.GPIO_Output)
GPIO_Overturn 0x10000cd5 Thumb Code 40 ens1_gpio.o(i.GPIO_Overturn)
GPIO_ResetOutput 0x10000cfd Thumb Code 16 ens1_gpio.o(i.GPIO_ResetOutput)
GPIO_SetOutput 0x10000d11 Thumb Code 16 ens1_gpio.o(i.GPIO_SetOutput)
MTP_init 0x10000d25 Thumb Code 4 ens1_mtp.o(i.MTP_init)
PCLK_Enable 0x10000da1 Thumb Code 20 ens1_clock.o(i.PCLK_Enable)
SystemInit 0x10000db9 Thumb Code 8 system_cmsdk_cm0.o(i.SystemInit)
TIMER0_Handler 0x10000dc9 Thumb Code 24 ens1_timer.o(i.TIMER0_Handler)
TIMER0_Init 0x10000de9 Thumb Code 56 ens1_timer.o(i.TIMER0_Init)
TIMER1_Handler 0x10000e29 Thumb Code 18 ens1_timer.o(i.TIMER1_Handler)
Time_Manager_GetFlags 0x10000e45 Thumb Code 4 ens1_timer.o(i.Time_Manager_GetFlags)
Time_Manager_Init 0x10000e4d Thumb Code 20 ens1_timer.o(i.Time_Manager_Init)
Time_Manager_Process 0x10000e69 Thumb Code 174 ens1_timer.o(i.Time_Manager_Process)
UART0_Handler 0x10000f21 Thumb Code 108 ens1_uart.o(i.UART0_Handler)
UART1_Handler 0x10000f8d Thumb Code 92 ens1_uart.o(i.UART1_Handler)
UARTLine_THREmpty 0x10000fed Thumb Code 10 ens1_uart.o(i.UARTLine_THREmpty)
UART_INT_TYPE 0x10000ff7 Thumb Code 10 ens1_uart.o(i.UART_INT_TYPE)
UART_ITConfig 0x10001001 Thumb Code 84 ens1_uart.o(i.UART_ITConfig)
UART_Init 0x10001059 Thumb Code 248 ens1_uart.o(i.UART_Init)
UartPutc 0x10001159 Thumb Code 30 ens1_uart.o(i.UartPutc)
WRITE_UART_THRBuff 0x10001177 Thumb Code 4 ens1_uart.o(i.WRITE_UART_THRBuff)
__0printf$bare 0x1000117d Thumb Code 12 printfb.o(i.__0printf$bare)
__1printf$bare 0x1000117d Thumb Code 0 printfb.o(i.__0printf$bare)
__2printf 0x1000117d Thumb Code 0 printfb.o(i.__0printf$bare)
__ARM_clz 0x10001191 Thumb Code 46 depilogue.o(i.__ARM_clz)
__ARM_fpclassify 0x100011c1 Thumb Code 40 fpclassify.o(i.__ARM_fpclassify)
__kernel_poly 0x100011ed Thumb Code 172 poly.o(i.__kernel_poly)
__mathlib_dbl_divzero 0x10001299 Thumb Code 16 dunder.o(i.__mathlib_dbl_divzero)
__mathlib_dbl_infnan2 0x100012ad Thumb Code 8 dunder.o(i.__mathlib_dbl_infnan2)
__mathlib_dbl_invalid 0x100012b5 Thumb Code 16 dunder.o(i.__mathlib_dbl_invalid)
__mathlib_dbl_overflow 0x100012c5 Thumb Code 16 dunder.o(i.__mathlib_dbl_overflow)
__mathlib_dbl_underflow 0x100012d9 Thumb Code 14 dunder.o(i.__mathlib_dbl_underflow)
__scatterload_copy 0x100012ed Thumb Code 14 handlers.o(i.__scatterload_copy)
__scatterload_null 0x100012fb Thumb Code 2 handlers.o(i.__scatterload_null)
__scatterload_zeroinit 0x100012fd Thumb Code 14 handlers.o(i.__scatterload_zeroinit)
__set_errno 0x1000130d Thumb Code 6 errno.o(i.__set_errno)
boost_voltage_select_55V 0x10001339 Thumb Code 12 ens1_boost.o(i.boost_voltage_select_55V)
fputc 0x1000134d Thumb Code 16 retarget.o(i.fputc)
main 0x10001361 Thumb Code 222 mian.o(i.main)
pow 0x10001459 Thumb Code 2548 pow.o(i.pow)
sqrt 0x10001e55 Thumb Code 66 sqrt.o(i.sqrt)
wavegen_Init 0x10001e9d Thumb Code 26 ens1_wavegen.o(i.wavegen_Init)
wavegen_Start 0x10001ec5 Thumb Code 50 ens1_wavegen.o(i.wavegen_Start)
wavegen_Stop 0x10001f15 Thumb Code 22 ens1_wavegen.o(i.wavegen_Stop)
wavegen_driverA_sine_test 0x10001f2d Thumb Code 98 ens1_wavegen.o(i.wavegen_driverA_sine_test)
__mathlib_zero 0x10002070 Data 8 qnan.o(.constdata)
Region$$Table$$Base 0x10002078 Number 0 anon$$obj.o(Region$$Table)
Region$$Table$$Limit 0x10002098 Number 0 anon$$obj.o(Region$$Table)
UART1_Fifo 0x20000004 Data 3 ens1_uart.o(.data)
UART1_Init 0x20000008 Data 16 ens1_uart.o(.data)
UART1_ITSet 0x20000018 Data 2 ens1_uart.o(.data)
APB_Clock_Freq 0x2000001c Data 4 ens1_clock.o(.data)
CLOCKCFG 0x20000020 Data 10 ens1_clock.o(.data)
__stdout 0x2000002c Data 4 retarget.o(.data)
__stdin 0x20000030 Data 4 retarget.o(.data)
timer0_irq_occurred 0x20000044 Data 4 ens1_timer.o(.data)
time_flag 0x20000048 Data 4 ens1_timer.o(.data)
timer1_irq_occurred 0x2000004c Data 4 ens1_timer.o(.data)
SystemFrequency 0x20000058 Data 4 system_cmsdk_cm0.o(.data)
SystemCoreClock 0x2000005c Data 4 system_cmsdk_cm0.o(.data)
__initial_sp 0x20000270 Data 0 startup_cmsdk_cm0.o(STACK)
UART1_Init 0x20000008 Data 24 ens1_uart.o(.data)
UART1_ITSet 0x20000020 Data 2 ens1_uart.o(.data)
APB_Clock_Freq 0x20000024 Data 4 ens1_clock.o(.data)
CLOCKCFG 0x20000028 Data 10 ens1_clock.o(.data)
__stdout 0x20000034 Data 4 retarget.o(.data)
__stdin 0x20000038 Data 4 retarget.o(.data)
timer0_irq_occurred 0x2000004c Data 4 ens1_timer.o(.data)
time_flag 0x20000050 Data 4 ens1_timer.o(.data)
timer1_irq_occurred 0x20000054 Data 4 ens1_timer.o(.data)
SystemFrequency 0x2000006c Data 4 system_cmsdk_cm0.o(.data)
SystemCoreClock 0x20000070 Data 4 system_cmsdk_cm0.o(.data)
__initial_sp 0x20000288 Data 0 startup_cmsdk_cm0.o(STACK)
@ -1010,132 +968,133 @@ Memory Map of the image
Image Entry point : 0x100000c1
Load Region LR_IROM1 (Base: 0x10000000, Size: 0x0000213c, Max: 0x00008000, ABSOLUTE)
Load Region LR_IROM1 (Base: 0x10000000, Size: 0x00002110, Max: 0x00008000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x10000000, Load base: 0x10000000, Size: 0x000020d8, Max: 0x00008000, ABSOLUTE)
Execution Region ER_IROM1 (Exec base: 0x10000000, Load base: 0x10000000, Size: 0x00002098, Max: 0x00008000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x10000000 0x10000000 0x000000c0 Data RO 872 RESET startup_cmsdk_cm0.o
0x100000c0 0x100000c0 0x00000000 Code RO 887 * .ARM.Collect$$$$00000000 mc_p.l(entry.o)
0x100000c0 0x100000c0 0x00000004 Code RO 1226 .ARM.Collect$$$$00000001 mc_p.l(entry2.o)
0x100000c4 0x100000c4 0x00000004 Code RO 1229 .ARM.Collect$$$$00000004 mc_p.l(entry5.o)
0x100000c8 0x100000c8 0x00000000 Code RO 1231 .ARM.Collect$$$$00000008 mc_p.l(entry7b.o)
0x100000c8 0x100000c8 0x00000000 Code RO 1233 .ARM.Collect$$$$0000000A mc_p.l(entry8b.o)
0x100000c8 0x100000c8 0x00000008 Code RO 1234 .ARM.Collect$$$$0000000B mc_p.l(entry9a.o)
0x100000d0 0x100000d0 0x00000000 Code RO 1236 .ARM.Collect$$$$0000000D mc_p.l(entry10a.o)
0x100000d0 0x100000d0 0x00000000 Code RO 1238 .ARM.Collect$$$$0000000F mc_p.l(entry11a.o)
0x100000d0 0x100000d0 0x00000004 Code RO 1227 .ARM.Collect$$$$00002712 mc_p.l(entry2.o)
0x100000d4 0x100000d4 0x0000001c Code RO 873 .text startup_cmsdk_cm0.o
0x100000f0 0x100000f0 0x0000002c Code RO 894 .text mc_p.l(uidiv.o)
0x1000011c 0x1000011c 0x00000024 Code RO 896 .text mc_p.l(memcpya.o)
0x10000140 0x10000140 0x00000024 Code RO 898 .text mc_p.l(memseta.o)
0x10000164 0x10000164 0x000000f0 Code RO 1191 .text mf_p.l(ddiv.o)
0x10000254 0x10000254 0x00000028 Code RO 1193 .text mf_p.l(dflti.o)
0x1000027c 0x1000027c 0x0000001c Code RO 1195 .text mf_p.l(dfltui.o)
0x10000298 0x10000298 0x0000003c Code RO 1197 .text mf_p.l(dfixui.o)
0x100002d4 0x100002d4 0x00000022 Code RO 1242 .text mc_p.l(llushr.o)
0x100002f6 0x100002f6 0x00000000 Code RO 1253 .text mc_p.l(iusefp.o)
0x100002f6 0x100002f6 0x000000be Code RO 1254 .text mf_p.l(depilogue.o)
0x100003b4 0x100003b4 0x00000164 Code RO 1258 .text mf_p.l(dadd.o)
0x10000518 0x10000518 0x000000d0 Code RO 1260 .text mf_p.l(dmul.o)
0x100005e8 0x100005e8 0x0000002c Code RO 1262 .text mf_p.l(dscalb.o)
0x10000614 0x10000614 0x00000028 Code RO 1266 .text mf_p.l(cdrcmple.o)
0x1000063c 0x1000063c 0x00000024 Code RO 1268 .text mc_p.l(init.o)
0x10000660 0x10000660 0x00000020 Code RO 1270 .text mc_p.l(llshl.o)
0x10000680 0x10000680 0x00000026 Code RO 1272 .text mc_p.l(llsshr.o)
0x100006a6 0x100006a6 0x000000a2 Code RO 1274 .text mf_p.l(dsqrt.o)
0x10000748 0x10000748 0x0000001a Code RO 514 i.CMSDK_timer_Init ens1_timer.o
0x10000000 0x10000000 0x000000c0 Data RO 884 RESET startup_cmsdk_cm0.o
0x100000c0 0x100000c0 0x00000000 Code RO 899 * .ARM.Collect$$$$00000000 mc_p.l(entry.o)
0x100000c0 0x100000c0 0x00000004 Code RO 1233 .ARM.Collect$$$$00000001 mc_p.l(entry2.o)
0x100000c4 0x100000c4 0x00000004 Code RO 1236 .ARM.Collect$$$$00000004 mc_p.l(entry5.o)
0x100000c8 0x100000c8 0x00000000 Code RO 1238 .ARM.Collect$$$$00000008 mc_p.l(entry7b.o)
0x100000c8 0x100000c8 0x00000000 Code RO 1240 .ARM.Collect$$$$0000000A mc_p.l(entry8b.o)
0x100000c8 0x100000c8 0x00000008 Code RO 1241 .ARM.Collect$$$$0000000B mc_p.l(entry9a.o)
0x100000d0 0x100000d0 0x00000000 Code RO 1243 .ARM.Collect$$$$0000000D mc_p.l(entry10a.o)
0x100000d0 0x100000d0 0x00000000 Code RO 1245 .ARM.Collect$$$$0000000F mc_p.l(entry11a.o)
0x100000d0 0x100000d0 0x00000004 Code RO 1234 .ARM.Collect$$$$00002712 mc_p.l(entry2.o)
0x100000d4 0x100000d4 0x0000001c Code RO 885 .text startup_cmsdk_cm0.o
0x100000f0 0x100000f0 0x0000002c Code RO 902 .text mc_p.l(uidiv.o)
0x1000011c 0x1000011c 0x00000024 Code RO 904 .text mc_p.l(memcpya.o)
0x10000140 0x10000140 0x00000024 Code RO 906 .text mc_p.l(memseta.o)
0x10000164 0x10000164 0x000000f0 Code RO 1198 .text mf_p.l(ddiv.o)
0x10000254 0x10000254 0x00000028 Code RO 1200 .text mf_p.l(dflti.o)
0x1000027c 0x1000027c 0x0000001c Code RO 1202 .text mf_p.l(dfltui.o)
0x10000298 0x10000298 0x0000003c Code RO 1204 .text mf_p.l(dfixui.o)
0x100002d4 0x100002d4 0x00000022 Code RO 1249 .text mc_p.l(llushr.o)
0x100002f6 0x100002f6 0x00000000 Code RO 1260 .text mc_p.l(iusefp.o)
0x100002f6 0x100002f6 0x000000be Code RO 1261 .text mf_p.l(depilogue.o)
0x100003b4 0x100003b4 0x00000164 Code RO 1265 .text mf_p.l(dadd.o)
0x10000518 0x10000518 0x000000d0 Code RO 1267 .text mf_p.l(dmul.o)
0x100005e8 0x100005e8 0x0000002c Code RO 1269 .text mf_p.l(dscalb.o)
0x10000614 0x10000614 0x00000028 Code RO 1273 .text mf_p.l(cdrcmple.o)
0x1000063c 0x1000063c 0x00000024 Code RO 1275 .text mc_p.l(init.o)
0x10000660 0x10000660 0x00000020 Code RO 1277 .text mc_p.l(llshl.o)
0x10000680 0x10000680 0x00000026 Code RO 1279 .text mc_p.l(llsshr.o)
0x100006a6 0x100006a6 0x000000a2 Code RO 1281 .text mf_p.l(dsqrt.o)
0x10000748 0x10000748 0x0000001a Code RO 520 i.CMSDK_timer_Init ens1_timer.o
0x10000762 0x10000762 0x00000002 PAD
0x10000764 0x10000764 0x00000018 Code RO 396 i.ClockInit ens1_clock.o
0x1000077c 0x1000077c 0x00000164 Code RO 397 i.ClockInitSet ens1_clock.o
0x100008e0 0x100008e0 0x00000018 Code RO 769 i.EMS_Configure ens1_wavegen.o
0x100008f8 0x100008f8 0x00000068 Code RO 770 i.EMS_Process ens1_wavegen.o
0x10000960 0x10000960 0x00000028 Code RO 771 i.EMS_Start ens1_wavegen.o
0x10000988 0x10000988 0x00000040 Code RO 772 i.EMS_Stop ens1_wavegen.o
0x100009c8 0x100009c8 0x0000005c Code RO 265 i.GPIO_AltFunction ens1_gpio.o
0x10000a24 0x10000a24 0x00000018 Code RO 268 i.GPIO_GetOutputValue ens1_gpio.o
0x10000a3c 0x10000a3c 0x0000015c Code RO 269 i.GPIO_IO_Init ens1_gpio.o
0x10000b98 0x10000b98 0x00000028 Code RO 271 i.GPIO_Output ens1_gpio.o
0x10000bc0 0x10000bc0 0x00000028 Code RO 272 i.GPIO_Overturn ens1_gpio.o
0x10000be8 0x10000be8 0x00000014 Code RO 273 i.GPIO_ResetOutput ens1_gpio.o
0x10000bfc 0x10000bfc 0x00000014 Code RO 274 i.GPIO_SetOutput ens1_gpio.o
0x10000c10 0x10000c10 0x00000004 Code RO 339 i.MTP_init ens1_mtp.o
0x10000c14 0x10000c14 0x00000014 Code RO 85 i.NVIC_ClearPendingIRQ ens1_uart.o
0x10000c28 0x10000c28 0x00000014 Code RO 522 i.NVIC_ClearPendingIRQ ens1_timer.o
0x10000c3c 0x10000c3c 0x00000014 Code RO 86 i.NVIC_DisableIRQ ens1_uart.o
0x10000c50 0x10000c50 0x00000014 Code RO 523 i.NVIC_DisableIRQ ens1_timer.o
0x10000c64 0x10000c64 0x00000014 Code RO 87 i.NVIC_EnableIRQ ens1_uart.o
0x10000c78 0x10000c78 0x00000014 Code RO 524 i.NVIC_EnableIRQ ens1_timer.o
0x10000c8c 0x10000c8c 0x00000018 Code RO 400 i.PCLK_Enable ens1_clock.o
0x10000ca4 0x10000ca4 0x00000010 Code RO 841 i.SystemInit system_cmsdk_cm0.o
0x10000cb4 0x10000cb4 0x00000020 Code RO 525 i.TIMER0_Handler ens1_timer.o
0x10000cd4 0x10000cd4 0x00000094 Code RO 526 i.TIMER0_Init ens1_timer.o
0x10000d68 0x10000d68 0x0000001c Code RO 527 i.TIMER1_Handler ens1_timer.o
0x10000d84 0x10000d84 0x00000008 Code RO 530 i.Time_Manager_GetFlags ens1_timer.o
0x10000d8c 0x10000d8c 0x0000001c Code RO 531 i.Time_Manager_Init ens1_timer.o
0x10000da8 0x10000da8 0x000000b8 Code RO 532 i.Time_Manager_Process ens1_timer.o
0x10000e60 0x10000e60 0x0000006c Code RO 89 i.UART0_Handler ens1_uart.o
0x10000ecc 0x10000ecc 0x00000060 Code RO 90 i.UART1_Handler ens1_uart.o
0x10000f2c 0x10000f2c 0x0000000a Code RO 92 i.UARTLine_THREmpty ens1_uart.o
0x10000f36 0x10000f36 0x0000000a Code RO 98 i.UART_INT_TYPE ens1_uart.o
0x10000f40 0x10000f40 0x00000058 Code RO 99 i.UART_ITConfig ens1_uart.o
0x10000f98 0x10000f98 0x000000ac Code RO 100 i.UART_Init ens1_uart.o
0x10001044 0x10001044 0x0000001e Code RO 109 i.UartPutc ens1_uart.o
0x10001062 0x10001062 0x00000004 Code RO 110 i.WRITE_UART_THRBuff ens1_uart.o
0x10001066 0x10001066 0x00000002 PAD
0x10001068 0x10001068 0x00000020 Code RO 947 i.__0printf$1 mc_p.l(printf1.o)
0x10001088 0x10001088 0x0000002e Code RO 1256 i.__ARM_clz mf_p.l(depilogue.o)
0x100010b6 0x100010b6 0x00000002 PAD
0x100010b8 0x100010b8 0x0000002c Code RO 1213 i.__ARM_fpclassify m_ps.l(fpclassify.o)
0x100010e4 0x100010e4 0x000000ac Code RO 1215 i.__kernel_poly m_ps.l(poly.o)
0x10001190 0x10001190 0x00000014 Code RO 1199 i.__mathlib_dbl_divzero m_ps.l(dunder.o)
0x100011a4 0x100011a4 0x00000008 Code RO 1201 i.__mathlib_dbl_infnan2 m_ps.l(dunder.o)
0x100011ac 0x100011ac 0x00000010 Code RO 1202 i.__mathlib_dbl_invalid m_ps.l(dunder.o)
0x100011bc 0x100011bc 0x00000014 Code RO 1203 i.__mathlib_dbl_overflow m_ps.l(dunder.o)
0x100011d0 0x100011d0 0x00000014 Code RO 1205 i.__mathlib_dbl_underflow m_ps.l(dunder.o)
0x100011e4 0x100011e4 0x0000000e Code RO 1280 i.__scatterload_copy mc_p.l(handlers.o)
0x100011f2 0x100011f2 0x00000002 Code RO 1281 i.__scatterload_null mc_p.l(handlers.o)
0x100011f4 0x100011f4 0x0000000e Code RO 1282 i.__scatterload_zeroinit mc_p.l(handlers.o)
0x10001202 0x10001202 0x00000002 PAD
0x10001204 0x10001204 0x0000000c Code RO 1248 i.__set_errno mc_p.l(errno.o)
0x10001210 0x10001210 0x00000150 Code RO 954 i._printf_core mc_p.l(printf1.o)
0x10001360 0x10001360 0x00000014 Code RO 724 i.boost_voltage_select_26V ens1_boost.o
0x10001374 0x10001374 0x00000014 Code RO 449 i.fputc retarget.o
0x10001388 0x10001388 0x000000f4 Code RO 3 i.main mian.o
0x1000147c 0x1000147c 0x000009fc Code RO 878 i.pow m_ps.l(pow.o)
0x10001e78 0x10001e78 0x00000020 Code RO 890 i.puts mc_p.l(puts.o)
0x10001e98 0x10001e98 0x00000048 Code RO 1219 i.sqrt m_ps.l(sqrt.o)
0x10001ee0 0x10001ee0 0x00000064 Code RO 774 i.wavegen_Init ens1_wavegen.o
0x10001f44 0x10001f44 0x00000018 Code RO 775 i.wavegen_Start ens1_wavegen.o
0x10001f5c 0x10001f5c 0x00000016 Code RO 776 i.wavegen_Stop ens1_wavegen.o
0x10001f72 0x10001f72 0x00000002 PAD
0x10001f74 0x10001f74 0x000000a8 Code RO 777 i.wavegen_driverA_sine_test ens1_wavegen.o
0x1000201c 0x1000201c 0x0000000a Data RO 4 .constdata mian.o
0x10002026 0x10002026 0x00000002 PAD
0x10002028 0x10002028 0x00000088 Data RO 879 .constdata m_ps.l(pow.o)
0x100020b0 0x100020b0 0x00000008 Data RO 1217 .constdata m_ps.l(qnan.o)
0x100020b8 0x100020b8 0x00000020 Data RO 1278 Region$$Table anon$$obj.o
0x10000764 0x10000764 0x00000018 Code RO 402 i.ClockInit ens1_clock.o
0x1000077c 0x1000077c 0x00000164 Code RO 403 i.ClockInitSet ens1_clock.o
0x100008e0 0x100008e0 0x00000018 Code RO 775 i.EMS_Configure ens1_wavegen.o
0x100008f8 0x100008f8 0x0000006c Code RO 776 i.EMS_Process ens1_wavegen.o
0x10000964 0x10000964 0x00000130 Code RO 777 i.EMS_Process_Ramp ens1_wavegen.o
0x10000a94 0x10000a94 0x00000008 Code RO 778 i.EMS_Start ens1_wavegen.o
0x10000a9c 0x10000a9c 0x00000040 Code RO 779 i.EMS_Stop ens1_wavegen.o
0x10000adc 0x10000adc 0x0000005c Code RO 271 i.GPIO_AltFunction ens1_gpio.o
0x10000b38 0x10000b38 0x00000018 Code RO 274 i.GPIO_GetOutputValue ens1_gpio.o
0x10000b50 0x10000b50 0x0000015c Code RO 275 i.GPIO_IO_Init ens1_gpio.o
0x10000cac 0x10000cac 0x00000028 Code RO 277 i.GPIO_Output ens1_gpio.o
0x10000cd4 0x10000cd4 0x00000028 Code RO 278 i.GPIO_Overturn ens1_gpio.o
0x10000cfc 0x10000cfc 0x00000014 Code RO 279 i.GPIO_ResetOutput ens1_gpio.o
0x10000d10 0x10000d10 0x00000014 Code RO 280 i.GPIO_SetOutput ens1_gpio.o
0x10000d24 0x10000d24 0x00000004 Code RO 345 i.MTP_init ens1_mtp.o
0x10000d28 0x10000d28 0x00000014 Code RO 85 i.NVIC_ClearPendingIRQ ens1_uart.o
0x10000d3c 0x10000d3c 0x00000014 Code RO 528 i.NVIC_ClearPendingIRQ ens1_timer.o
0x10000d50 0x10000d50 0x00000014 Code RO 86 i.NVIC_DisableIRQ ens1_uart.o
0x10000d64 0x10000d64 0x00000014 Code RO 529 i.NVIC_DisableIRQ ens1_timer.o
0x10000d78 0x10000d78 0x00000014 Code RO 87 i.NVIC_EnableIRQ ens1_uart.o
0x10000d8c 0x10000d8c 0x00000014 Code RO 530 i.NVIC_EnableIRQ ens1_timer.o
0x10000da0 0x10000da0 0x00000018 Code RO 406 i.PCLK_Enable ens1_clock.o
0x10000db8 0x10000db8 0x00000010 Code RO 853 i.SystemInit system_cmsdk_cm0.o
0x10000dc8 0x10000dc8 0x00000020 Code RO 531 i.TIMER0_Handler ens1_timer.o
0x10000de8 0x10000de8 0x00000040 Code RO 532 i.TIMER0_Init ens1_timer.o
0x10000e28 0x10000e28 0x0000001c Code RO 533 i.TIMER1_Handler ens1_timer.o
0x10000e44 0x10000e44 0x00000008 Code RO 536 i.Time_Manager_GetFlags ens1_timer.o
0x10000e4c 0x10000e4c 0x0000001c Code RO 537 i.Time_Manager_Init ens1_timer.o
0x10000e68 0x10000e68 0x000000b8 Code RO 538 i.Time_Manager_Process ens1_timer.o
0x10000f20 0x10000f20 0x0000006c Code RO 89 i.UART0_Handler ens1_uart.o
0x10000f8c 0x10000f8c 0x00000060 Code RO 90 i.UART1_Handler ens1_uart.o
0x10000fec 0x10000fec 0x0000000a Code RO 92 i.UARTLine_THREmpty ens1_uart.o
0x10000ff6 0x10000ff6 0x0000000a Code RO 98 i.UART_INT_TYPE ens1_uart.o
0x10001000 0x10001000 0x00000058 Code RO 99 i.UART_ITConfig ens1_uart.o
0x10001058 0x10001058 0x00000100 Code RO 100 i.UART_Init ens1_uart.o
0x10001158 0x10001158 0x0000001e Code RO 109 i.UartPutc ens1_uart.o
0x10001176 0x10001176 0x00000004 Code RO 111 i.WRITE_UART_THRBuff ens1_uart.o
0x1000117a 0x1000117a 0x00000002 PAD
0x1000117c 0x1000117c 0x00000014 Code RO 911 i.__0printf$bare mc_p.l(printfb.o)
0x10001190 0x10001190 0x0000002e Code RO 1263 i.__ARM_clz mf_p.l(depilogue.o)
0x100011be 0x100011be 0x00000002 PAD
0x100011c0 0x100011c0 0x0000002c Code RO 1220 i.__ARM_fpclassify m_ps.l(fpclassify.o)
0x100011ec 0x100011ec 0x000000ac Code RO 1222 i.__kernel_poly m_ps.l(poly.o)
0x10001298 0x10001298 0x00000014 Code RO 1206 i.__mathlib_dbl_divzero m_ps.l(dunder.o)
0x100012ac 0x100012ac 0x00000008 Code RO 1208 i.__mathlib_dbl_infnan2 m_ps.l(dunder.o)
0x100012b4 0x100012b4 0x00000010 Code RO 1209 i.__mathlib_dbl_invalid m_ps.l(dunder.o)
0x100012c4 0x100012c4 0x00000014 Code RO 1210 i.__mathlib_dbl_overflow m_ps.l(dunder.o)
0x100012d8 0x100012d8 0x00000014 Code RO 1212 i.__mathlib_dbl_underflow m_ps.l(dunder.o)
0x100012ec 0x100012ec 0x0000000e Code RO 1287 i.__scatterload_copy mc_p.l(handlers.o)
0x100012fa 0x100012fa 0x00000002 Code RO 1288 i.__scatterload_null mc_p.l(handlers.o)
0x100012fc 0x100012fc 0x0000000e Code RO 1289 i.__scatterload_zeroinit mc_p.l(handlers.o)
0x1000130a 0x1000130a 0x00000002 PAD
0x1000130c 0x1000130c 0x0000000c Code RO 1255 i.__set_errno mc_p.l(errno.o)
0x10001318 0x10001318 0x0000001e Code RO 918 i._printf_core mc_p.l(printfb.o)
0x10001336 0x10001336 0x00000002 PAD
0x10001338 0x10001338 0x00000014 Code RO 732 i.boost_voltage_select_55V ens1_boost.o
0x1000134c 0x1000134c 0x00000014 Code RO 455 i.fputc retarget.o
0x10001360 0x10001360 0x000000f8 Code RO 3 i.main mian.o
0x10001458 0x10001458 0x000009fc Code RO 890 i.pow m_ps.l(pow.o)
0x10001e54 0x10001e54 0x00000048 Code RO 1226 i.sqrt m_ps.l(sqrt.o)
0x10001e9c 0x10001e9c 0x00000028 Code RO 781 i.wavegen_Init ens1_wavegen.o
0x10001ec4 0x10001ec4 0x00000050 Code RO 782 i.wavegen_Start ens1_wavegen.o
0x10001f14 0x10001f14 0x00000016 Code RO 783 i.wavegen_Stop ens1_wavegen.o
0x10001f2a 0x10001f2a 0x00000002 PAD
0x10001f2c 0x10001f2c 0x000000a8 Code RO 784 i.wavegen_driverA_sine_test ens1_wavegen.o
0x10001fd4 0x10001fd4 0x0000000e Data RO 4 .constdata mian.o
0x10001fe2 0x10001fe2 0x00000006 PAD
0x10001fe8 0x10001fe8 0x00000088 Data RO 891 .constdata m_ps.l(pow.o)
0x10002070 0x10002070 0x00000008 Data RO 1224 .constdata m_ps.l(qnan.o)
0x10002078 0x10002078 0x00000020 Data RO 1285 Region$$Table anon$$obj.o
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x100020d8, Size: 0x00000270, Max: 0x00020000, ABSOLUTE)
Execution Region RW_IRAM1 (Exec base: 0x20000000, Load base: 0x10002098, Size: 0x00000288, Max: 0x00020000, ABSOLUTE)
Exec Addr Load Addr Size Type Attr Idx E Section Name Object
0x20000000 0x100020d8 0x00000002 Data RW 5 .data mian.o
0x20000002 0x100020da 0x00000002 PAD
0x20000004 0x100020dc 0x00000016 Data RW 111 .data ens1_uart.o
0x2000001a 0x100020f2 0x00000002 PAD
0x2000001c 0x100020f4 0x0000000e Data RW 401 .data ens1_clock.o
0x2000002a 0x10002102 0x00000002 PAD
0x2000002c 0x10002104 0x00000008 Data RW 450 .data retarget.o
0x20000034 0x1000210c 0x0000001c Data RW 534 .data ens1_timer.o
0x20000050 0x10002128 0x00000008 Data RW 779 .data ens1_wavegen.o
0x20000058 0x10002130 0x00000008 Data RW 842 .data system_cmsdk_cm0.o
0x20000060 0x10002138 0x00000004 Data RW 1249 .data mc_p.l(errno.o)
0x20000064 - 0x0000000a Zero RW 778 .bss ens1_wavegen.o
0x2000006e 0x1000213c 0x00000002 PAD
0x20000070 - 0x00000200 Zero RW 870 STACK startup_cmsdk_cm0.o
0x20000000 0x10002098 0x00000002 Data RW 5 .data mian.o
0x20000002 0x1000209a 0x00000002 PAD
0x20000004 0x1000209c 0x0000001e Data RW 112 .data ens1_uart.o
0x20000022 0x100020ba 0x00000002 PAD
0x20000024 0x100020bc 0x0000000e Data RW 407 .data ens1_clock.o
0x20000032 0x100020ca 0x00000002 PAD
0x20000034 0x100020cc 0x00000008 Data RW 456 .data retarget.o
0x2000003c 0x100020d4 0x0000001c Data RW 540 .data ens1_timer.o
0x20000058 0x100020f0 0x00000014 Data RW 786 .data ens1_wavegen.o
0x2000006c 0x10002104 0x00000008 Data RW 854 .data system_cmsdk_cm0.o
0x20000074 0x1000210c 0x00000004 Data RW 1256 .data mc_p.l(errno.o)
0x20000078 - 0x0000000e Zero RW 785 .bss ens1_wavegen.o
0x20000086 0x10002110 0x00000002 PAD
0x20000088 - 0x00000200 Zero RW 882 STACK startup_cmsdk_cm0.o
==============================================================================
@ -1149,18 +1108,18 @@ Image component sizes
404 22 0 14 0 3371 ens1_clock.o
584 30 0 0 0 3766 ens1_gpio.o
4 0 0 0 0 391 ens1_mtp.o
514 134 0 28 0 5058 ens1_timer.o
578 34 0 22 0 14760 ens1_uart.o
546 234 0 8 10 4439 ens1_wavegen.o
244 24 10 2 0 44091 mian.o
430 66 0 28 0 5118 ens1_timer.o
662 34 0 30 0 15204 ens1_uart.o
818 188 0 20 14 5450 ens1_wavegen.o
248 26 14 2 0 44171 mian.o
20 4 0 8 0 2302 retarget.o
28 8 192 0 512 576 startup_cmsdk_cm0.o
16 8 0 8 0 631 system_cmsdk_cm0.o
----------------------------------------------------------------------
2964 506 236 96 524 79796 Object Totals
3240 394 244 116 528 81391 Object Totals
0 0 32 0 0 0 (incl. Generated)
6 0 2 6 2 0 (incl. Padding)
6 0 6 6 2 0 (incl. Padding)
----------------------------------------------------------------------
@ -1189,8 +1148,7 @@ Image component sizes
34 0 0 0 0 68 llushr.o
36 0 0 0 0 60 memcpya.o
36 0 0 0 0 100 memseta.o
368 12 0 0 0 168 printf1.o
32 4 0 0 0 68 puts.o
50 8 0 0 0 144 printfb.o
44 0 0 0 0 72 uidiv.o
40 2 0 0 0 68 cdrcmple.o
356 4 0 0 0 140 dadd.o
@ -1204,19 +1162,19 @@ Image component sizes
162 0 0 0 0 80 dsqrt.o
----------------------------------------------------------------------
5064 296 144 4 0 2544 Library Totals
4 0 0 0 0 0 (incl. Padding)
4716 288 144 4 0 2452 Library Totals
6 0 0 0 0 0 (incl. Padding)
----------------------------------------------------------------------
Code (inc. data) RO Data RW Data ZI Data Debug Library Name
2928 220 144 0 0 792 m_ps.l
718 38 0 4 0 800 mc_p.l
368 30 0 4 0 708 mc_p.l
1414 38 0 0 0 952 mf_p.l
----------------------------------------------------------------------
5064 296 144 4 0 2544 Library Totals
4716 288 144 4 0 2452 Library Totals
----------------------------------------------------------------------
@ -1225,15 +1183,15 @@ Image component sizes
Code (inc. data) RO Data RW Data ZI Data Debug
8028 802 380 100 524 79448 Grand Totals
8028 802 380 100 524 79448 ELF Image Totals
8028 802 380 100 0 0 ROM Totals
7956 682 388 120 528 80951 Grand Totals
7956 682 388 120 528 80951 ELF Image Totals
7956 682 388 120 0 0 ROM Totals
==============================================================================
Total RO Size (Code + RO Data) 8408 ( 8.21kB)
Total RW Size (RW Data + ZI Data) 624 ( 0.61kB)
Total ROM Size (Code + RO Data + RW Data) 8508 ( 8.31kB)
Total RO Size (Code + RO Data) 8344 ( 8.15kB)
Total RW Size (RW Data + ZI Data) 648 ( 0.63kB)
Total ROM Size (Code + RO Data + RW Data) 8464 ( 8.27kB)
==============================================================================

Binary file not shown.

View File

@ -26,19 +26,22 @@ Project File Date: 08/15/2025
<h2>Output:</h2>
*** Using Compiler 'V5.06 update 6 (build 750)', folder: 'D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin'
Build target 'ENS001_BASIC_PRJ'
Rebuild target 'ENS001_BASIC_PRJ'
assembling startup_CMSDK_CM0.s...
compiling mian.c...
USER\mian.c(31): warning: #223-D: function "GPIO_IO_Init" declared implicitly
GPIO_IO_Init(GPIO_19, OUTPUT, 0x00, 0x02, 0x00, 0x00, ENABLE);
USER\mian.c: 1 warning, 0 errors
compiling ENS1_GPIO.c...
compiling system_CMSDK_CM0.c...
compiling retarget.c...
compiling ENS1_BOOST.c...
compiling ENS1_CLOCK.c...
compiling ENS1_MTP.c...
compiling ENS1_UART.c...
compiling ENS1_WAVEGEN.c...
.\FWLIB\include\ENS1_BOOST.h(37): warning: #1-D: last line of file ends without a newline
#endif
FWLIB\source\ENS1_WAVEGEN.c: 1 warning, 0 errors
compiling ENS1_TIMER.c...
linking...
Program Size: Code=8028 RO-data=380 RW-data=100 ZI-data=524
Program Size: Code=7956 RO-data=388 RW-data=120 ZI-data=528
FromELF: creating hex file...
".\Objects\ENS001_BASIC_PRJ.axf" - 0 Error(s), 2 Warning(s).
".\Objects\ENS001_BASIC_PRJ.axf" - 0 Error(s), 0 Warning(s).
<h2>Software Packages used:</h2>

View File

@ -1,19 +1,19 @@
:020000041000EA
:1000000070020020D5000010DD000010DF0000109D
:1000000088020020D5000010DD000010DF00001085
:1000100000000000000000000000000000000000E0
:10002000000000000000000000000000E1000010DF
:100030000000000000000000E3000010E5000010D8
:10004000E7000010E7000010E7000010E7000010D4
:10005000E7000010E7000010E7000010E7000010C4
:10006000E7000010E7000010E7000010E7000010B4
:10007000610E0010CD0E0010E7000010E700001028
:10007000210F00108D0F0010E7000010E7000010A6
:10008000E7000010E7000010E7000010E700001094
:10009000E7000010B50C0010690D0010E70000101B
:10009000E7000010C90D0010290E0010E700001045
:1000A000E7000010E7000010000000000000000062
:1000B0000000000000000000000000000000000040
:1000C0000348854600F0BAFA00480047891300103B
:1000D000700200200448804704480047FEE7FEE71E
:1000E000FEE7FEE7FEE7FEE7A50C0010C1000010EA
:1000C0000348854600F0BAFA004800476113001063
:1000D000880200200448804704480047FEE7FEE706
:1000E000FEE7FEE7FEE7FEE7B90D0010C1000010D5
:1000F00030B50B46014600202022012409E00D46C0
:10010000D5409D4205D31D469540491B2546954047
:1001100040191546521E002DF1DC30BD03460B433D
@ -49,7 +49,7 @@
:1002F0000843194610BD10B5002B08DA0024401C35
:10030000614192185B411A4301D14008400010BD81
:10031000F0B51FB482B005460C0003D0084600F0CB
:10032000B3FE02E000F0B0FE20300246009021460D
:1003200037FF02E000F034FF203002460090214603
:10033000284600F095F9049B059A04460F46184399
:100340001143084314D0184610431BD00098402195
:100350000A1A18460599FFF7BDFF05460E46009A92
@ -100,7 +100,7 @@
:100620008C412146002B04DB1C460123DB07524290
:10063000A341994200D1904210BD0000064C012513
:10064000064E05E0E36807CC2B430C3C984710347A
:10065000B442F7D3FFF738FDB8200010D8200010BF
:10065000B442F7D3FFF738FD78200010982000103F
:1006600010B5202A04DB0146203A9140002010BD3D
:10067000914020239C1A0346E3401943904010BD4B
:1006800010B5202A06DBCB170846203A1041C117C7
@ -118,418 +118,415 @@
:100740007141FFF7D8FDB6E710B5134600224160AE
:100750008160002B01D0082422430124224302603F
:1007600010BD000010B5034800F008F80249086009
:1007700010BD0000200000201C000020F0B587B054
:1007700010BD00002800002024000020F0B587B044
:100780000446002754480068217809040843524968
:100790000860207800281AD108464068617809016D
:1007A00008434D4948606178881CFFF753FD0246B5
:1007B0000B460591049000200121890700F05EFEA0
:1007B0000B460591049000200121890700F04CFEB2
:1007C0000546FFF769FDC7B244494F4328E020784A
:1007D000012803D1A77841494F4321E0207802281E
:1007E00001D187031CE02078032801D1A78817E0F6
:1007F00039484068617809010843374948606178A1
:10080000881CFFF727FD02460B4605910490002047
:100810000121890700F032FE0546FFF73DFDC7B212
:100810000121890700F020FE0546FFF73DFDC7B224
:100820002D480068A17908432B49086000BF2A4879
:1008300000684007C00F0028F9D127480068217AD6
:10084000090208432449086008460068E179090361
:10085000084321490860207A00281BDD217AC81E40
:10086000FFF7F8FC05462A460B46002001218907C0
:1008700000F004FE039102903846FFF7FFFC01915F
:1008700000F0F2FD039102903846FFF7FFFC019172
:100880000090039B029AFFF76DFC05910490FFF71F
:1008900003FD0746E07900281BDDE179C81EFFF75C
:1008A000D9FC05462A460B4600200121890700F0A5
:1008B000E5FD039102903846FFF7E0FC01910090BE
:1008B000D3FD039102903846FFF7E0FC01910090D0
:1008C000039B029AFFF74EFC05910490FFF7E4FCAE
:1008D0000746384607B0F0BD0000024040420F0016
:1008E00010B50446002C04D00A2221460148FFF727
:1008F00015FC10BD6400002010B5154800780028D4
:1009000024D014480068401C12490860084600685A
:1009100005210902884205D20F4881880F4801F05D
:1009200029FB13E00B4800680521090488420DD318
:1009300008480068C911884205D2074881880748DD
:1009400001F018FB02E000200249086010BD000021
:1009500050000020540000206400002000C000402F
:1009600010B501F0EFFA02A000F07EFB10BD000010
:10097000E794B5E588BAE6BF80E5B7B2E590AFE5A4
:100980008AA85C6E0000000010B5002005490870C0
:1009900005490860054801F0E1FA05A000F064FB94
:1009A00010BD0000500000205400002000C0004096
:1009B000E794B5E588BAE6BF80E5B7B2E5819CE685
:1009C000ADA25C6E0000000010B502460F2A14DDD7
:1009D0001348806B1346103B5C000323A3409843ED
:1009E0000F4B98631846806B1346103B5C000B4618
:1009F000A34018430A4B98630FE00948406B54002A
:100A00000323A3409843064B58631846406B540099
:100A10000B46A3401843024B5863002010BD000052
:100A20000010024001460448406801228A401040FC
:100A3000C840C0B27047000000100240FFB5044635
:100A40000D461E460B9F00212046FFF7BDFF012DDE
:100A500010D1012F0ED14F4800690121A1408843D8
:100A60004C490861084640690121A14008434949B1
:100A700048613BE0012D10D1002F0ED1454800699F
:100A80000121A1408843434908610846406901218A
:100A9000A14088433F49486128E0002D14D1012F2F
:100AA00012D13C4840690121A1408843394948613D
:100AB000084600690121A1400843364908610998A8
:100AC00048620298086311E0002D0FD1002F0DD16C
:100AD000304800690121A14088432E490861084639
:100AE00040690121A14088432A494861022E0ED164
:100AF000284880690121A140884326498861084629
:100B0000C1690120A04081432248C1611FE0002E3D
:100B10000ED1204880690121A14008431D49886108
:100B20000846C0690121A14088431A49C8610EE006
:100B3000012E0CD1174881690120A040814315483E
:100B40008161C0690121A14008431249C86111486F
:100B5000816A0120A04081430E488162806A0A991F
:100B6000C907C90FA14008430A4988620846C06AFC
:100B70000121A14088430749C8620846C06A0A9912
:100B80008907C90FA14008430249C862002004B088
:100B9000F0BD000000100240012907D1074A526849
:100BA000012383401A43054B5A6006E0034A52680A
:100BB000012383409A43014B5A6070470010024062
:100BC00000B503461846FFF72DFF012803D118464C
:100BD00000F00AF807E01846FFF724FF002802D1CA
:100BE000184600F00BF800BD034949680122824015
:100BF0009143014A5160704700100240034949681F
:100C0000012282401143014A5160704700100240A6
:100C100000207047C206D20E01219140014A1160A6
:100C20007047000080E200E0C206D20E0121914030
:100C3000014A11607047000080E200E0C206D20E57
:100C400001219140014A11607047000080E100E0FD
:100C5000C206D20E01219140014A11607047000086
:100C600080E100E0C206D20E01219140014A1160EC
:100C70007047000000E100E0C206D20E0121914061
:100C8000014A11607047000000E100E0014604489D
:100C9000406901228A401043014A50610020704798
:100CA00000000240014802490860704700E1F50574
:100CB0005C00002000B501200449C86004480068B9
:100CC000401C0349086000F06FF800BD0080004040
:100CD0004400002070B504460820FFF7D7FF152018
:100CE000FFF7B6FF1520FFF79FFF7D21C9000B48D6
:100CF0000068FFF7FDF960430546294608A000F0AB
:100D0000B3F9012229460C48FFF71EFD1520FFF715
:100D1000B3FF214609A000F0A7F970BD1C00002018
:100D200054494D455230E9878DE8A385E8BDBDE5BE
:100D300080BC3A2025640A000080004054494D459B
:100D400052305F496E6974E5AE8CE68890EFBC8CDA
:100D5000E4B8ADE696ADE591A8E69C9F3A202564FF
:100D6000206D730A0000000001200449C860044897
:100D70000068401C02490860704700000090004075
:100D80004C000020004870473400002010B50621B8
:100D90000348FFF7DCF908210248FFF7D8F910BD36
:100DA000340000203A0000202B480078401C2A49DB
:100DB000087008464078401C487008468078401CFF
:100DC00088700846C078401CC87008460079401CEE
:100DD00008710846C088401CC88008460078022870
:100DE00004DB0020087001201C4908701A48407874
:100DF000062805DB00201849487001201749487073
:100E0000154880780A2805DB0020134988700120E6
:100E1000124988701048C078142805DB00200E495C
:100E2000C87001200D49C8700B480079642805DBA3
:100E30000020094908710120084908710648C08846
:100E40007D21C900884205DB00200349C8800120BC
:100E500002494871704700003A0000203400002029
:100E600010B500240C20FFF7D5FE0120800700F00C
:100E700062F8032806D101208007406804218843D6
:100E8000090748600120800700F055F8022805D0C6
:100E90000120800700F04FF8062816D101208007B6
:100EA0004068400840000121890748600846006802
:100EB000C4B221460120800700F0C4F80120800759
:100EC0004068012108438907486010BD10B500241F
:100ED0000D20FFF79FFE144800F02DF8032805D1E0
:100EE00011484068042188430F4948600E4800F0CB
:100EF00022F8022804D00C4800F01DF8062812D170
:100F000009484068400840000749486008460068B2
:100F1000C4B22146044800F095F803484068012116
:100F200008430149486010BD00100040014648696F
:100F30008006C00F7047014688680007400F704761
:100F400070B504460D461348844206D10D20FFF7C4
:100F500075FE0D20FFF75EFE09E001208007844248
:100F600005D10C20FFF76AFE0C20FFF753FE6068E6
:100F70002978084360600748844203D10D20FFF7B9
:100F800071FE06E001208007844202D10C20FFF7A9
:100F900069FE70BD00100040F8B504460D46012002
:100FA000800784420BD10020FFF770FE0121022050
:100FB000FFF70AFD01210320FFF706FD0DE01F48A2
:100FC00084420AD10120FFF761FE01210C20FFF7C6
:100FD000FBFC01210D20FFF7F7FC606BC007C00F81
:100FE000002801D1102700E00D2715486968006826
:100FF000FFF77EF839460090FFF77AF8401E86B278
:101000001120304020621120000230400012606246
:10101000A068E968097889010843A060E8688078D9
:10102000012803D1A06801210843A060287A012883
:1010300003D12069202108432061F8BD0010004041
:101040001C00002000B503460A4600BF1846FFF703
:101050006DFF0028FAD01146184600F002F810463D
:1010600000BD0160704700000FB410B503A9044B28
:10107000044A029800F0CCF810BC08BC04B0184731
:10108000751300102C0000202021020C01D010212B
:101090001046020A01D010460839020901D0104654
:1010A000091F820801D01046891E420801D0881EFF
:1010B0007047081A704700004900CA020243100036
:1010C00000D004204A0D01D001221043044A490DEA
:1010D000914201D102210843012800D10520704727
:1010E000FF070000F8B504464F1EC8000838211855
:1010F00015461E46086849683A4606239A4310D0AA
:101100002A463346FFF708FA3A46D200083AA318AF
:101110001A687F1E5B68FFF74DF906223B46934332
:10112000EED1022F23D0042F11D0062F2FD12A4623
:101130003346FFF7F1F9E36AA26AFFF73BF92A4663
:101140003346FFF7E9F9636A226AFFF733F92A4663
:101150003346FFF7E1F9E369A269FFF72BF92A4665
:101160003346FFF7D9F963692269FFF723F92A4665
:101170003346FFF7D1F9E368A268FFF71BF92A4667
:101180003346FFF7C9F963682268FFF713F9F8BD22
:10119000002210B5134610460149FEF7E3FF10BDCB
:1011A0000000F03F10B5FFF705F910BD002210B5A3
:1011B000134610461146FEF7D5FF10BD10B50721A6
:1011C000024A00200907FFF70FFA10BD01030000D3
:1011D000034A10B500201107FFF706FA10BD000002
:1011E00001FDFFFF02E008C8121F08C1002AFAD162
:1011F00070477047002001E001C1121F002AFBD197
:10120000704700000149086070470000600000203E
:10121000FFB58DB00446002506E025280AD0109AB7
:101220000F999047641C6D1C20780028F5D1284642
:1012300011B0F0BD00270121484A009700E00743A4
:10124000641C23780846203B98401042F7D1207850
:101250002E2817D1042007436078641C2A280CD15B
:101260000E98641C02C800910E900BE000990A22AF
:10127000514330394018641C0090207801463039C1
:101280000929F3D920780028D1D0642808D069280A
:1012900006D075281ED0109A0F9990476D1C5BE000
:1012A0000A200E99019001C90E91002802DA4042ED
:1012B0002D2102E0390504D52B216A461172012146
:1012C00003E0F90704D02021F7E70BAE0B910DE006
:1012D0000021FAE70A200E99019001C90E91F7E763
:1012E0000199FEF705FF3031761E31700028F7D1E5
:1012F00003A8801B20300190780701D5009801E0F9
:10130000012000900199884201DD401A00E0002090
:101310000027009006E002A8109AC05D0F99904740
:101320006D1C7F1C0B988742F5DB04E0109A30207F
:101330000F9990476D1C0099481E00900029F5DC1C
:1013400005E03078109A761C0F9990476D1C019932
:10135000481E01900029F4DC641C65E7092801009F
:101360000248034948611020086170471372070062
:1013700000E0004070B504460D46E1B20148FFF7B9
:1013800061FE70BD0010004086B0FFF741FCFFF722
:10139000E9F901200021009102230A4601910290FF
:1013A0001320FFF74BFB00211320FFF7F5FB2D491E
:1013B0002D48FFF7F1FD2D492B48FFF7C1FD012016
:1013C000FFF788FCFFF7E2FC00F08AFD284A07CA15
:1013D00003AB07C303A8FFF783FAFFF7C1FA40E0A6
:1013E000FFF7D0FC04462078002801D000202070B0
:1013F000A078002801D00020A0702079002801D01A
:1014000000202071607900282AD01A480078401CFA
:1014100018490870084600780A280BDC164800783E
:10142000002804D1012014490870FFF799FAFFF74A
:1014300063FA10E00F480078142809DC0E480078A1
:10144000012808D100200C490870FFF79DFA02E03E
:101450000020084908701320FFF7B2FB00206071DC
:1014600000BFBDE708000020001000401800002069
:101470001C2000100000002001000020F0B51FB467
:1014800096B084460C460246199D18980390490070
:1014900068006300490840080193002A01D0012632
:1014A00000E000269E19FE4BF6185B109E422BD3DF
:1014B0006E00039F0296002F00D00127F719F84E07
:1014C000F84BBE199E421FD3039E0346F64F33438B
:1014D00009D03B469C4201D1002A04D0019B002A3E
:1014E00005D0012604E0002039461BB0F0BD0026DF
:1014F0009E19EE4B9E4207D8039F029E002F00D0FC
:101500000127F6199E4207D92B4660462146189AB4
:10151000FFF748FE1BB0F0BD0023002C29DAE44E93
:10152000B04226DAE34EB04201DB022321E0DE4E78
:10153000B0421EDBE04E070DBE19142E09DD342724
:10154000BF1B039EFE400196BE40039FBE420BD0D0
:101550000FE0039F002F0CD11427BF1B0646FE404F
:101560000196BE40864204D1019BDE07F60F02239E
:101570009B1B0E46164318D1002D16DA002C03D003
:10158000022B01D0012B06D00220FFF73BFEFFF714
:10159000FFFD1BB0F0BD0220FFF734FEFFF7F8FDA2
:1015A0000122D20751401BB0F0BD039E002E61D135
:1015B000BF4EB04220D1C148844201D1002A08D098
:1015C000B948814209DB002D10DB189829461BB071
:1015D000F0BD0020B4491BB0F0BD002D06DA012299
:1015E0002946D207189851401BB0F0BDB449794440
:1015F000086849681BB0F0BDAB4FB84225D1002D3B
:101600001FDA002904D0B14212D1002A09D018E013
:10161000002A72D1A649E20F0020D20711431BB065
:10162000F0BD0020E20F0146D20711431BB0F0BD10
:10163000B14206DA234600203946FEF793FD1BB07F
:10164000F0BD104621461BB0F0BDB14212DA0126B2
:10165000B607B54203D1234610461946FEE3994E1C
:10166000B54207D1261E05DB1046314600F014FCBA
:101670001BB0F0BD67007F081646002A40D1002944
:101680000AD08B4A914229D1002C0EDD002D1CDBA3
:10169000002011461BB0F0BD022B16D0002C14D038
:1016A000012B12D1002C14DB0FE0002C28DA002DC6
:1016B00009DB012B03D000207D491BB0F0BD0020C9
:1016C00081491BB0F0BD012B03D0002001461BB0A7
:1016D000F0BD00200121C9071BB0F0BD724A914244
:1016E0000ED1002C01DA002B17D0022B06D00020DF
:1016F000C043FEF7AFFD1BB0F0BD90E20120F8E75C
:10170000E217521C94461A4307D000220892664CF6
:1017100062465B1E1A4307D009E00120FFF772FD05
:10172000FFF744FD1BB0F0BD0022644C0892674AED
:1017300090427DDD664B674A98421FDD914202DC94
:10174000002D05DB4DE05848814217DB002D48DDB8
:101750000220FFF757FDFFF731FD05460E46002238
:10176000534B21460898FEF7D7FE084671004908FA
:10177000C00FC007014328461BB0F0BD914215DAE7
:10178000002D2EDA0220FFF73DFDFFF717FD05467D
:101790000E460022464B21460898FEF7BDFE720019
:1017A0005208C80FC0070243114617E03E4B99424A
:1017B00023DD002D15DD0220FFF724FDFFF7FEFCE1
:1017C00005460E4600223A4B21460898FEF7A4FE35
:1017D000084671004908C00FC007014328461BB0E6
:1017E000F0BD0220FFF70EFDFFF7F2FC49004908AB
:1017F000E20FD20711431BB0F0BD0022304639463C
:10180000FEF77CFE012205460E46D243FEF7ECFEB3
:10181000314A324BFEF778FE2A463346FEF77CFE0D
:101820000022284BFEF770FE07462A46334600E0AA
:1018300064E0039110461946FEF76EFE3A46039B9C
:10184000FEF76AFE0746032209915207244B2846F9
:101850003146FEF761FE07910C90224A204B384634
:101860000999FEF759FE074601911F4A1F4B28466A
:101870003146FEF751FE3A46019BFEF73FFE074612
:101880000B460246099107990C98FEF793FD002537
:101890000E462846079B0C9AFEF730FE3A4627E094
:1018A000FFFF1F00FFFF0F000000F03F0000E0FF00
:1018B0000000F07F0000404301FCFFFF0000F0BF8C
:1018C000BE0A00000000E03F0000F0FF0000E04121
:1018D0000000F043FFFFEF3F555555555555D53F97
:1018E0004715F73FFE822B6544DF5DF80BAE543E93
:1018F000099BFEF709FE02460B4652E10125002036
:101900002D05A94207DA352230463946FEF76CFE2E
:1019100006463420C0430A151218FE4810180390DA
:101920000803FD49000B01430F46FC49884201DCD6
:10193000002003E0FA49884202DA0120119005E014
:10194000002011900398401C7F1B0390119805976D
:10195000C200F4480F927844801843680268394600
:1019600030460D930292FEF7C9FD07910C90304668
:101970000D9B029A0599FEF71DFD02460B460020BD
:10198000E549FEF7EFFB09910490079B0C9AFEF7DF
:10199000C3FD129000201090E3480D467844006883
:1019A0000E90012178104907084311990D9B890475
:1019B00040180121C90447183946029A0E98FEF7CB
:1019C0009DFD3246059BFEF79FFD02460B462946CC
:1019D0001098FEF7A1FD064602913B4629460E9A55
:1019E0001098FEF799FD079B0C9AFEF78DFD324685
:1019F000029BFEF783FD099B049AFEF78DFD05917E
:101A0000129A0A902B4610461946FEF785FD0646A7
:101A10000246C6480F460B4606217844FFF762FB94
:101A200032463B460091049010461946FEF774FD7D
:101A3000009B049AFEF770FD06460F462B4619469A
:101A4000129A1098FEF7B6FC059B0A9AFEF764FD01
:101A500032463B46FEF7AEFC109A079104902B46A7
:101A600010461946FEF758FDB14E00223346099143
:101A70000290FEF79FFC079B049AFEF79BFC002058
:101A80000746024633460091FEF738FD099B029A4D
:101A9000FEF734FD079B049AFEF736FD06460D91CE
:101AA0003A462946009B1098FEF736FD07910C90A8
:101AB0002B463046129A0D99FEF72EFD05460E462E
:101AC0003A46009B05990A98FEF726FD33462A46BA
:101AD000FEF770FC02460B460746099107990C98E1
:101AE000FEF768FC00250E462846079B0C9AFEF779
:101AF00005FD3A46099BFEF707FD074607220991B7
:101B000052078C4B31462846FEF706FD07910090A0
:101B1000894A884B38460999FEF7FEFC0746019131
:101B2000864A874B31462846FEF7F6FC3A46019B2B
:101B3000FEF740FC834B7B440F9A9B181A685B6846
:101B4000FEF738FC029009910398FEF783FB05919C
:101B50000490099B029A07990098FEF72BFC7A4B98
:101B60007B440F9A9B181A685B6817460393FEF72D
:101B700021FC059B049AFEF71DFC0E462846059B9A
:101B8000049AFEF7BBFC3A46039BFEF7B7FC079BA3
:101B9000009AFEF7B3FC099B029AFEF7B5FC0246D9
:101BA0000B46199900200C900F461898FEF7B4FCCC
:101BB000029104903B460C9A19991898FEF79EFCE6
:101BC0002A463346FEF7A8FC029B049AFEF7F2FB76
:101BD00009910E902A46334639460C98FEF79CFC34
:101BE00006460F46099B0E9AFEF7E4FB574A0D4640
:101BF000914220DB5242AA18024310D132463B46A2
:101C0000FEF77CFC04900391514A524B09990E98BF
:101C1000FEF7D0FB039B049AFEF7FCFC1ED20220C9
:101C2000FFF7F0FAFFF7CAFA49004908E20FD207B6
:101C300011431BB0F0BD6A00474B52089A420DD3C6
:101C4000464AAA18024300D0CBE532463B46FEF78F
:101C500055FC099B0E9AFEF7DDFCF5D968000023C0
:101C600040082C490393020D3D4B5218984223DD46
:101C700001200005521CD04042195000400D401870
:101C800038497944096813468C463749C1408B432B
:101C900012030121120B090551181422101AC14018
:101CA0000391002D01DA48420390624630463946DE
:101CB000FEF724FC06460F4632463B4609990E982D
:101CC000FEF778FB00252A46284B28460591FEF7AB
:101CD00023FC07910C90264A264B28460599FEF7CF
:101CE0001BFC0091029032463B4628460599FEF7C0
:101CF00005FC099B0E9AFEF707FC1F4A1F4BFEF7D7
:101D00000BFC009B029AFEF755FB07460B4602466A
:101D1000099135E001FCFFFF0000F03F8E980300C1
:101D20007AB60B00CE060000100700003A0600004D
:101D30000000084009C7EE3FFD033ADCF5015B14E3
:101D4000E02F3EBE0E050000D404000000009040CD
:101D5000FE822B654715973C00CC904000346F3FC6
:101D60000000E03F2A040000FFFF0F00432EE63F83
:101D7000396CA80C615C20BEEF39FAFE422EE63FBA
:101D800007990C98FEF716FB05460E46079B0C9A22
:101D9000FEF7B4FB3A46099BFEF7B6FB09912A46CB
:101DA00033460E9010461946FEF7B6FB074602462C
:101DB0002F480B46059105217844FFF793F93A46E1
:101DC000059BFEF7A9FB2A463346FEF79DFB074617
:101DD000019128463146099B0E9AFEF79DFB099B0F
:101DE0000E9AFEF7E7FA012304910C9000229B075C
:101DF00038460199FEF782FB05910E903A46284637
:101E00003146019BFEF788FB059B0E9AFEF7AAF967
:101E1000049B0C9AFEF772FB2A463346FEF76EFBD4
:101E20000022144BFEF770FB064603980D46000592
:101E300041190915002912DC30462946039AFEF79C
:101E4000D3FBFFF739F9042801D1FFF7C1F9304678
:101E50002946039AFEF7C8FB064601E004E029186C
:101E60000B46324621460898FEF756FB1BB0F0BDE4
:101E7000CC0200000000F03F10B5044601E0FFF77F
:101E800079FA2078641C03490028F8D10A20FFF76A
:101E900071FA10BD2C000020F8B506460C46FEF77E
:101EA00002FC051E0F4600D00120014349000B48EB
:101EB0004908411AC90F0DD0002E01D0012100E0C0
:101EC00000210C4361004908401AC00F02D10120D3
:101ED000FFF798F928463946F8BD00000000F07F6A
:101EE00010B50220064908600648406906490843C3
:101EF00004494861FFF734FA04A0FFF7BDFF10BDA5
:101F0000003002400000024003500000454E5331B3
:101F1000202D20574156455F47454E455241544F6D
:101F2000525F4452495645525F415F546573742075
:101F30002D20245265766973696F6E3A20523030D5
:101F4000310A00000120034908700020024908609E
:101F50007047000050000020540000200021C163A1
:101F600000BF03E0C16100220262491C4029F9DB85
:101F700070470000F8B504460D460026002716A05D
:101F8000FFF77AFF6420A0602020A061A061642098
:101F900020616061502020600420E063002002E0A6
:101FA000E0612562401C4028FADB1920C001606214
:101FB0000020A062E0620120206300206063A06333
:101FC00001206060002F04D00BA0FFF755FF012611
:101FD00000273046F8BD00000AE9A9B1E58AA8E566
:101FE00099A841E6ADA3E5BCA6E6B3A2E6B58BE8A9
:101FF000AF955C6E000000000AE99499E8AFAF204D
:102000003A20E9A9B1E58AA8E599A841E6B58BE8A7
:10201000AF95E5A4B1E8B4A50A0000006400E803A8
:102020008000640032000000000000000000F03F6B
:10203000000000000000F83F000000000000000069
:102040000000004003B8E23F000000000000000074
:1020500006D0CF43EBFD4C3E033333333333E33F02
:10206000FFAB6FDBB66DDB3F4D268F515555D53F2E
:1020700001411DA96074D13F65DBC9934A86CD3FFC
:10208000EF4E454A287ECA3F3E5555555555C53FEA
:1020900093BDBE166CC166BF2CDE25AF6A56113FDC
:1020A000F16BD2C541BDBBBED0A4BE726937663EDE
:1020B0000000000000000000D820001000000020F8
:1020C00064000000E41100103C21001064000020B6
:1020D0000C020000F41100100000000002000100DA
:1020E0000000000000C20100000000000400002009
:1020F00005000000000000000003000000000000D8
:1021000000000000000000000000000000000000CF
:1021100000000000000000000000000000000000BF
:1021200000000000000000000000000000000000AF
:0C21300000E1F50500E1F50500000000ED
:1008E00010B50446002C04D00E2221460148FFF723
:1008F00015FC10BD7800002010B5164800780028BF
:1009000027D015480068401C1349086000F02AF8F9
:10091000124804881048006805210902884204D260
:1009200021460F4801F002FB12E00B480068052148
:10093000090488420CD308480068C911884204D2CF
:100940002146074801F0F2FA02E00020024908605F
:1009500000BF10BD580000205C0000206000002097
:1009600000C00040F8B54548407B002803D044480B
:100970000078002800D1F8BD00244048807A81002A
:1009800045183E48067BC07A810047183B4880885E
:10099000002805DD394881882846FFF7A9FB044671
:1009A00038480068401C37490860374800780028FC
:1009B00004D0012829D002285CD13DE033480068EA
:1009C000A84217D22F480068A0420DD300202D491D
:1009D00008602A4880882E490988884204DD2C480E
:1009E0000088401C2A49088028480068401C274984
:1009F000086009E0012024490870002023490860AC
:100A00001E4880882249088034E020480068B842A7
:100A100009D21A4880881E4908801C480068401C7A
:100A20001A49086007E0022017490870002017499A
:100A30000860144908601DE014480068B04215D2EF
:100A400010480068A0420BD300200E4908601048EF
:100A50000088002804DD0E480088401E0C490880EC
:100A60000A480068401C0949086002E00020084963
:100A7000088000BF00BF00BF7DE7000078000020B5
:100A80005800002064000020620000206800002060
:100A90006000002000B501F015FA00BD00B500208F
:100AA0000749087007490860074908800749087026
:100AB0000749086007490860074801F02BFA00BDA4
:100AC000580000205C000020600000206200002030
:100AD000640000206800002000C0004010B50246FD
:100AE0000F2A14DD1348806B1346103B5C00032370
:100AF000A34098430F4B98631846806B1346103BF6
:100B00005C000B46A34018430A4B98630FE009486A
:100B1000406B54000323A3409843064B5863184688
:100B2000406B54000B46A3401843024B586300200F
:100B300010BD000000100240014604484068012238
:100B40008A401040C840C0B2704700000010024008
:100B5000FFB504460D461E460B9F00212046FFF7B9
:100B6000BDFF012D10D1012F0ED14F480069012189
:100B7000A14088434C490861084640690121A140D1
:100B80000843494948613BE0012D10D1002F0ED1A7
:100B9000454800690121A14088434349086108464E
:100BA00040690121A14088433F49486128E0002D68
:100BB00014D1012F12D13C4840690121A140884342
:100BC00039494861084600690121A1400843364976
:100BD0000861099848620298086311E0002D0FD15E
:100BE000002F0DD1304800690121A14088432E49D2
:100BF0000861084640690121A14088432A494861AB
:100C0000022E0ED1284880690121A140884326493F
:100C100088610846C1690120A04081432248C16122
:100C20001FE0002E0ED1204880690121A140084319
:100C30001D4988610846C0690121A14088431A49BD
:100C4000C8610EE0012E0CD1174881690120A04037
:100C5000814315488161C0690121A14008431249BF
:100C6000C8611148816A0120A04081430E48816219
:100C7000806A0A99C907C90FA14008430A498862D6
:100C80000846C06A0121A14088430749C862084656
:100C9000C06A0A998907C90FA14008430249C8627E
:100CA000002004B0F0BD000000100240012907D16F
:100CB000074A5268012383401A43054B5A6006E0F5
:100CC000034A5268012383409A43014B5A6070479C
:100CD0000010024000B503461846FFF72DFF01281B
:100CE00003D1184600F00AF807E01846FFF724FF82
:100CF000002802D1184600F00BF800BD03494968EE
:100D0000012282409143014A516070470010024025
:100D100003494968012282401143014A51607047EA
:100D20000010024000207047C206D20E01219140FF
:100D3000014A11607047000080E200E0C206D20E56
:100D400001219140014A11607047000080E200E0FB
:100D5000C206D20E01219140014A11607047000085
:100D600080E100E0C206D20E01219140014A1160EB
:100D70007047000080E100E0C206D20E01219140E0
:100D8000014A11607047000000E100E0C206D20E87
:100D900001219140014A11607047000000E100E02C
:100DA00001460448406901228A401043014A5061CB
:100DB0000020704700000240014802490860704767
:100DC00000E1F5057000002000B501200449C8606D
:100DD00004480068401C0349086000F045F800BD65
:100DE000008000404C00002070B504460820FFF74A
:100DF000D7FF1520FFF7B6FF1520FFF79FFF7D21D6
:100E0000C90007480068FFF773F9604305460122EF
:100E100029460448FFF798FC1520FFF7B7FF70BD7F
:100E2000240000200080004001200449C8600448DC
:100E30000068401C024908607047000000900040B4
:100E400054000020004870473C00002010B50621E7
:100E50000348FFF77CF908210248FFF778F910BD35
:100E60003C000020420000202B480078401C2A490A
:100E7000087008464078401C487008468078401C3E
:100E800088700846C078401CC87008460079401C2D
:100E900008710846C088401CC880084600780228AF
:100EA00004DB0020087001201C4908701A484078B3
:100EB000062805DB002018494870012017494870B2
:100EC000154880780A2805DB002013498870012026
:100ED000124988701048C078142805DB00200E499C
:100EE000C87001200D49C8700B480079642805DBE3
:100EF0000020094908710120084908710648C08886
:100F00007D21C900884205DB00200349C8800120FB
:100F10000249487170470000420000203C00002058
:100F200010B500240C20FFF7FFFE0120800700F021
:100F300062F8032806D10120800740680421884315
:100F4000090748600120800700F055F8022805D005
:100F50000120800700F04FF8062816D101208007F5
:100F60004068400840000121890748600846006841
:100F7000C4B221460120800700F0EEF8012080076E
:100F80004068012108438907486010BD10B500245E
:100F90000D20FFF7C9FE144800F02DF8032805D1F5
:100FA00011484068042188430F4948600E4800F00A
:100FB00022F8022804D00C4800F01DF8062812D1AF
:100FC00009484068400840000749486008460068F2
:100FD000C4B22146044800F0BFF80348406801212C
:100FE00008430149486010BD0010004001464869AF
:100FF0008006C00F7047014688680007400F7047A1
:1010000070B504460D461348844206D10D20FFF703
:101010009FFE0D20FFF788FE09E001208007844233
:1010200005D10C20FFF794FE0C20FFF77DFE6068D1
:101030002978084360600748844203D10D20FFF7F8
:101040009BFE06E001208007844202D10C20FFF7BE
:1010500093FE70BD00100040F8B504460D46012017
:10106000800784420BD10020FFF79AFE0121022065
:10107000FFF734FD01210320FFF730FD0DE0344878
:1010800084420AD10120FFF78BFE01210C20FFF7DB
:1010900025FD01210D20FFF721FD606BC007C00F6A
:1010A000002801D1102700E00D272A486968006850
:1010B000FFF71EF839460090FFF71AF8401E86B277
:1010C000F0B22062FF200002304000126062A0688F
:1010D000E968097889010843A060E86880780128F8
:1010E00003D1A06801210843A060E068042188437F
:1010F000E060E068297C89000843E060E0688008DF
:101100008000E060E068697C0843E060E0680821F6
:101110008843E060E068297DC9000843E060287DDD
:1011200001280DD1E06830218843E060E068E97C67
:1011300009010843E060E068A97C49010843E060D8
:10114000287A012803D12069202108432061F8BDB5
:10115000001000402400002000B503460A4600BFEE
:101160001846FFF743FF0028FAD01146184600F052
:1011700002F8104600BD01607047000010B5024A39
:10118000024900F0C9F810BD4D13001034000020D2
:101190002021020C01D010211046020A01D0104675
:1011A0000839020901D01046091F820801D01046F3
:1011B000891E420801D0881E7047081A7047000037
:1011C0004900CA020243100000D004204A0D01D099
:1011D00001221043044A490D914201D102210843E2
:1011E000012800D105207047FF070000F8B504462C
:1011F0004F1EC8000838211815461E460868496861
:101200003A4606239A4310D02A463346FFF784F91C
:101210003A46D200083AA3181A687F1E5B68FFF7A7
:10122000C9F806223B469343EED1022F23D0042F68
:1012300011D0062F2FD12A463346FFF76DF9E36A06
:10124000A26AFFF7B7F82A463346FFF765F9636AE3
:10125000226AFFF7AFF82A463346FFF75DF9E369E4
:10126000A269FFF7A7F82A463346FFF755F96369E5
:101270002269FFF79FF82A463346FFF74DF9E368E6
:10128000A268FFF797F82A463346FFF745F96368E7
:101290002268FFF78FF8F8BD002210B513461046FC
:1012A0000149FEF75FFF10BD0000F03F10B5FFF7EA
:1012B00081F810BD002210B5134610461146FEF706
:1012C00051FF10BD10B50721024A00200907FFF7A2
:1012D0008BF910BD01030000034A10B5002011076F
:1012E000FFF782F910BD000001FDFFFF02E008C812
:1012F000121F08C1002AFAD170477047002001E090
:1013000001C1121F002AFBD170470000014908608B
:101310007047000074000020F8B516460F460446DA
:10132000002503E03946B047641C6D1C2078002876
:10133000F8D12846F8BD0000024803494861102052
:10134000086170471377090000E0004070B504465B
:101350000D46E1B20148FFF7FFFE70BD00100040EE
:1013600088B0FFF7DFFCFFF7FDF9012000210091B5
:1013700002230A46019102901320FFF7E9FB0021A6
:101380001320FFF793FC2E492E48FFF765FE2E49E8
:101390002C48FFF735FE0120FFF726FDFFF756FD2D
:1013A00000F07CFD294B0FCB079304AB07C304A8C7
:1013B000FFF796FAFFF76EFB40E0FFF743FD0446A8
:1013C0002078002801D000202070A078002801D0CB
:1013D0000020A0702079002801D0002020716079C1
:1013E00000282AD01A480078401C1949087008467D
:1013F00000780A280BDC17480078002804D1012067
:1014000014490870FFF746FBFFF776FA10E0104822
:101410000078142809DC0F480078012808D1002042
:101420000C490870FFF73AFB02E0002008490870F9
:101430001320FFF74FFC0020607100BFBDE70000E4
:10144000080000200010004020000020D41F0010E1
:101450000000002001000020F0B51FB496B08446C3
:101460000C460246199D18980390490068006300D5
:10147000490840080193002A01D0012600E0002617
:101480009E19FE4BF6185B109E422BD36E00039FF5
:101490000296002F00D00127F719F84EF84BBE191D
:1014A0009E421FD3039E0346F64F334309D03B466B
:1014B0009C4201D1002A04D0019B002A05D00126BC
:1014C00004E0002039461BB0F0BD00269E19EE4B0B
:1014D0009E4207D8039F029E002F00D00127F619D5
:1014E0009E4207D92B4660462146189AFFF7DEFE3A
:1014F0001BB0F0BD0023002C29DAE44EB04226DAFE
:10150000E34EB04201DB022321E0DE4EB0421EDB9F
:10151000E04E070DBE19142E09DD3427BF1B039EB4
:10152000FE400196BE40039FBE420BD00FE0039FDA
:10153000002F0CD11427BF1B0646FE400196BE406B
:10154000864204D1019BDE07F60F02239B1B0E4649
:10155000164318D1002D16DA002C03D0022B01D02F
:10156000012B06D00220FFF7D1FEFFF795FE1BB03E
:10157000F0BD0220FFF7CAFEFFF78EFE0122D20760
:1015800051401BB0F0BD039E002E61D1BF4EB04252
:1015900020D1C148844201D1002A08D0B9488142F3
:1015A00009DB002D10DB189829461BB0F0BD002088
:1015B000B4491BB0F0BD002D06DA01222946D2073E
:1015C000189851401BB0F0BDB44979440868496887
:1015D0001BB0F0BDAB4FB84225D1002D1FDA00295A
:1015E00004D0B14212D1002A09D018E0002A72D1E9
:1015F000A649E20F0020D20711431BB0F0BD002026
:10160000E20F0146D20711431BB0F0BDB14206DA2A
:10161000234600203946FEF7A5FD1BB0F0BD10465D
:1016200021461BB0F0BDB14212DA0126B607B54221
:1016300003D1234610461946FEE3994EB54207D121
:10164000261E05DB1046314600F004FC1BB0F0BD41
:1016500067007F081646002A40D100290AD08B4A2D
:10166000914229D1002C0EDD002D1CDB00201146FB
:101670001BB0F0BD022B16D0002C14D0012B12D1C0
:10168000002C14DB0FE0002C28DA002D09DB012BE5
:1016900003D000207D491BB0F0BD002081491BB064
:1016A000F0BD012B03D0002001461BB0F0BD00208F
:1016B0000121C9071BB0F0BD724A91420ED1002C26
:1016C00001DA002B17D0022B06D00020C043FEF712
:1016D000C1FD1BB0F0BD90E20120F8E7E217521CFB
:1016E00094461A4307D000220892664C62465B1E5D
:1016F0001A4307D009E00120FFF708FEFFF7DAFDE3
:101700001BB0F0BD0022644C0892674A90427DDD18
:10171000664B674A98421FDD914202DC002D05DBD3
:101720004DE05848814217DB002D48DD0220FFF7CD
:10173000EDFDFFF7C7FD05460E460022534B21463F
:101740000898FEF7E9FE084671004908C00FC00777
:10175000014328461BB0F0BD914215DA002D2EDA68
:101760000220FFF7D3FDFFF7ADFD05460E46002230
:10177000464B21460898FEF7CFFE72005208C80F6C
:10178000C0070243114617E03E4B994223DD002D6E
:1017900015DD0220FFF7BAFDFFF794FD05460E4662
:1017A00000223A4B21460898FEF7B6FE0846710023
:1017B0004908C00FC007014328461BB0F0BD0220F6
:1017C000FFF7A4FDFFF788FD49004908E20FD207A3
:1017D00011431BB0F0BD002230463946FEF78EFEA5
:1017E000012205460E46D243FEF7FEFE314A324B39
:1017F000FEF78AFE2A463346FEF78EFE0022284B6D
:10180000FEF782FE07462A46334600E064E0039175
:1018100010461946FEF780FE3A46039BFEF77CFE13
:101820000746032209915207244B28463146FEF70A
:1018300073FE07910C90224A204B38460999FEF717
:101840006BFE074601911F4A1F4B28463146FEF7A3
:1018500063FE3A46019BFEF751FE07460B460246E1
:10186000099107990C98FEF7A5FD00250E4628461C
:10187000079B0C9AFEF742FE3A4627E0FFFF1F0047
:10188000FFFF0F000000F03F0000E0FF0000F07FCE
:101890000000404301FCFFFF0000F0BFA20A00006F
:1018A0000000E03F0000F0FF0000E0410000F043D6
:1018B000FFFFEF3F555555555555D53F4715F73F58
:1018C000FE822B6544DF5DF80BAE543E099BFEF7AC
:1018D0001BFE02460B4652E1012500202D05A942C0
:1018E00007DA352230463946FEF77EFE06463420BA
:1018F000C0430A151218FE48101803900803FD494A
:10190000000B01430F46FC49884201DC002003E044
:10191000FA49884202DA0120119005E00020119076
:101920000398401C7F1B039011980597C200F44850
:101930000F927844801843680268394630460D9308
:101940000292FEF7DBFD07910C9030460D9B029A48
:101950000599FEF72FFD02460B460020E549FEF7EC
:1019600001FC09910490079B0C9AFEF7D5FD12909B
:1019700000201090E3480D46784400680E90012145
:1019800078104907084311990D9B890440180121DB
:10199000C90447183946029A0E98FEF7AFFD324641
:1019A000059BFEF7B1FD02460B4629461098FEF74F
:1019B000B3FD064602913B4629460E9A1098FEF763
:1019C000ABFD079B0C9AFEF79FFD3246029BFEF78C
:1019D00095FD099B049AFEF79FFD0591129A0A90C6
:1019E0002B4610461946FEF797FD06460246C648A6
:1019F0000F460B4606217844FFF7F8FB32463B467C
:101A00000091049010461946FEF786FD009B049A4B
:101A1000FEF782FD06460F462B461946129A10988D
:101A2000FEF7C8FC059B0A9AFEF776FD32463B4658
:101A3000FEF7C0FC109A079104902B4610461946F9
:101A4000FEF76AFDB14E0022334609910290FEF77F
:101A5000B1FC079B049AFEF7ADFC00200746024646
:101A600033460091FEF74AFD099B029AFEF746FDB8
:101A7000079B049AFEF748FD06460D913A46294613
:101A8000009B1098FEF748FD07910C902B463046BE
:101A9000129A0D99FEF740FD05460E463A46009B08
:101AA00005990A98FEF738FD33462A46FEF782FC70
:101AB00002460B460746099107990C98FEF77AFCF7
:101AC00000250E462846079B0C9AFEF717FD3A465E
:101AD000099BFEF719FD07460722099152078C4B17
:101AE00031462846FEF718FD07910090894A884B39
:101AF00038460999FEF710FD07460191864A874B43
:101B000031462846FEF708FD3A46019BFEF752FC97
:101B1000834B7B440F9A9B181A685B68FEF74AFC5C
:101B2000029009910398FEF795FB05910490099B9B
:101B3000029A07990098FEF73DFC7A4B7B440F9A76
:101B40009B181A685B6817460393FEF733FC059BE6
:101B5000049AFEF72FFC0E462846059B049AFEF7D2
:101B6000CDFC3A46039BFEF7C9FC079B009AFEF7A3
:101B7000C5FC099B029AFEF7C7FC02460B46199961
:101B800000200C900F461898FEF7C6FC02910490B6
:101B90003B460C9A19991898FEF7B0FC2A46334632
:101BA000FEF7BAFC029B049AFEF704FC09910E9022
:101BB0002A46334639460C98FEF7AEFC06460F46D9
:101BC000099B0E9AFEF7F6FB574A0D46914220DB21
:101BD0005242AA18024310D132463B46FEF78EFC11
:101BE00004900391514A524B09990E98FEF7E2FB7B
:101BF000039B049AFEF70EFD1ED20220FFF786FB20
:101C0000FFF760FB49004908E20FD20711431BB000
:101C1000F0BD6A00474B52089A420DD3464AAA18B3
:101C2000024300D0CBE532463B46FEF767FC099BFA
:101C30000E9AFEF7EFFCF5D96800002340082C4906
:101C40000393020D3D4B5218984223DD01200005FD
:101C5000521CD04042195000400D40183849794478
:101C6000096813468C463749C1408B431203012152
:101C7000120B090551181422101AC1400391002DAE
:101C800001DA48420390624630463946FEF736FC98
:101C900006460F4632463B4609990E98FEF78AFBE8
:101CA00000252A46284B28460591FEF735FC07916A
:101CB0000C90264A264B28460599FEF72DFC0091EC
:101CC000029032463B4628460599FEF717FC099BD1
:101CD0000E9AFEF719FC1F4A1F4BFEF71DFC009BD6
:101CE000029AFEF767FB07460B460246099135E06C
:101CF00001FCFFFF0000F03F8E9803007AB60B0056
:101D0000B2060000F40600001E06000000000840B5
:101D100009C7EE3FFD033ADCF5015B14E02F3EBE40
:101D2000F2040000B804000000009040FE822B6521
:101D30004715973C00CC904000346F3F0000E03FD7
:101D40000E040000FFFF0F00432EE63F396CA80C85
:101D5000615C20BEEF39FAFE422EE63F07990C98EF
:101D6000FEF728FB05460E46079B0C9AFEF7C6FBBE
:101D70003A46099BFEF7C8FB09912A4633460E9066
:101D800010461946FEF7C8FB074602462F480B4689
:101D9000059105217844FFF729FA3A46059BFEF79D
:101DA000BBFB2A463346FEF7AFFB074601912846A8
:101DB0003146099B0E9AFEF7AFFB099B0E9AFEF780
:101DC000F9FA012304910C9000229B0738460199EF
:101DD000FEF794FB05910E903A4628463146019B4A
:101DE000FEF79AFB059B0E9AFEF7BCF9049B0C9A32
:101DF000FEF784FB2A463346FEF780FB0022144B95
:101E0000FEF782FB064603980D46000541190915A9
:101E1000002912DC30462946039AFEF7E5FBFFF75E
:101E2000CFF9042801D1FFF757FA30462946039A23
:101E3000FEF7DAFB064601E004E029180B463246BD
:101E400021460898FEF768FB1BB0F0BDB002000009
:101E50000000F03FF8B506460C46FEF724FC051ED0
:101E60000F4600D00120014349000B484908411AA0
:101E7000C90F0DD0002E01D0012100E000210C433C
:101E800061004908401AC00F02D10120FFF73EFA55
:101E900028463946F8BD00000000F07F10B502204A
:101EA00005490860054840690549084303494861F8
:101EB000FFF742FA10BD000000300240000002406F
:101EC0000350000001200C49087000200B490860F5
:101ED0000B48407B002809D000200A4908800A49A5
:101EE00008700A4908600A49086003E004488088CD
:101EF0000449088070470000580000205C00002062
:101F000078000020600000206200002064000020B3
:101F1000680000200021C16300BF03E0C16100220E
:101F20000262491C4029F9DB70470000F8B50446FD
:101F30000D460026002716A0FFF720F96420A060B8
:101F40002020A061A0616420206160615020206099
:101F50000420E063002002E0E0612562401C40288C
:101F6000FADB1920C00160620020A062E06201205B
:101F7000206300206063A06301206060002F04D014
:101F80000BA0FFF7FBF8012600273046F8BD000044
:101F90000AE9A9B1E58AA8E599A841E6ADA3E5BC9F
:101FA000A6E6B3A2E6B58BE8AF955C6E0000000034
:101FB0000AE99499E8AFAF203A20E9A9B1E58AA8E7
:101FC000E599A841E6B58BE8AF95E5A4B1E8B4A5DD
:101FD0000A0000006400E80380006400320002068A
:101FE0000201000000000000000000000000F03FBF
:101FF000000000000000F83F0000000000000000AA
:102000000000004003B8E23F0000000000000000B4
:1020100006D0CF43EBFD4C3E033333333333E33F42
:10202000FFAB6FDBB66DDB3F4D268F515555D53F6E
:1020300001411DA96074D13F65DBC9934A86CD3F3C
:10204000EF4E454A287ECA3F3E5555555555C53F2A
:1020500093BDBE166CC166BF2CDE25AF6A56113F1C
:10206000F16BD2C541BDBBBED0A4BE726937663E1E
:102070000000000000000000982000100000002078
:1020800078000000EC1200101021001078000020F1
:1020900010020000FC12001000000000020001000D
:1020A00000000000B0AD01000000000004000020AE
:1020B0000003000100000000050000000000000017
:1020C000000300000000000000000000000000000D
:1020D0000000000000000000000000000000000000
:1020E00000000000000000000000000000000000F0
:1020F00000000000000000000000000000000000E0
:102100000000000000E1F50500E1F5050000000019
:04000005100000C126
:00000001FF

View File

@ -3,9 +3,9 @@
<title>Static Call Graph - [.\Objects\ENS001_BASIC_PRJ.axf]</title></head>
<body><HR>
<H1>Static Call Graph for image .\Objects\ENS001_BASIC_PRJ.axf</H1><HR>
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Wed Aug 20 11:01:24 2025
<BR><P>#&#060CALLGRAPH&#062# ARM Linker, 5060750: Last Updated: Fri Aug 29 11:28:15 2025
<BR><P>
<H3>Maximum Stack Usage = 360 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
<H3>Maximum Stack Usage = 368 bytes + Unknown(Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
main &rArr; ClockInit &rArr; ClockInitSet &rArr; pow &rArr; __kernel_poly &rArr; __aeabi_dmul &rArr; _double_epilogue &rArr; _double_round
<P>
@ -56,7 +56,7 @@ Function Pointers
<LI><a href="#[13]">UART1_Handler</a> from ens1_uart.o(i.UART1_Handler) referenced from startup_cmsdk_cm0.o(RESET)
<LI><a href="#[1f]">WG_DRV_Handler</a> from startup_cmsdk_cm0.o(.text) referenced from startup_cmsdk_cm0.o(RESET)
<LI><a href="#[22]">__main</a> from entry.o(.ARM.Collect$$$$00000000) referenced from startup_cmsdk_cm0.o(.text)
<LI><a href="#[23]">fputc</a> from retarget.o(i.fputc) referenced from printf1.o(i.__0printf$1)
<LI><a href="#[23]">fputc</a> from retarget.o(i.fputc) referenced from printfb.o(i.__0printf$bare)
<LI><a href="#[20]">main</a> from mian.o(i.main) referenced from entry9a.o(.ARM.Collect$$$$0000000B)
</UL>
<P>
@ -196,12 +196,12 @@ Global Symbols
</UL>
<P><STRONG><a name="[77]"></a>__aeabi_uidiv</STRONG> (Thumb, 0 bytes, Stack size 12 bytes, uidiv.o(.text), UNUSED)
<P><STRONG><a name="[50]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text))
<P><STRONG><a name="[41]"></a>__aeabi_uidivmod</STRONG> (Thumb, 44 bytes, Stack size 12 bytes, uidiv.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 12<LI>Call Chain = __aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Init
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Process_Ramp
</UL>
<P><STRONG><a name="[3d]"></a>__aeabi_memcpy</STRONG> (Thumb, 36 bytes, Stack size 0 bytes, memcpya.o(.text))
@ -399,7 +399,7 @@ Global Symbols
<P><STRONG><a name="[51]"></a>CMSDK_timer_Init</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, ens1_timer.o(i.CMSDK_timer_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = CMSDK_timer_Init
</UL>
<BR>[Called By]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<BR>[Called By]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
</UL>
<P><STRONG><a name="[39]"></a>ClockInit</STRONG> (Thumb, 14 bytes, Stack size 8 bytes, ens1_clock.o(i.ClockInit))
@ -430,47 +430,54 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[3e]"></a>EMS_Process</STRONG> (Thumb, 86 bytes, Stack size 8 bytes, ens1_wavegen.o(i.EMS_Process))
<BR><BR>[Stack]<UL><LI>Max Depth = 60<LI>Call Chain = EMS_Process &rArr; wavegen_driverA_sine_test &rArr; puts &rArr; fputc &rArr; UartPutc
<P><STRONG><a name="[3e]"></a>EMS_Process</STRONG> (Thumb, 92 bytes, Stack size 8 bytes, ens1_wavegen.o(i.EMS_Process))
<BR><BR>[Stack]<UL><LI>Max Depth = 44<LI>Call Chain = EMS_Process &rArr; EMS_Process_Ramp &rArr; __aeabi_uidivmod
</UL>
<BR>[Calls]<UL><LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_driverA_sine_test
<BR>[Calls]<UL><LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_driverA_sine_test
<LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Process_Ramp
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[40]"></a>EMS_Start</STRONG> (Thumb, 14 bytes, Stack size 8 bytes, ens1_wavegen.o(i.EMS_Start))
<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = EMS_Start &rArr; __2printf
<P><STRONG><a name="[3f]"></a>EMS_Process_Ramp</STRONG> (Thumb, 278 bytes, Stack size 24 bytes, ens1_wavegen.o(i.EMS_Process_Ramp))
<BR><BR>[Stack]<UL><LI>Max Depth = 36<LI>Call Chain = EMS_Process_Ramp &rArr; __aeabi_uidivmod
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Start
<BR>[Calls]<UL><LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Process
</UL>
<P><STRONG><a name="[42]"></a>EMS_Start</STRONG> (Thumb, 8 bytes, Stack size 4 bytes, ens1_wavegen.o(i.EMS_Start))
<BR><BR>[Stack]<UL><LI>Max Depth = 4<LI>Call Chain = EMS_Start
</UL>
<BR>[Calls]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Start
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[43]"></a>EMS_Stop</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, ens1_wavegen.o(i.EMS_Stop))
<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = EMS_Stop &rArr; __2printf
<P><STRONG><a name="[44]"></a>EMS_Stop</STRONG> (Thumb, 36 bytes, Stack size 4 bytes, ens1_wavegen.o(i.EMS_Stop))
<BR><BR>[Stack]<UL><LI>Max Depth = 4<LI>Call Chain = EMS_Stop
</UL>
<BR>[Calls]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Stop
<BR>[Calls]<UL><LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Stop
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[46]"></a>GPIO_AltFunction</STRONG> (Thumb, 86 bytes, Stack size 8 bytes, ens1_gpio.o(i.GPIO_AltFunction))
<P><STRONG><a name="[47]"></a>GPIO_AltFunction</STRONG> (Thumb, 86 bytes, Stack size 8 bytes, ens1_gpio.o(i.GPIO_AltFunction))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = GPIO_AltFunction
</UL>
<BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Init
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_IO_Init
<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_IO_Init
</UL>
<P><STRONG><a name="[48]"></a>GPIO_GetOutputValue</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, ens1_gpio.o(i.GPIO_GetOutputValue))
<BR><BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
<P><STRONG><a name="[49]"></a>GPIO_GetOutputValue</STRONG> (Thumb, 18 bytes, Stack size 0 bytes, ens1_gpio.o(i.GPIO_GetOutputValue))
<BR><BR>[Called By]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
</UL>
<P><STRONG><a name="[45]"></a>GPIO_IO_Init</STRONG> (Thumb, 342 bytes, Stack size 36 bytes, ens1_gpio.o(i.GPIO_IO_Init))
<P><STRONG><a name="[46]"></a>GPIO_IO_Init</STRONG> (Thumb, 342 bytes, Stack size 36 bytes, ens1_gpio.o(i.GPIO_IO_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 44<LI>Call Chain = GPIO_IO_Init &rArr; GPIO_AltFunction
</UL>
<BR>[Calls]<UL><LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_AltFunction
<BR>[Calls]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_AltFunction
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
@ -479,31 +486,31 @@ Global Symbols
<BR><BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[47]"></a>GPIO_Overturn</STRONG> (Thumb, 40 bytes, Stack size 4 bytes, ens1_gpio.o(i.GPIO_Overturn))
<P><STRONG><a name="[48]"></a>GPIO_Overturn</STRONG> (Thumb, 40 bytes, Stack size 4 bytes, ens1_gpio.o(i.GPIO_Overturn))
<BR><BR>[Stack]<UL><LI>Max Depth = 4<LI>Call Chain = GPIO_Overturn
</UL>
<BR>[Calls]<UL><LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_SetOutput
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_ResetOutput
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_GetOutputValue
<BR>[Calls]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_SetOutput
<LI><a href="#[4a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_ResetOutput
<LI><a href="#[49]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_GetOutputValue
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[49]"></a>GPIO_ResetOutput</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, ens1_gpio.o(i.GPIO_ResetOutput))
<BR><BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
<P><STRONG><a name="[4a]"></a>GPIO_ResetOutput</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, ens1_gpio.o(i.GPIO_ResetOutput))
<BR><BR>[Called By]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
</UL>
<P><STRONG><a name="[4a]"></a>GPIO_SetOutput</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, ens1_gpio.o(i.GPIO_SetOutput))
<BR><BR>[Called By]<UL><LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
<P><STRONG><a name="[4b]"></a>GPIO_SetOutput</STRONG> (Thumb, 16 bytes, Stack size 0 bytes, ens1_gpio.o(i.GPIO_SetOutput))
<BR><BR>[Called By]<UL><LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
</UL>
<P><STRONG><a name="[67]"></a>MTP_init</STRONG> (Thumb, 4 bytes, Stack size 0 bytes, ens1_mtp.o(i.MTP_init))
<BR><BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[4d]"></a>PCLK_Enable</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, ens1_clock.o(i.PCLK_Enable))
<P><STRONG><a name="[4e]"></a>PCLK_Enable</STRONG> (Thumb, 20 bytes, Stack size 0 bytes, ens1_clock.o(i.PCLK_Enable))
<BR><BR>[Called By]<UL><LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Init
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
</UL>
<P><STRONG><a name="[21]"></a>SystemInit</STRONG> (Thumb, 8 bytes, Stack size 0 bytes, system_cmsdk_cm0.o(i.SystemInit))
@ -512,20 +519,19 @@ Global Symbols
<P><STRONG><a name="[1b]"></a>TIMER0_Handler</STRONG> (Thumb, 24 bytes, Stack size 4 bytes, ens1_timer.o(i.TIMER0_Handler))
<BR><BR>[Stack]<UL><LI>Max Depth = 4<LI>Call Chain = TIMER0_Handler
</UL>
<BR>[Calls]<UL><LI><a href="#[4b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Time_Manager_Process
<BR>[Calls]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Time_Manager_Process
</UL>
<BR>[Address Reference Count : 1]<UL><LI> startup_cmsdk_cm0.o(RESET)
</UL>
<P><STRONG><a name="[4c]"></a>TIMER0_Init</STRONG> (Thumb, 72 bytes, Stack size 16 bytes, ens1_timer.o(i.TIMER0_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = TIMER0_Init &rArr; __2printf
<P><STRONG><a name="[4d]"></a>TIMER0_Init</STRONG> (Thumb, 56 bytes, Stack size 16 bytes, ens1_timer.o(i.TIMER0_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 28<LI>Call Chain = TIMER0_Init &rArr; __aeabi_uidivmod
</UL>
<BR>[Calls]<UL><LI><a href="#[51]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;CMSDK_timer_Init
<LI><a href="#[52]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_EnableIRQ
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_DisableIRQ
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_ClearPendingIRQ
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;PCLK_Enable
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<LI><a href="#[4f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_DisableIRQ
<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;NVIC_ClearPendingIRQ
<LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;PCLK_Enable
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
@ -546,7 +552,7 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[4b]"></a>Time_Manager_Process</STRONG> (Thumb, 174 bytes, Stack size 0 bytes, ens1_timer.o(i.Time_Manager_Process))
<P><STRONG><a name="[4c]"></a>Time_Manager_Process</STRONG> (Thumb, 174 bytes, Stack size 0 bytes, ens1_timer.o(i.Time_Manager_Process))
<BR><BR>[Called By]<UL><LI><a href="#[1b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Handler
</UL>
@ -587,12 +593,12 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[5b]"></a>UART_Init</STRONG> (Thumb, 164 bytes, Stack size 24 bytes, ens1_uart.o(i.UART_Init))
<P><STRONG><a name="[5b]"></a>UART_Init</STRONG> (Thumb, 248 bytes, Stack size 24 bytes, ens1_uart.o(i.UART_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 36<LI>Call Chain = UART_Init &rArr; __aeabi_uidivmod
</UL>
<BR>[Calls]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;PCLK_Enable
<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_AltFunction
<LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
<BR>[Calls]<UL><LI><a href="#[4e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;PCLK_Enable
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_AltFunction
<LI><a href="#[41]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
@ -612,18 +618,16 @@ Global Symbols
<BR><BR>[Called By]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UartPutc
</UL>
<P><STRONG><a name="[5e]"></a>__0printf$1</STRONG> (Thumb, 24 bytes, Stack size 24 bytes, printf1.o(i.__0printf$1), UNUSED)
<P><STRONG><a name="[5e]"></a>__0printf$bare</STRONG> (Thumb, 12 bytes, Stack size 8 bytes, printfb.o(i.__0printf$bare), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[5f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;_printf_core
</UL>
<P><STRONG><a name="[83]"></a>__1printf$1</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf1.o(i.__0printf$1), UNUSED)
<P><STRONG><a name="[83]"></a>__1printf$bare</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, printfb.o(i.__0printf$bare), UNUSED)
<P><STRONG><a name="[42]"></a>__2printf</STRONG> (Thumb, 0 bytes, Stack size 24 bytes, printf1.o(i.__0printf$1))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = __2printf
<P><STRONG><a name="[70]"></a>__2printf</STRONG> (Thumb, 0 bytes, Stack size 8 bytes, printfb.o(i.__0printf$bare))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = __2printf
</UL>
<BR>[Called By]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Stop
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Start
<BR>[Called By]<UL><LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_driverA_sine_test
</UL>
<P><STRONG><a name="[30]"></a>__ARM_clz</STRONG> (Thumb, 46 bytes, Stack size 0 bytes, depilogue.o(i.__ARM_clz))
@ -694,7 +698,7 @@ Global Symbols
<LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
</UL>
<P><STRONG><a name="[70]"></a>boost_voltage_select_26V</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, ens1_boost.o(i.boost_voltage_select_26V))
<P><STRONG><a name="[6f]"></a>boost_voltage_select_55V</STRONG> (Thumb, 12 bytes, Stack size 0 bytes, ens1_boost.o(i.boost_voltage_select_55V))
<BR><BR>[Called By]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Init
</UL>
@ -703,25 +707,23 @@ Global Symbols
</UL>
<BR>[Calls]<UL><LI><a href="#[57]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UartPutc
</UL>
<BR>[Called By]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;puts
<BR>[Address Reference Count : 1]<UL><LI> printfb.o(i.__0printf$bare)
</UL>
<BR>[Address Reference Count : 1]<UL><LI> printf1.o(i.__0printf$1)
</UL>
<P><STRONG><a name="[20]"></a>main</STRONG> (Thumb, 220 bytes, Stack size 24 bytes, mian.o(i.main))
<BR><BR>[Stack]<UL><LI>Max Depth = 360<LI>Call Chain = main &rArr; ClockInit &rArr; ClockInitSet &rArr; pow &rArr; __kernel_poly &rArr; __aeabi_dmul &rArr; _double_epilogue &rArr; _double_round
<P><STRONG><a name="[20]"></a>main</STRONG> (Thumb, 222 bytes, Stack size 32 bytes, mian.o(i.main))
<BR><BR>[Stack]<UL><LI>Max Depth = 368<LI>Call Chain = main &rArr; ClockInit &rArr; ClockInitSet &rArr; pow &rArr; __kernel_poly &rArr; __aeabi_dmul &rArr; _double_epilogue &rArr; _double_round
</UL>
<BR>[Calls]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Init
<LI><a href="#[5b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_Init
<LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_ITConfig
<LI><a href="#[53]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Time_Manager_Init
<LI><a href="#[6a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;Time_Manager_GetFlags
<LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<LI><a href="#[67]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;MTP_init
<LI><a href="#[47]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
<LI><a href="#[48]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Overturn
<LI><a href="#[68]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_Output
<LI><a href="#[45]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_IO_Init
<LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Stop
<LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Start
<LI><a href="#[46]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;GPIO_IO_Init
<LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Stop
<LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Start
<LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Process
<LI><a href="#[3c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Configure
<LI><a href="#[39]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ClockInit
@ -752,15 +754,6 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[3a]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;ClockInitSet
</UL>
<P><STRONG><a name="[6f]"></a>puts</STRONG> (Thumb, 28 bytes, Stack size 8 bytes, puts.o(i.puts))
<BR><BR>[Stack]<UL><LI>Max Depth = 28<LI>Call Chain = puts &rArr; fputc &rArr; UartPutc
</UL>
<BR>[Calls]<UL><LI><a href="#[23]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;fputc
</UL>
<BR>[Called By]<UL><LI><a href="#[69]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_Init
<LI><a href="#[3f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;wavegen_driverA_sine_test
</UL>
<P><STRONG><a name="[6c]"></a>sqrt</STRONG> (Thumb, 66 bytes, Stack size 24 bytes, sqrt.o(i.sqrt))
<BR><BR>[Stack]<UL><LI>Max Depth = 64<LI>Call Chain = sqrt &rArr; _dsqrt &rArr; _double_round
</UL>
@ -770,27 +763,26 @@ Global Symbols
<BR>[Called By]<UL><LI><a href="#[3b]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;pow
</UL>
<P><STRONG><a name="[69]"></a>wavegen_Init</STRONG> (Thumb, 32 bytes, Stack size 8 bytes, ens1_wavegen.o(i.wavegen_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 36<LI>Call Chain = wavegen_Init &rArr; puts &rArr; fputc &rArr; UartPutc
<P><STRONG><a name="[69]"></a>wavegen_Init</STRONG> (Thumb, 26 bytes, Stack size 8 bytes, ens1_wavegen.o(i.wavegen_Init))
<BR><BR>[Stack]<UL><LI>Max Depth = 8<LI>Call Chain = wavegen_Init
</UL>
<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;boost_voltage_select_26V
<LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;puts
<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;boost_voltage_select_55V
</UL>
<BR>[Called By]<UL><LI><a href="#[20]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;main
</UL>
<P><STRONG><a name="[41]"></a>wavegen_Start</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, ens1_wavegen.o(i.wavegen_Start))
<BR><BR>[Called By]<UL><LI><a href="#[40]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Start
<P><STRONG><a name="[43]"></a>wavegen_Start</STRONG> (Thumb, 50 bytes, Stack size 0 bytes, ens1_wavegen.o(i.wavegen_Start))
<BR><BR>[Called By]<UL><LI><a href="#[42]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Start
</UL>
<P><STRONG><a name="[44]"></a>wavegen_Stop</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, ens1_wavegen.o(i.wavegen_Stop))
<BR><BR>[Called By]<UL><LI><a href="#[43]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Stop
<P><STRONG><a name="[45]"></a>wavegen_Stop</STRONG> (Thumb, 22 bytes, Stack size 0 bytes, ens1_wavegen.o(i.wavegen_Stop))
<BR><BR>[Called By]<UL><LI><a href="#[44]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Stop
</UL>
<P><STRONG><a name="[3f]"></a>wavegen_driverA_sine_test</STRONG> (Thumb, 98 bytes, Stack size 24 bytes, ens1_wavegen.o(i.wavegen_driverA_sine_test))
<BR><BR>[Stack]<UL><LI>Max Depth = 52<LI>Call Chain = wavegen_driverA_sine_test &rArr; puts &rArr; fputc &rArr; UartPutc
<P><STRONG><a name="[40]"></a>wavegen_driverA_sine_test</STRONG> (Thumb, 98 bytes, Stack size 24 bytes, ens1_wavegen.o(i.wavegen_driverA_sine_test))
<BR><BR>[Stack]<UL><LI>Max Depth = 32<LI>Call Chain = wavegen_driverA_sine_test &rArr; __2printf
</UL>
<BR>[Calls]<UL><LI><a href="#[6f]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;puts
<BR>[Calls]<UL><LI><a href="#[70]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__2printf
</UL>
<BR>[Called By]<UL><LI><a href="#[3e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;EMS_Process
</UL>
@ -812,22 +804,20 @@ Local Symbols
<BR><BR>[Called By]<UL><LI><a href="#[58]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;UART_ITConfig
</UL>
<P><STRONG><a name="[4f]"></a>NVIC_ClearPendingIRQ</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, ens1_timer.o(i.NVIC_ClearPendingIRQ))
<BR><BR>[Called By]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<P><STRONG><a name="[50]"></a>NVIC_ClearPendingIRQ</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, ens1_timer.o(i.NVIC_ClearPendingIRQ))
<BR><BR>[Called By]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
</UL>
<P><STRONG><a name="[4e]"></a>NVIC_DisableIRQ</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, ens1_timer.o(i.NVIC_DisableIRQ))
<BR><BR>[Called By]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<P><STRONG><a name="[4f]"></a>NVIC_DisableIRQ</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, ens1_timer.o(i.NVIC_DisableIRQ))
<BR><BR>[Called By]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
</UL>
<P><STRONG><a name="[52]"></a>NVIC_EnableIRQ</STRONG> (Thumb, 14 bytes, Stack size 0 bytes, ens1_timer.o(i.NVIC_EnableIRQ))
<BR><BR>[Called By]<UL><LI><a href="#[4c]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
<BR><BR>[Called By]<UL><LI><a href="#[4d]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;TIMER0_Init
</UL>
<P><STRONG><a name="[5f]"></a>_printf_core</STRONG> (Thumb, 332 bytes, Stack size 88 bytes, printf1.o(i._printf_core), UNUSED)
<BR><BR>[Calls]<UL><LI><a href="#[50]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__aeabi_uidivmod
</UL>
<BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0printf$1
<P><STRONG><a name="[5f]"></a>_printf_core</STRONG> (Thumb, 30 bytes, Stack size 24 bytes, printfb.o(i._printf_core), UNUSED)
<BR><BR>[Called By]<UL><LI><a href="#[5e]">&gt;&gt;</a>&nbsp;&nbsp;&nbsp;__0printf$bare
</UL>
<P>
<H3>

View File

@ -1,8 +1,9 @@
Dependencies for Project 'ENS001_BASIC_PRJ', Target 'ENS001_BASIC_PRJ': (DO NOT MODIFY !)
CompilerVersion: 5060750::V5.06 update 6 (build 750)::.\ARM_Compiler_5.06u7
F (.\USER\mian.c)(0x68A53A7B)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\mian.o --omf_browse .\objects\mian.crf --depend .\objects\mian.d)
I (USER\my_header.h)(0x689C4B9B)
F (.\USER\mian.c)(0x68B11E1F)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\mian.o --omf_browse .\objects\mian.crf --depend .\objects\mian.d)
I (USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
@ -11,17 +12,17 @@ I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
I (.\FWLIB\include\ENS1_TIMER.h)(0x68A5333E)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\USER\my_header.h)(0x68B11CC5)
I (.\FWLIB\include\ENS1_MTP.h)(0x65605CD6)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdlib.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
I (.\FWLIB\include\ENS1_UART.h)(0x689C4BC8)
I (.\FWLIB\include\ENS1_GPIO.h)(0x656546CE)
I (.\FWLIB\include\ENS1_WAVEGEN.h)(0x68A53A7B)
F (.\FWLIB\source\ENS1_UART.c)(0x689C4BE6)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_uart.o --omf_browse .\objects\ens1_uart.crf --depend .\objects\ens1_uart.d)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\FWLIB\include\ENS1_UART.h)(0x68B10579)
I (.\FWLIB\include\ENS1_GPIO.h)(0x68B11DDD)
I (.\FWLIB\include\ENS1_WAVEGEN.h)(0x68A53F9C)
F (.\FWLIB\source\ENS1_UART.c)(0x68B117BC)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_uart.o --omf_browse .\objects\ens1_uart.crf --depend .\objects\ens1_uart.d)
I (.\USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
@ -30,12 +31,13 @@ I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
I (.\FWLIB\include\ENS1_TIMER.h)(0x68A5333E)
I (.\FWLIB\include\ENS1_UART.h)(0x689C4BC8)
I (.\FWLIB\include\ENS1_UART.h)(0x68B10579)
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
I (.\FWLIB\include\ENS1_GPIO.h)(0x656546CE)
I (.\FWLIB\include\ENS1_GPIO.h)(0x68B11DDD)
F (.\FWLIB\source\ENS1_GPIO.c)(0x689C4B85)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_gpio.o --omf_browse .\objects\ens1_gpio.crf --depend .\objects\ens1_gpio.d)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
@ -44,8 +46,8 @@ I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
I (.\FWLIB\include\ENS1_TIMER.h)(0x68A5333E)
I (.\FWLIB\include\ENS1_GPIO.h)(0x656546CE)
F (.\FWLIB\source\ENS1_MTP.c)(0x680B4E85)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_mtp.o --omf_browse .\objects\ens1_mtp.crf --depend .\objects\ens1_mtp.d)
I (.\FWLIB\include\ENS1_GPIO.h)(0x68B11DDD)
F (.\FWLIB\source\ENS1_MTP.c)(0x68B10C84)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_mtp.o --omf_browse .\objects\ens1_mtp.crf --depend .\objects\ens1_mtp.d)
I (.\FWLIB\include\ENS1_MTP.h)(0x65605CD6)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
@ -55,14 +57,15 @@ I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdlib.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\FWLIB\include\ENS1_TIMER.h)(0x68A5333E)
F (.\FWLIB\source\ENS1_CLOCK.c)(0x68A5300C)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_clock.o --omf_browse .\objects\ens1_clock.crf --depend .\objects\ens1_clock.d)
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
@ -82,7 +85,7 @@ I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
F (.\FWLIB\source\ENS1_TIMER.c)(0x68A53735)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_timer.o --omf_browse .\objects\ens1_timer.crf --depend .\objects\ens1_timer.d)
F (.\FWLIB\source\ENS1_TIMER.c)(0x68B11CB3)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_timer.o --omf_browse .\objects\ens1_timer.crf --depend .\objects\ens1_timer.d)
I (.\FWLIB\include\ENS1_TIMER.h)(0x68A5333E)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
@ -90,34 +93,36 @@ I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\FWLIB\include\ENS_CURRENT_CALIBRATION.h)(0x6566A27C)
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
F (.\FWLIB\source\ENS1_BOOST.c)(0x689E9D44)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_boost.o --omf_browse .\objects\ens1_boost.crf --depend .\objects\ens1_boost.d)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (.\FWLIB\include\ENS1_BOOST.h)(0x689E9D44)
I (.\FWLIB\include\ENS1_BOOST.h)(0x68B11D22)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
F (.\FWLIB\source\ENS1_WAVEGEN.c)(0x68A53A7B)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_wavegen.o --omf_browse .\objects\ens1_wavegen.crf --depend .\objects\ens1_wavegen.d)
F (.\FWLIB\source\ENS1_WAVEGEN.c)(0x68B11C3C)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\ens1_wavegen.o --omf_browse .\objects\ens1_wavegen.crf --depend .\objects\ens1_wavegen.d)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdio.h)(0x599ECD2C)
I (.\FWLIB\include\ENS1_WAVEGEN.h)(0x68A53A7B)
I (.\FWLIB\include\ENS1_WAVEGEN.h)(0x68A53F9C)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)
I (.\CORE\INCLUDE\core_cm0.h)(0x63648DE6)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
I (.\CORE\INCLUDE\core_cmInstr.h)(0x63648DE6)
I (.\CORE\INCLUDE\core_cmFunc.h)(0x63648DE6)
I (.\CORE\INCLUDE\system_CMSDK_CM0.h)(0x63648DE6)
I (.\USER\my_header.h)(0x689C4B9B)
I (.\USER\my_header.h)(0x68B11CC5)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\string.h)(0x599ECD2C)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\math.h)(0x599ECD2E)
I (.\FWLIB\include\ENS1_TIMER.h)(0x68A5333E)
I (.\FWLIB\include\ENS1_CLOCK.h)(0x68358097)
I (.\FWLIB\include\ENS1_BOOST.h)(0x689E9D44)
I (.\FWLIB\include\ENS1_BOOST.h)(0x68B11D22)
F (.\CORE\system_CMSDK_CM0.c)(0x63648DE6)(--c99 -c --cpu Cortex-M0 -D__MICROLIB --li -g -O0 --apcs=interwork --split_sections -I .\CORE\INCLUDE -I .\USER -I .\FWLIB\include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARMCM0\Include -ID:\Keil_v5\ARM\Packs\ARM\Cortex_DFP\1.1.0\Device\ARM\ARMCM0\Include -D__UVISION_VERSION="538" -DARMCM0 -o .\objects\system_cmsdk_cm0.o --omf_browse .\objects\system_cmsdk_cm0.crf --depend .\objects\system_cmsdk_cm0.d)
I (D:\Keil_v5\ARM\ARM_Compiler_5.06u7\include\stdint.h)(0x599ECD2E)
I (.\CORE\INCLUDE\CMSDK_CM0.h)(0x64D5ADE8)

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,6 +2,7 @@
.\objects\ens1_clock.o: .\FWLIB\include\ENS1_CLOCK.h
.\objects\ens1_clock.o: .\USER\my_header.h
.\objects\ens1_clock.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
.\objects\ens1_clock.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\ens1_clock.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
.\objects\ens1_clock.o: .\CORE\INCLUDE\CMSDK_CM0.h
.\objects\ens1_clock.o: .\CORE\INCLUDE\core_cm0.h

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,7 @@
.\objects\ens1_gpio.o: FWLIB\source\ENS1_GPIO.c
.\objects\ens1_gpio.o: .\USER\my_header.h
.\objects\ens1_gpio.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
.\objects\ens1_gpio.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\ens1_gpio.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
.\objects\ens1_gpio.o: .\CORE\INCLUDE\CMSDK_CM0.h
.\objects\ens1_gpio.o: .\CORE\INCLUDE\core_cm0.h

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -8,6 +8,7 @@
.\objects\ens1_timer.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
.\objects\ens1_timer.o: .\USER\my_header.h
.\objects\ens1_timer.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
.\objects\ens1_timer.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\ens1_timer.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
.\objects\ens1_timer.o: .\FWLIB\include\ENS1_TIMER.h
.\objects\ens1_timer.o: .\FWLIB\include\ENS_CURRENT_CALIBRATION.h

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,7 @@
.\objects\ens1_uart.o: FWLIB\source\ENS1_UART.c
.\objects\ens1_uart.o: .\USER\my_header.h
.\objects\ens1_uart.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
.\objects\ens1_uart.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\ens1_uart.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
.\objects\ens1_uart.o: .\CORE\INCLUDE\CMSDK_CM0.h
.\objects\ens1_uart.o: .\CORE\INCLUDE\core_cm0.h

Binary file not shown.

Binary file not shown.

View File

@ -8,6 +8,7 @@
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\core_cmFunc.h
.\objects\ens1_wavegen.o: .\CORE\INCLUDE\system_CMSDK_CM0.h
.\objects\ens1_wavegen.o: .\USER\my_header.h
.\objects\ens1_wavegen.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\ens1_wavegen.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
.\objects\ens1_wavegen.o: .\FWLIB\include\ENS1_TIMER.h
.\objects\ens1_wavegen.o: .\USER\my_header.h

Binary file not shown.

Binary file not shown.

View File

@ -1,6 +1,7 @@
.\objects\mian.o: USER\mian.c
.\objects\mian.o: USER\my_header.h
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdio.h
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\math.h
.\objects\mian.o: .\CORE\INCLUDE\CMSDK_CM0.h
.\objects\mian.o: .\CORE\INCLUDE\core_cm0.h
@ -12,7 +13,6 @@
.\objects\mian.o: .\USER\my_header.h
.\objects\mian.o: .\FWLIB\include\ENS1_MTP.h
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\stdlib.h
.\objects\mian.o: D:\Keil_v5\ARM\ARM_Compiler_5.06u7\Bin\..\include\string.h
.\objects\mian.o: .\FWLIB\include\ENS1_CLOCK.h
.\objects\mian.o: .\FWLIB\include\ENS1_UART.h
.\objects\mian.o: .\FWLIB\include\ENS1_GPIO.h

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +1,4 @@
/*Copyright (C),2023 , NANOCHAP
/*Copyright (C),2023 , NANOCHAP
*File name:
*Author: Martin
*Version: V1.0

View File

@ -1,7 +1,9 @@
#ifndef MY_HEADER_H
#ifndef MY_HEADER_H
#define MY_HEADER_H
#include <stdio.h>
#include <string.h>
#include <math.h>
#include "CMSDK_CM0.h"
#include "ENS1_TIMER.h"
@ -22,32 +24,32 @@ typedef enum {OUTPUT = 0, INPUT = !OUTPUT} I_O_SELECT;
typedef enum {oversamp_16 = 0, oversamp_13=!oversamp_16} OverSampModeSel;
typedef enum
{
GPIO_PU = 0x00, //上拉
GPIO_PD = 0x01, //下拉
GPIO_NOPULL = 0x02 //无上下拉
GPIO_PU = 0x00, //上拉
GPIO_PD = 0x01, //下拉
GPIO_NOPULL = 0x02 //无上下拉
}GPIO_PUPD_TypeDef;
//输出速度选择枚举
//输出速度选择枚举
typedef enum
{
OUTPUT_FAST = 0x00, //快速
OUTPUT_SLOW = 0x01 //慢速
OUTPUT_FAST = 0x00, //快速
OUTPUT_SLOW = 0x01 //慢速
}OUTPUT_SPEED_TypeDef;
//输出模式选择枚举
//输出模式选择枚举
typedef enum
{
GPIO_OType_PP = 0x00, //推挽输出
GPIO_OType_OD = 0x01 //开漏输出
GPIO_OType_PP = 0x00, //推挽输出
GPIO_OType_OD = 0x01 //开漏输出
}GPIOOType_TypeDef;
//驱动强度选择枚举
//驱动强度选择枚举
typedef enum
{
PDRV_4mA = 0x00, //输出驱动强度4mA
PDRV_8mA, //输出驱动强度8mA
PDRV_14mA, //输出驱动强度14mA
PDRV_16mA //输出驱动强度16mA
PDRV_4mA = 0x00, //输出驱动强度4mA
PDRV_8mA, //输出驱动强度8mA
PDRV_14mA, //输出驱动强度14mA
PDRV_16mA //输出驱动强度16mA
}OUTPUT_PDRV_TypeDef;

View File

@ -4,14 +4,14 @@
*Author:
*Version: V1.0
*Date: 2023-11-
*Description: TIMER0 +
*Description: TIMER0 +
*Function List:
History:
1.V1.0
Date:
Author:
Modification:
Modification:
*/
#include "my_header.h"
@ -23,116 +23,104 @@ Modification:
#include "ENS1_WAVEGEN.h"
int main(){
// 初始化系统
// 初始化系统
MTP_init();
ClockInit();
// 初始化GPIO19用于定时器指示
GPIO_IO_Init(GPIO_19, OUTPUT, 0x00, 0x02, 0x00, 0x00, ENABLE);
// 初始化GPIO19用于定时器指示
GPIO_IO_Init(GPIO_19, OUTPUT, GPIO_OType_PP, GPIO_NOPULL, OUTPUT_FAST, PDRV_4mA, ENABLE);
GPIO_Output(GPIO_19, LOW_LEVEL);
// 初始化UART
// 初始化UART
UART_Init(CMSDK_UART1, &UART1_Init);
UART_ITConfig(CMSDK_UART1, &UART1_ITSet);
// 初始化定时器在wavegen_Init之前
// 初始化定时器在wavegen_Init之前
TIMER0_Init(1);
// 初始化时间管理器
// 初始化时间管理器
Time_Manager_Init();
// 添加调试信息
// printf("APB_Clock_Freq: %d Hz\n", APB_Clock_Freq);
// printf("TIMER0初始化完成\n");
// 初始化波形生成器(电刺激)
// 初始化波形生成器(电刺激)
wavegen_Init();
// 配置电刺激参数
// 配置电刺激参数
EMS_Config_TypeDef ems_config = {
.frequency = 100, // 100Hz
.duration = 1000, // 1000ms
.intensity = 128, // 中等强度
.rest_time = 100, // 100ms休息时间
.silent_time = 50 // 50ms静默时间
.intensity = 128, // 中等强度
.rest_time = 100, // 100ms休息时间
.silent_time = 50, // 50ms静默时间
// 缓进缓出控制参数
.ramp_up_time = 2, // 缓进时间2秒
.hold_time = 6, // 保持时间6秒
.ramp_down_time = 2, // 缓出时间2秒
.enable_ramp = 1 // 启用渐进控制
};
EMS_Configure(&ems_config);
// 启动电刺激
// 启动电刺激
EMS_Start();
// printf("========================================\n");
// printf("定时器电刺激综合测试启动\n");
// printf("========================================\n");
// printf("GPIO19: 定时器指示1秒翻转\n");
// printf("电刺激: 方波输出强度128\n");
// printf("系统时钟: 32MHz HSI\n");
// printf("升压电压: 26V\n");
// printf("UART波特率: 115200\n");
// printf("========================================\n");
// 电刺激控制变量需要在main函数外部定义
static uint8_t ems_control_count = 0; // 电刺激控制计数器
static uint8_t ems_state = 0; // 电刺激状态0=关闭1=开启
static uint8_t ems_control_count = 0; // 电刺激控制计数器
static uint8_t ems_state = 0; // 电刺激状态0=关闭1=开启
while(1)
{
// 获取时间标志位
{
// 获取时间标志位
Time_Flag_TypeDef* time_flags = Time_Manager_GetFlags();
// 处理电刺激(在主循环中运行)
// 注意这里不再直接调用EMS_Process(),而是通过状态控制
// 处理电刺激(在主循环中运行)
// 注意这里不再直接调用EMS_Process(),而是通过状态控制
// 基于时间标志位执行不同周期的任务
// 基于时间标志位执行不同周期的任务
if (time_flags->T_2ms) {
// 2ms周期任务 - 高频控制任务
time_flags->T_2ms = 0; // 清除标志位
// 2ms周期任务 - 高频控制任务
time_flags->T_2ms = 0; // 清除标志位
}
if (time_flags->T_10ms) {
// 10ms周期任务 - 中频控制任务
time_flags->T_10ms = 0; // 清除标志位
// 10ms周期任务 - 中频控制任务
time_flags->T_10ms = 0; // 清除标志位
}
if (time_flags->T_100ms) {
// 100ms周期任务 - 低频控制任务
time_flags->T_100ms = 0; // 清除标志位
// 100ms周期任务 - 低频控制任务
time_flags->T_100ms = 0; // 清除标志位
}
if (time_flags->T_1s) {
// 1s周期任务 - 超低频任务
ems_control_count++; // 每秒递增计数器
// 1s周期任务 - 超低频任务
ems_control_count++; // 每秒递增计数器
// 间断性放电控制逻辑
// 间断性放电控制逻辑
if (ems_control_count <= 10) {
// 前10秒开启电刺激
// 前10秒开启电刺激
if (ems_state == 0) {
ems_state = 1;
EMS_Start(); // 启动电刺激
// printf("电刺激开启 - 第%d秒\n", ems_control_count);
EMS_Start(); // 启动电刺激
}
// 处理电刺激
// 处理电刺激
EMS_Process();
} else if (ems_control_count <= 20) {
// 后10秒关闭电刺激
// 后10秒关闭电刺激
if (ems_state == 1) {
ems_state = 0;
EMS_Stop(); // 停止电刺激
// printf("电刺激关闭 - 第%d秒\n", ems_control_count);
EMS_Stop(); // 停止电刺激
}
} else {
// 重置计数器,开始新的周期
ems_control_count = 0;
// printf("电刺激周期重置\n");
// 重置计数器,开始新的周期
ems_control_count = 0;
}
GPIO_Overturn(GPIO_19); // GPIO19翻转
// printf("1s定时任务执行 - 系统运行正常,电刺激状态: %s\n",
// ems_state ? "开启" : "关闭");
time_flags->T_1s = 0; // 清除标志位
GPIO_Overturn(GPIO_19); // GPIO19翻转
time_flags->T_1s = 0; // 清除标志位
}
// 定时器中断处理在 TIMER0_Handler() 中
// 定时器中断处理在 TIMER0_Handler() 中
}
}

254
缓进缓出功能说明.md Normal file
View File

@ -0,0 +1,254 @@
# 缓进缓出功能说明
## 功能概述
缓进缓出功能实现了电刺激强度的渐进式控制避免突然的强度变化给用户带来的不适感。整个10秒的电刺激周期被分为三个阶段
- **缓进阶段2秒**强度从0逐渐增加到设定最大值
- **保持阶段6秒**:保持最大强度
- **缓出阶段2秒**强度从最大值逐渐降低到0
## 实现原理
### 1. 时间控制
基于2ms定时器中断实现精确的强度控制
```c
// 计算每个强度步进的时间间隔(微秒)
uint32_t step_interval = (g_ems_config.ramp_up_time * 2000000) / g_ems_config.intensity;
// 例如2秒 = 2000000微秒强度128则每15625微秒增加1个强度单位
```
### 2. 强度计算
根据您的计算:
- 总时间2秒 = 2,000,000微秒
- 目标强度128
- 步进间隔2,000,000 / 128 = 15,625微秒
- 每15,625微秒增加/减少1个强度单位
### 3. 阶段控制
```c
switch (g_ramp_phase) {
case 0: // 缓进阶段
// 强度从0增加到设定值
break;
case 1: // 保持阶段
// 保持最大强度
break;
case 2: // 缓出阶段
// 强度从设定值降低到0
break;
}
```
## 配置参数
### 1. 结构体定义
```c
typedef struct {
uint16_t frequency; // 频率 (Hz)
uint16_t duration; // 持续时间 (ms)
uint16_t intensity; // 强度 (0-255)
uint16_t rest_time; // 休息时间 (ms)
uint16_t silent_time; // 静默时间 (ms)
// 缓进缓出控制参数
uint8_t ramp_up_time; // 缓进时间2秒
uint8_t hold_time; // 保持时间6秒
uint8_t ramp_down_time; // 缓出时间2秒
uint8_t enable_ramp; // 启用渐进控制
} EMS_Config_TypeDef;
```
### 2. 当前配置
```c
EMS_Config_TypeDef ems_config = {
.frequency = 100, // 100Hz
.duration = 1000, // 1000ms
.intensity = 128, // 中等强度
.rest_time = 100, // 100ms休息时间
.silent_time = 50, // 50ms静默时间
// 缓进缓出控制参数
.ramp_up_time = 2, // 缓进时间2秒
.hold_time = 6, // 保持时间6秒
.ramp_down_time = 2, // 缓出时间2秒
.enable_ramp = 1 // 启用渐进控制
};
```
## 工作流程
### 1. 系统启动
- 初始化缓进缓出变量
- 设置初始强度为0
- 进入缓进阶段
### 2. 缓进阶段0-2秒
- 每15,625微秒增加1个强度单位
- 从0逐渐增加到128
- 2秒后进入保持阶段
### 3. 保持阶段2-8秒
- 保持强度为128
- 持续6秒
- 8秒后进入缓出阶段
### 4. 缓出阶段8-10秒
- 每15,625微秒减少1个强度单位
- 从128逐渐降低到0
- 10秒后停止电刺激
### 5. 休息阶段10-20秒
- 电刺激完全停止
- 持续10秒
- 20秒后重新开始新周期
## 关键函数
### 1. 缓进缓出处理函数
```c
void EMS_Process_Ramp(void)
{
// 计算步进间隔
uint32_t step_interval = (g_ems_config.ramp_up_time * 2000000) / g_ems_config.intensity;
// 根据当前阶段调整强度
switch (g_ramp_phase) {
case 0: // 缓进
if (g_ramp_timer >= step_interval) {
g_current_intensity++;
}
break;
case 1: // 保持
g_current_intensity = g_ems_config.intensity;
break;
case 2: // 缓出
if (g_ramp_timer >= step_interval) {
g_current_intensity--;
}
break;
}
}
```
### 2. 电刺激处理函数
```c
void EMS_Process(void)
{
if(g_ems_running) {
// 使用当前缓进缓出的强度
uint16_t current_intensity = g_current_intensity;
// 生成方波信号
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity);
}
}
```
## 波形特征
### 1. 梯形波形
在示波器上观察到的波形将呈现梯形特征:
- **上升沿**2秒内从0V逐渐上升到最大电压
- **平顶**6秒内保持最大电压
- **下降沿**2秒内从最大电压逐渐下降到0V
- **平底**10秒内保持0V
### 2. 时间精度
- 基于2ms定时器中断
- 强度变化精度15,625微秒
- 总时间精度±2ms
## 调试输出
系统会输出以下调试信息:
```
缓进缓出控制已启动 - 缓进阶段开始
缓进完成 - 进入保持阶段, 强度: 128
保持完成 - 进入缓出阶段
缓出完成 - 强度降至0
电刺激已停止
```
## 参数调整
### 1. 修改时间分配
```c
// 修改为3秒缓进4秒保持3秒缓出
.ramp_up_time = 3, // 缓进时间3秒
.hold_time = 4, // 保持时间4秒
.ramp_down_time = 3, // 缓出时间3秒
```
### 2. 修改目标强度
```c
.intensity = 200, // 修改目标强度为200
```
### 3. 禁用缓进缓出
```c
.enable_ramp = 0 // 禁用渐进控制,直接使用设定强度
```
## 优势特点
### 1. 用户体验
- 避免突然的强度变化
- 减少刺痛感
- 提供舒适的刺激体验
### 2. 安全性
- 渐进式强度控制
- 避免过度刺激
- 可控的强度范围
### 3. 灵活性
- 可调节的时间分配
- 可配置的目标强度
- 可启用的功能开关
## 注意事项
### 1. 时间精度
- 确保2ms定时器正常工作
- 注意微秒计时器的溢出处理
- 验证步进间隔的计算准确性
### 2. 强度范围
- 强度值范围0-255
- 避免超出硬件限制
- 考虑用户承受能力
### 3. 系统资源
- 缓进缓出处理在2ms中断中执行
- 保持中断处理简洁
- 避免影响其他功能
## 测试验证
### 1. 硬件测试
- 用示波器观察梯形波形
- 验证时间精度
- 检查强度变化平滑性
### 2. 软件测试
- 通过UART观察调试输出
- 确认阶段切换正确
- 验证强度计算准确
### 3. 功能验证
- 测试不同强度值
- 验证时间分配
- 确认循环工作正常

View File

@ -0,0 +1,229 @@
# 缓进缓出功能说明(修正版)
## 问题分析
原始实现存在定时器冲突问题:
- 2ms定时器与1s定时器产生冲突
- 缓进缓出处理在2ms中断中执行干扰了主循环的电刺激处理
- 导致在示波器上观察不到有效波形
## 解决方案
采用方波周期计数的方式实现缓进缓出,避免定时器冲突:
### 1. 计算原理
根据您的分析:
- 每个方波周期100微秒
- 2秒内方波周期数2,000,000 ÷ 100 = 20,000个
- 强度从0增加到128需要128个步进
- 每个步进的方波周期数20,000 ÷ 128 ≈ 156.25个
### 2. 实现方式
```c
// 计算每个强度步进需要的方波周期数
uint32_t waves_per_step = (g_ems_config.ramp_up_time * 20000) / g_ems_config.intensity;
// 例如2秒 × 20000 ÷ 128 = 156.25个方波周期
```
## 核心变量
```c
// 缓进缓出控制变量
static volatile uint16_t g_current_intensity = 0; // 当前强度
static volatile uint8_t g_ramp_phase = 0; // 渐进阶段0=缓进, 1=保持, 2=缓出
static volatile uint32_t g_wave_counter = 0; // 方波周期计数器
static volatile uint32_t g_ramp_step_counter = 0; // 缓进步进计数器
```
## 工作流程
### 1. 缓进阶段0-2秒
```c
case 0: // 缓进阶段
if (g_ramp_step_counter < g_ems_config.ramp_up_time) {
// 每156个方波周期增加1个强度单位
if (g_wave_counter >= waves_per_step) {
g_wave_counter = 0; // 重置方波计数器
if (g_current_intensity < g_ems_config.intensity) {
g_current_intensity++;
}
}
g_ramp_step_counter++;
} else {
// 缓进完成,进入保持阶段
g_ramp_phase = 1;
g_ramp_step_counter = 0;
g_current_intensity = g_ems_config.intensity;
}
break;
```
### 2. 保持阶段2-8秒
```c
case 1: // 保持阶段
if (g_ramp_step_counter < g_ems_config.hold_time) {
// 保持最大强度
g_current_intensity = g_ems_config.intensity;
g_ramp_step_counter++;
} else {
// 保持完成,进入缓出阶段
g_ramp_phase = 2;
g_ramp_step_counter = 0;
g_wave_counter = 0;
}
break;
```
### 3. 缓出阶段8-10秒
```c
case 2: // 缓出阶段
if (g_ramp_step_counter < g_ems_config.ramp_down_time) {
// 每156个方波周期减少1个强度单位
if (g_wave_counter >= waves_per_step) {
g_wave_counter = 0; // 重置方波计数器
if (g_current_intensity > 0) {
g_current_intensity--;
}
}
g_ramp_step_counter++;
} else {
// 缓出完成,停止电刺激
g_current_intensity = 0;
}
break;
```
## 调用方式
缓进缓出处理函数在电刺激处理函数中调用:
```c
void EMS_Process(void)
{
if(g_ems_running) {
g_ems_count++;
// 处理缓进缓出控制
EMS_Process_Ramp();
// 使用当前缓进缓出的强度
uint16_t current_intensity = g_current_intensity;
// 生成方波信号
wavegen_driverA_sine_test(WAVE_GEN_DRVA_BLK0, current_intensity);
}
}
```
## 优势特点
### 1. 避免定时器冲突
- 不再使用2ms定时器进行缓进缓出控制
- 缓进缓出处理在电刺激处理函数中执行
- 确保时序一致性
### 2. 精确控制
- 基于方波周期计数,精度高
- 每156个方波周期调整一次强度
- 平滑的强度变化
### 3. 简单可靠
- 逻辑清晰,易于理解
- 不依赖复杂的定时器机制
- 调试方便
## 时间分配
### 完整周期20秒
1. **缓进阶段**0-2秒强度0→128
2. **保持阶段**2-8秒强度保持128
3. **缓出阶段**8-10秒强度128→0
4. **休息阶段**10-20秒强度保持0
### 强度变化
- **缓进**每156个方波周期增加1个强度单位
- **保持**稳定在最大强度128
- **缓出**每156个方波周期减少1个强度单位
## 调试输出
系统会输出以下调试信息:
```
缓进缓出控制已启动 - 缓进阶段开始
缓进 - 强度增加到: 1
缓进 - 强度增加到: 2
...
缓进完成 - 进入保持阶段, 强度: 128
保持完成 - 进入缓出阶段
缓出 - 强度降低到: 127
缓出 - 强度降低到: 126
...
缓出完成 - 强度降至0
电刺激已停止
```
## 参数配置
```c
EMS_Config_TypeDef ems_config = {
.frequency = 100, // 100Hz
.duration = 1000, // 1000ms
.intensity = 128, // 中等强度
.rest_time = 100, // 100ms休息时间
.silent_time = 50, // 50ms静默时间
// 缓进缓出控制参数
.ramp_up_time = 2, // 缓进时间2秒
.hold_time = 6, // 保持时间6秒
.ramp_down_time = 2, // 缓出时间2秒
.enable_ramp = 1 // 启用渐进控制
};
```
## 测试验证
### 1. 硬件测试
- 用示波器观察梯形波形
- 验证缓进缓出的平滑性
- 检查时间精度
### 2. 软件测试
- 通过UART观察调试输出
- 确认强度变化正确
- 验证阶段切换正常
### 3. 功能验证
- 测试不同强度值
- 验证时间分配
- 确认循环工作正常
## 注意事项
### 1. 方波周期
- 确保方波周期计算正确100微秒
- 验证方波计数器正常工作
- 注意计数器的溢出处理
### 2. 强度范围
- 强度值范围0-255
- 避免超出硬件限制
- 考虑用户承受能力
### 3. 系统资源
- 缓进缓出处理在电刺激处理中执行
- 保持处理简洁高效
- 避免影响其他功能
## 总结
修正后的缓进缓出功能:
- 解决了定时器冲突问题
- 采用方波周期计数方式
- 实现了平滑的强度变化
- 提供了舒适的刺激体验
现在您应该能在示波器上观察到清晰的梯形波形了!