器件型号:MSP-EXP432P4111
工具/软件:Code Composer Studio
您好!
我使用 DriverLib 和 ADC14对 P5.5上的电压进行采样、并使用 LCD 显示该电压(除以2)。
我目前正在使用硬编码 while 环路来增加延迟、这样我的显示器就不会饱和。 不过、我这样做的方法是降低我不希望的 ADC 的采样率。
如何为 ADC/LCD 环路添加延迟、以使 ADC 采样率不会降低?
我已经尝试使用 SysTick 计时器、但这不起作用。
请参阅下面的 ADC/LCD 更新代码。
void ADC14_IRQHandler (void)
{
uint64_t status = MAP_ADC14_getEnabableInterruptStatus();
MAP_ADC14_clearInterruptFlag (status);
IF (ADC_INT0和状态)
{
节拍= 0;
curADCResult = MAP_ADC14_getResult (ADC_MEM0);
curADCResult =(curADCResult * 1650)/(16384);//将2:1 in 与 LCD 电压之比缩放
normalizedADCRes=(uint16_t) curADCResult;//将 ADC 值截断为四位数以显示在 LCD 上
一=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
2 =(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
三=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
四=(标准化 ADCRes % 10);
showChar (四个+ 48个、char1);//传递要显示的 ADC 值
showChar (3 + 48、char2);
showChar (2 + 48、char3);
showChar (一个+ 48个、char4);
showChar (''、char5);
showChar (''、char6);
MAP_ADC14_toggleConversionTrigger ();
while (Tick < 100000){ //硬编码 while 循环用于延迟
tick++;
}
LCD_F_clearAllMemory();
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3); //更新 LCD 屏幕,使其不存储内存
LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
LCD_F_TONN();
}
}
我的目标是将 PWM 信号输出到低通滤波器、然后输出到 MOSFET 的栅极、并在0-1A 之间控制电流。 我需要该范围内的32阶电流、我需要通过 ADC 进行校准以补偿误差。 我的电流将通过 INA250进行感测。
以下是上下文中的完整代码:
/* DriverLib 包括*/
#include
/*标准包括*/
#include
#include
易失性 uint32_t Tick;
void ADC14_IRQHandler (void);
void Port1_IRQHandler (void);
#define char1 16 //数字 A1 - L16
#define char2 32 //数字 A2 - L32
#define char3 40 //数字 A3 - L40
#define char4 36 //数字 A4 - L36
#define char5 28 //数字 A5 - L28
#define char6 44 //数字 A6 - L44
const char 位[10][4]=
{
{0xC、0xF、0x8、0x2}、/*"0" LCD 段 A+b+c+d+e+f+k+q */
{0x0、0x6、0x0、0x2}、/*"1"*/
{0xB、0xD、0x0、0x0}、/*"2"*/
{0x3、0xF、0x0、0x0}、/*"3"*/
{0x7、0x6、0x0、0x0}、/*"4"*/
{0x7、0xB、0x0、0x0}、/*"5"*/
{0xF、0xB、0x0、0x0}、/*"6"*/
{0x4、0xE、0x0、0x0}、/*"7"*/
{0xF、0xF、0x0、0x0}、/*"8"*/
{0x7、0xF、0x0、0x0}/*"9"*}
;
const char alphaBig[26][4]=
{
{0xF、0xE、0x0、0x0}、/*"A" LCD 段 A+b+c+e+f+g+m */
{0x1、0xF、0x0、0x5}、/*"B"*/
{0xC、0x9、0x0、0x0}、/*"C"*/
{0x0、0xF、0x0、0x5}、/*"D"*/
{0xF、0x9、0x0、0x0}、/*"E"*/
{0xF、0x8、0x0、0x0}、/*"F"*/
{0xD、0xB、0x0、0x0}、/*"G"*/
{0xF、0x6、0x0、0x0}、/*"H"*/
{0x0、0x9、0x0、0x5}、/*"i"*/
{0x8、0x7、0x0、0x0}、/*"J"*/
{0xE、0x0、0x2、0x2}、/*"K"*/
{0xC、0x1、0x0、0x0}、/*"L"*/
{0xC、0x6、0x0、0xA}、/*"M"*/
{0xC、0x6、0x2、0x8}、/*"N"*
{0xC、0xF、0x0、0x0}、/*"O"*/
{0xF、0xC、0x0、0x0}、/*"P"*/
{0xC、0xF、0x2、0x0}、/*"Q"*/
{0xF、0xC、0x2、0x0}、/*"R"*/
{0x7、0xB、0x0、0x0}、/*"S"*/
{0x0、0x8、0x0、0x5}、/*"T"*/
{0xC、0x7、0x0、0x0}、/*"U"*/
{0xC、0x0、0x8、0x2}、/*"V"*/
{0xC、0x6、0xA、0x0}、/*"W"*/
{0x0、0x0、0xA、0xA}、/*"X"*/
{0x0、0x0、0x0、0xB}、/*"Y"*/
{0x0、0x9、0x8、0x2}/*"Z"*/
};
静态易失性浮点 curADCResult;
静态易失性 uint16_t normalizedADCRes;
静态易失性 char 1;//要传递到 LCD
静态易失性 char 2的字符;
静态易失性 char 3;
静态易失性 char 4;
静态空 showchar (c、int 位置 char);
/* LCD 的配置结构*/
LCD_F_Config lcdConf =
{
时钟源= LCD_F_CLOCKSOURCE_ACLK、
时钟分频器= LCD_F_CLOCKDIVIDER_32、
时钟预分频器= LCD_F_CLOCKPRESCALER_1、
muxRate = LCD_F_4_MUX、
波形= LCD_F_standard_waveform、
.Segments = LCD_F_Segse_enabled
};
//![简单 Timer_A 配置]
// Timer_A PWM 配置参数*/
Timer_A_PWMConfig pwmConfig =
{
Timer_A_CLOCKSOURCE_SMCLK、
Timer_A_CLOCKSOURCE_divider _1、
166、//144.5KHz PWM 信号
Timer_A_CAPTURECOMPARE 寄存器_1、
Timer_A_OUTPUTMODE_RESET_SET、
0
};
//![Simple Timer_A Config]
void lcdupdate (void){
节拍= 0;
一=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
2 =(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
三=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
四=(标准化 ADCRes % 10);
showChar (4 + 48、char1);
showChar (3 + 48、char2);
showChar (2 + 48、char3);
showChar (一个+ 48个、char4);
showChar (''、char5);
showChar (''、char6);
MAP_ADC14_toggleConversionTrigger ();
while (Tick < 1000000){//硬编码延迟
tick++;
}
LCD_F_clearAllMemory();
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3);
LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
LCD_F_turnon ();
}
int main (void)
{
Tick = 0;
//暂停看门狗*/
MAP_WDT_A_HOLDTimer();
//初始化引脚中的所有功能选择位*/
P3->SEL1 |= 0xF2;
P6->SEL1 |= 0x0C;
P7->SEL1 |= 0xF0;
P8->SEL1 |= 0xFC;
P9->SEL1;= 0xSEFF |= 0x9;
P10->SEL1 |= 0x3F;
//将 ACLK 设置为基准振荡器*/
CS_initClockSignal (CS_ACLK、CS_REFOCLK_select、CS_Clock_divider _1);
//初始化 LCD_F 模块
(&lcdConf);
//清除
LCD_F_line
;//设置 LCD_F_line 和 LCD_F_line;
* RF_F_ENCOM_F_END_REF_IN_LINE_LCD_END_F_INEST_LINE_LCD_INEST_REF_LINE_LCD_N (* 1)* 1;* 1
LCD_F_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、 LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
/*在*/
lcd_f_turnon ()上使用 LCD_F 模块;
//---------------
//![Simple Timer_A 示例]
对于 LF 模式、//将 MCLK 设置为 REFO 为128Khz
*将 SMCLK 设置为64Khz */
MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 24);
MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_Clock_divider _1);
// MAP_CS_setReferenceOscillatorFrequency (CS_REFO_128KHZ);
// MAP_CS_initClockSignal (CS_MCLK、 CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_1);
// MAP_CS_initClockSignal (CS_SMCLK、CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_2);
MAP_PCM_setPowerState (PCM_AM_LF_VCORE0);
/*将 GPIO2.4配置为 PWM 的外设输出、将 P6.7配置为按钮的外设输出
*中断*/
MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、
GPIO_PRIMARY_MODULE_FUNCTION);
MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1);
MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);
/*将 Timer_A 配置为具有大约500ms 的周期和
*初始占空比为其10%(3200个节拍)*/
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
//![Simple Timer_A 示例]
/*启用中断并启动看门狗计时器*/
MAP_Interrupt_enableInterrupt (INT_Port1);
MAP_Interrupt_enableSlepOnIsrExit();
MAP_Interrupt_enableMaster();
/*不使用时睡眠*////-------------------------------------------------------
/*初始化变量*/
curADCResult = 0;
/*设置闪存等待状态*/
MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3);
MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);
/*将 DCO 设置为48MHz */
MAP_PCM_setPowerState (PCM_AM_LDO_VCORE1);
//map_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);
/*启用 FPU 进行浮点运算*/
map_fpu_enableModule();
MAP_FPU_enableLazyStacking();
//![单个采样模式配置]
/*初始化 ADC (MCLK/1/4)*/
MAP_ADC14_enableModule();
MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、
0);
/*配置 GPIO (5.5 A0)*/
MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、
GPIO_TICE_MODULE_FUNCTION);
/*配置 ADC 内存*/
MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE);
MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、
ADC_INPUT_A0、false);
/*配置采样计时器*/
MAP_ADC14_enableSampleTimer (ADC_MANUAL_DEACation);
/*启用/切换转换*/
MAP_ADC14_enableConversion();
MAP_ADC14_toggleConversionTrigger ();
//![单个采样模式配置]
/*启用中断*/
MAP_ADC14_enableInterrupt (ADC_INT0);
MAP_Interrupt_enableInterrupt (INT_ADC14);
MAP_Interrupt_enableMaster();
//lcdupdate();
while (1)
{
MAP_PCM_gotoLPM0 ();
}
}/*
Port1 ISR -
此 ISR 将在按下按钮
时逐步升高 PWM 的占空比*/
void Port1_IRQHandler (void)
{
uint32_t status = MAP_GPIO_getEnabledInterruptStatus (GPIO_PORT_P1);
MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、状态);
IF (STATUS & GPIO_PIN1)
{
if (pwmConfig.dutyCycle = 160)
pwmConfig.dutyCycle = 0;
其他
pwmConfig.dutyCycle += 1;
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig);
}
}
//![单个采样结果]/*
ADC 中断处理程序。 每当
ADC_MEM0完成转换*时、就会调用此处理程序。
*
void ADC14_IRQHandler (void)
{
uint64_t status = MAP_ADC14_getEnabableInterruptStatus();
MAP_ADC14_clearInterruptFlag (status);
IF (ADC_INT0和状态)
{
节拍= 0;
curADCResult = MAP_ADC14_getResult (ADC_MEM0);
curADCResult =(curADCResult * 1650)/(16384);//将2:1 in 与 LCD 电压之比缩放
normalizedADCRes=(uint16_t) curADCResult;//将 ADC 值截断为四位数以显示在 LCD 上
一=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
2 =(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
三=(标准化 ADCRes % 10);
normalizedADCRes= normalizedADCRes/10;
四=(标准化 ADCRes % 10);
showChar (四个+ 48个、char1);//传递要显示的 ADC 值
showChar (3 + 48、char2);
showChar (2 + 48、char3);
showChar (一个+ 48个、char4);
showChar (''、char5);
showChar (''、char6);
MAP_ADC14_toggleConversionTrigger ();
while (Tick < 100000){ //硬编码 while 循环用于延迟
tick++;
}
LCD_F_clearAllMemory();
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3); //更新 LCD 屏幕,使其不存储内存
LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19);
LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2);
LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
LCD_F_TONN();
}
}
静态空 showChar (char c、int position){uint8_t ii;if (c ='){for (ii = 0;ii < 4;i++){LCD_F->M[position+i]|= 0x00;}否则(c >='0'& c <='9'){i LCD_F<=4+2[ii);}如果(c >M[i+4+i+i=4+i]|xi+i_0<= 0<= 0<= 0<= 0<= 0<=);}、则为[ii);}negoti+2< }否则、如果(c >='a'& c <='Z'){for (ii = 0;ii <4;i++){LCD_F->M[position+i]|= betalphaBig[c-65][ii);}则为{LCD_F->M[位置]= 0xFF;}//单个结果示例!
/*-版权所有-、BSD *版权所有(c) 2017、德州仪器(TI)公司 *保留所有权利。 * * 只要 符合以下条件*、允许以源代码和二进制形式重新分发和使用: * *源代码的重新分发必须保留上述版权 声明* 、此条件列表和以下免责声明。 * ** *二进制形式的再发行必须在 *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。 * *** 未经 事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。 * *本软件由版权所有者和贡献者"按原样"提供 *、 不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或 *贡献者都不对任何直接、间接、偶然、特殊、 *模范、 或相应的损害(包括但不限于 *采购替代产品或服务;丧失使用、数据或利润; *或业务中断)、但出于任何责任理论 、*无论是在合同中、严格责任还是由于 使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他) 、*即使已获悉可能会发生此类损坏。 *--/版权-*//()************************** * MSP432 Timer_A -可变 PWM * 说明:在此示例中、Timer_A 模块用于创建 具有可调占空比的精密* PWM。 PWM 初始周期为200ms、 *在 P2.4上输出。 PWM 的初始占空比为10%、但是 当按下 P1.1上的*按钮时、占空比会按顺序增加10%。 *一旦占空比达到90%、 按下*次按钮后、占空比将重置为10%。 * * MSP432P4111 * ---------- * /|\| | * || | * -|RST P1.1 |<--切换开关 * | | * | | * | P2.4 |-->输出 PWM * | | * | | * (小部分 //* DriverLib 包括*/#include
/*标准包括*/#include #include
volatile uint32_t Tick;
void ADC14_IRQHandler (void);void Port1_IRQHandler (void);
#define char1 16 //数字 A1 - L16 #define char2 32 //数字 A2 - L32 #define char3 40 //数字 A3 - L40 #define char4 36 //数字 A4 - L36 #define char5 28 //数字 A5 - L28 #define char6 44 //数字 A6 - L44
const char digit[10][4]={ 0xC、0xF、0x8、0x2}、 /*"0" LCD 段 A+b+c+d+e+f+k+q */ {0x0、0x6、0x0、0x2}、 /*"1"* /{0xB、0x0、0x0、0x7、0x6} *、 0x7、0x0 */ 0x3 *、 0x0 0xB、0x0、0x0}、 /*"6"*/ {0x4、0xE、0x0、0x0}、 /*"7"*/ {0xF、0xF、0x0、0x0}、 /*"8"*/ {0x7、0xF、0x0、0x0} /*"9"*};
const char alphaBig[26][4]={ 0xF、0xE、0x0、0x0}、 /*"A" LCD 段 A+b+c+e+f+g+m */ {0x1、0xF、0x0、0x5}、 /*"B"* /{0xC、0x9、0x0、0xF* 、0xF/、0xF*、0x0*、0xF/ 0xF/、0xF/、0xF/、0xF/、0xF/、0xF* 0xB、0x0、0x0}、 /*"G"*/ {0xF、0x6、0x0、0x0}、 /*"H"*/ {0x0、0x9、0x0、0x5}、 /*"I"* /{0x8、0x7、0x0、0x0、0x0}、 /*"J"* /{0x2 、 0x6、0xC"、0xC"、0xC/ 0x6、0xC"、0xC/ 0xC/ 0xC/ 0xC"、0xC/ 0xC/ 0xC" 0x2、0x8}、 /*"N"* /{0xC、0xF、0x0、0x0}、 /*"O"*/ {0xF、0xC、0x0、0x0}、 /*"P"* /{0xC、0xF、0x2、0x0}、 /*"Q"*/ {0xF、0x7 、0xC"、0x7、0xC"、0x7、0xC/ *、0x7、0x7、0xC"、0xC"、0x7、0xC"、0xB/ 0x7、0xC" 0x0}、 /*"U"*/ {0xC、0x0、0x8、0x2}、 /*"V"*/ {0xC、0x6、0xA、0x0}、 /*"W"*/ {0x0、0x0、0xA、0xA}、 /*"X"*/ {0x0、0x8} 、0xB}、0xB */ 0x9 *
静态易失性浮点 curADCResult;静态易失性 uint16_t normalizedADCRes;静态易失性字符1;//传递到 LCDstatic 易失性字符2;静态易失性字符3;静态易失性字符4;
静态空 showChar (char c、int position);
/* LCD 的配置结构*/LCD_F_Config lcdConf ={ .clockSource = LCD_F_CLOCKSOURCE_ACLK、 .clockDivider = LCD_F_CLOCKDIVIDER_32、 .clockPrescaler = LCD_F_CLOCKPRESCALER_1、 .muxRate = LCD_4 波形、LCD_F_FR_4波形 .Segments = LCD_F_Segs_enabled};
//![Simple Timer_A Config]/* Timer_A PWM 配置参数*/ Timer_A_PWMConfig pwmConfig ={ Timer_A_CLOCKSOURCE_SMCLK、 Timer_A_CLOCKSOURCE_divider _1、 166、//144.5KHz PWM 信号 Timer_A_CAPTURECOMPARE 寄存器_1、 Timer_A_OUTPUTMODE_RESET_SET、 0};//![Simple Timer_A 配置]
void lcdupdate (void){ Tick = 0; one =(normalizedADCRes % 10); normalizedADCRes = normalizedADCRes/10; two =(normalizedADCRes % 10);normalizedADCRes = normalizedADCRes/10; three =(showisizedADCRes % 10 );normalizedADCR10 = 4 (normalizedADCR10);normalizedADCR48 (showcharizedADCRes + 4);normalizedADCR48 (showcharizedADCR10);normed ADCR1 + 4 (showcharizedADCR10); showChar (2 + 48、char3); showChar (1 + 48、char4); showChar (''、 char5); showChar (''、char6); map_ADC14_toggleConversionTrigger (); while (Tick < 1000000){ //硬编码延迟 tick++; } LCD_F_clearAllMemory (); LCD_F_setPinAsLCDFunction (LCD_F_Segment 行_0、LCD_F_Segment 行_3); LCD_F_setPinAsLCDFunction (LCD_F_Segment 行_6); LCD_F_setPinsAsLCDFunction (LCD_F_16段、行 LCD_F_SEGM_LINE_19); LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47); LCD_F_setPinAsCOM (LCD_F_SEGMe_LINE_26、LCD_F_MEMORY_COM0); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、 LCD_F_MEMORY_COM3); LCD_F_TONON ();}
int main (void){
节拍= 0;
/*暂停看门狗*/MAP_WDT_A_HOLDTimer();
/*初始化引脚中的所有功能选择位*/ P3->SEL1 |= 0xF2; P6->SEL1 |= 0x0C; P7->SEL1 |= 0xF0; P8->SEL1 |= 0xFC; P9->SEL1 |= 0xFF; P10->SEL1 |= 0x3F;
/*将 ACLK 设置为基准振荡器*/ CS_initClockSignal (CS_ACLK、CS_REFOCLK_SELECT、CS_CLOCK_DEVIDER_1);
/*初始化 LCD_F 模块*/ LCD_F_initModule (&lcdConf);
/*清除所有内存*/ lcd_f_clearAllMemory();
/*初始化我们的所有引脚并设置相关的 COM 线*/ LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3); LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6);LCD_F_setPinsAsLCD_LINE_19 (LCD_LINE_LCD_F_LINE_LCD_LINE_16);LCD_LINE_LCD_LINE_LCD_F_LINE_LCD_LINE_LCD_LINE_ LCD_F_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、 LCD_F_MEMORY_COM1); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3);
/*在*/ LCD_F_TONON ()上使 LCD_F 模块运行;
///------------------------------------
//![Simple Timer_A 示例] //*将 MCLK 设置为 REFO 为128Khz 以实现 LF 模式 *将 SMCLK 设置为64Khz */ MAP_CS_setDCOenceedFrequency (CS_DCO_FREQUENCY 24); MAP_CS_initClockSignal (CS_SMCLK、CS_DCOCLK_SELECT、CS_SC_RESTON_CLK_CLKCLK_CLKCLK_SELECTL、CS_SC_CLUS_CLUS_CLUS_CLUS_CLCK_REDC_CLUS_CLKDC_RESPLUCK_SC // map_CS_initClockSignal (CS_MCLK、CS_REFOCLK_select、CS_clock_divider); // map_CS_initClockSignal (CS_SMCLK、CS_REFOCLK_select、 CS_CLOCK 分频器_2); MAP_PCM_setPowerState (PCM_AM_LF_VCORE0);
/*将 GPIO2.4配置为 PWM 的外设输出 、将 P6.7配置为按钮 *中断*/ MAP_GPIO_setPeripheralModuleFunctionOutputPin (GPIO_PORT_P2、GPIO_PIN4、 GPIO_PRIMARY_MODULE_FUNCTION); MAP_GPIO_setAsInputPinWithPullUpResistor (GPIO_PORT_P1、GPIO_PIN1); MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、GPIO_PIN1); MAP_GPIO_enableInterrupt (GPIO_PORT_P1、GPIO_PIN1);
/*将 Timer_A 配置为具有大约500ms 的周期、 *初始占空比为该周期(3200个节拍)的10% */ MAP_Timer_A_generatePWM (timer_A0_BASE、&pwmConfig); //![简单 Timer_A 示例]
/*启用中断并启动看门狗计时器*/ MAP_Interrupt_enableInterrupt (INT_Port1); MAP_Interrupt_enableSlepOnIsrExit (); MAP_Interrupt_enableMaster ();
/*不使用时睡眠*/
///-------------------------------------------------------------- /*初始化变量*/ curADCResult = 0;
/*设置闪存等待状态*/ MAP_FlashCtl_A_setWaitState (FLASH_A_BANK0、3); MAP_FlashCtl_A_setWaitState (FLASH_A_Bank1、3);
/*将 DCO 设置为48MHz */ MAP_PCM_setPowerState (PCM_AM_LDO_VCORE1); //MAP_CS_setDCOCenteredFrequency (CS_DCO_FREQUENCY 48);
/*为浮点运算启用 FPU */ MAP_FPU_enableModule(); MAP_FPU_enableLazyStacking();
//![单个采样模式配置] //初始化 ADC (MCLK/1/4)*/ MAP_ADC14_enableModule (); MAP_ADC14_initModule (ADC_CLOCKSOURCE_MCLK、ADC_PREDIVIDER_1、ADC_DIVIDER_4、 0);
/*配置 GPIO (5.5 A0)*/ MAP_GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P5、GPIO_PIN5、 GPIO_TIVE_MODULE_FUNCTION);
//配置 ADC 内存*/ MAP_ADC14_configureSingleSampleMode (ADC_MEM0、TRUE); MAP_ADC14_configureConversionMemory (ADC_MEM0、ADC_VREFPS_AVCC_VREFNEG_VSS、 ADC_INPUT_A0、 false);
/*配置采样计时器*/ MAP_ADC14_enableSampleTimer (ADC_MANUAL_DIERY);
/*启用/切换转换*/ MAP_ADC14_enableConversion(); MAP_ADC14_toggleConversionTrigger(); //![单个采样模式配置]
/*启用中断*/ MAP_ADC14_enableInterrupt (ADC_INT0); MAP_Interrupt_enableInterrupt (INT_ADC14); MAP_Interrupt_enableMaster (); //lcdupdate (); while (1) { MAP_PCM_gotoLPM0 (); }
/* Port1 ISR - 此 ISR 将逐步升高 PWM 的占空比*按下按钮时 */void Port1_IRQHandler (void){ uint32_t status = MAP_GPIO_getenabledInterruptStatus (GPIO_PORT_P1); MAP_GPIO_clearInterruptFlag (GPIO_PORT_P1、status);
if (status & GPIO_PIN1) { if (pwmConfig.dutyCycle = 160) pwmConfig.dutyCycle = 0; 其他 pwmConfig.dutyCycle += 1;
MAP_Timer_A_generatePWM (TIMER_A0_BASE、&pwmConfig); }// ![单个采样结果]/* ADC 中断处理程序。 每当 ADC_MEM0完成转换*时、就会调用此处理程序。 /void ADC14_IRQHandler (void){ uint64_t status = MAP_ADC14_getEnabableInterruptStatus (); MAP_ADC14_clearInterruptFlag (status);
IF (ADC_INT0和状态) { 节拍= 0; curADCResult = MAP_ADC14_getResult (ADC_MEM0); curADCResult =(curADCResult * 1650)/(16384); normalizedADCRes=(uint16_t) curADCResult; 一=(标准化 ADCRes % 10); normalizedADCRes= normalizedADCRes/10; 2 =(标准化 ADCRes % 10); normalizedADCRes= normalizedADCRes/10; 三=(标准化 ADCRes % 10); normalizedADCRes= normalizedADCRes/10; 四=(标准化 ADCRes % 10); showChar (4 + 48、char1); showChar (3 + 48、char2); showChar (2 + 48、char3); showChar (一个+ 48个、char4); showChar (''、char5); showChar (''、char6); MAP_ADC14_toggleConversionTrigger (); while (Tick < 100000){ tick++; } LCD_F_clearAllMemory(); LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_0、LCD_F_SEGM_LINE_3); LCD_F_setPinAsLCDFunction (LCD_F_SEGM_LINE_6); LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_16、LCD_F_SEGM_LINE_19); LCD_F_setPinsAsLCDFunction (LCD_F_SEGM_LINE_26、LCD_F_SEGM_LINE_47); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_26、LCD_F_MEMORY_COM0); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_27、LCD_F_MEMORY_COM1); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_6、LCD_F_MEMORY_COM2); LCD_F_setPinAsCOM (LCD_F_SEGM_LINE_3、LCD_F_MEMORY_COM3); LCD_F_TONON ();
}
静态空 showChar (char c、int position){ uint8_t ii; if (c =') { 对于(ii = 0;ii < 4;ii +) { LCD_F->M[position+i]|= 0x00; } } 否则、如果(c >="0"&c <="9") { 对于(ii = 0;ii < 4;ii +) { LCD_F->M[position+i]|= digit[c-48][i]; } } 否则、如果(c >='A'& c <='Z') { 对于(ii = 0;ii < 4;ii +) { LCD_F->M[position+i]|= alphabegi[c-65][i]; } }否则 { LCD_F->M[位置]= 0xFF; }}
//![单个采样结果]