电子产业
数字化服务平台

扫码下载
手机洽洽

  • 微信小程序

    让找料更便捷

  • 扫码下载手机洽洽

    随时找料

    即刻洽谈

    点击下载PC版
  • 公众号

    电子元器件

    采购信息平台

  • 移动端

    生意随身带

    随时随地找货

  • 华强商城公众号

    一站式电子元器件

    采购平台

  • 芯八哥公众号

    半导体行业观察第一站

lpc54102例程(两种方案代码详解)

来源:互联网 作者:chenzhi 浏览:704

标签:

摘要: lpc54102例程(两种方案代码详解)。LPC5410x为嵌入式应用的ARM cortexm4f基微控制器。这些设备包括一个可选的手臂Cortex-M0 +协处理器,104 KB的片上存储器,512 KB芯片上的flash,五个通用定时器,一个State-Configurable计时器(SCTimer / PWM)PWM功能,一个RTC /报警定时器,一个24位多速率计时器(捷运),窗口看门狗定时器(WWDT),四个USARTs两spi,三个Fast-modeplus i2c总线接口与高速奴隶模式,和一个12位4.8 Msamples

lpc54102由于其性能和稳定性,在很多领域都有应用,下面我们来给大家分享一下lpc54102例程。

Nxp公司的LPC5410x系列产品是32位ARM Cortex-M4F/MO+MCU,集成了104KB SRAM,512KB闪存,3个12C,2个SPI,4个USART,32位计数器/定时器以及SCTImer/PWM和12位4.8MSPS ADC,具有低功耗,增强调试特性和高级支持区快等系统增强特性,适用于嵌入式应用。

LPC5410x为嵌入式应用的ARM cortexm4f基微控制器。这些设备包括一个可选的手臂Cortex-M0 +协处理器,104 KB的片上存储器,512 KB芯片上的flash,五个通用定时器,一个State-Configurable计时器(SCTImer / PWM)PWM功能,一个RTC /报警定时器,一个24位多速率计时器(捷运),窗口看门狗定时器(WWDT),四个USARTs两spi,三个Fast-modeplus i2c总线接口与高速奴隶模式,和一个12位4.8 Msamples / secADC。

LPC54102传感器处理/运动解决方案主要特性:

a. 完整的硬件和软件设计,准备定制

b. 32位LPC54102 Cortex-M4F / M0 +单片机

c. LPCXpresso54102发展局

d. 传感器罩板

e. LPCOpen软件驱动程序

f. LPC的传感器融合框架

g. 博世BSX Lite传感器融合库

h. 软件演示

i. 文档

LPC54102传感器处理/运动解决方案主要优势:

a. 向你的应用程序添加6 -或9轴运动传感器

b. 集成传感器融合中间件和便携式传感器融合框架

c. 传感器融合api允许用户轻松地创建使用运动传感器的应用程序

d. 额外的数字传感器(压力/温度,环境光,接近)

e. 软件开发工具,用于快速开始编写、编译和运行基于传感器的应用程序

f. 为最终产品设计师提供一套丰富的参考设计材料,包括文档、移植指南和示意图

g. 可堆叠硬件支持更多的传感器或添加插件模块

h. 用于测量和原型的大量的pinouts

i. 低功率

LPC54102开发板介绍

lpc54102例程(两种方案代码详解)
lpc54102例程(两种方案代码详解)

LPC54102开发板介绍原理图

lpc54102例程(两种方案代码详解)

lpc54102例程:一

下面我们以万利开发板的心率计应用笔记的LPC54102例程移植来做分析讲解。

由于万利开发板的不同设置,以及没有PulseSensor传感器,需要做一定的修改移植,使用万利开发板上的AIN1作为模拟输入,电位器的来回旋转代表心跳的变化。

1、代码修改

由于万利开发板使用PIO1_4/AIN7作为电位器输入,因此在初始化代码中,做了如下修改:

其中在board.h中,取消了BOARD_NXP_LPCXPRESSO_54102的定义,而是重新定义了BOARD_MANLEY_LPC54102。

并在各个初始化代码中,增加了针对万利开发板的初始化代码。

#if defined(BOARD_NXP_LPCXPRESSO_54102)

/* SEQ_A enables channels 0, 3 and 4; Uses software trigger; doesn‘t use BURST */

#define ADC_SEQ_A_CONFIG \

TRIG_SOFT | /* Software trigger for SEQ_A */ \

TRIG_POL_POS | /* UM recommends this for S/W trigger */ \

MODE_EOS | /* Event generated after Sequence done */ \

ENABLE_CH(3) /* Associate channels 3 to SEQ_A */

#elif defined(BOARD_MANLEY_LPC54102)

#define ADC_SEQ_A_CONFIG \

TRIG_SOFT | /* Software trigger for SEQ_A */ \

TRIG_POL_POS | /* UM recommends this for S/W trigger */ \

MODE_EOS | /* Event generated after Sequence done */ \

ENABLE_CH(7) /* Associate channels 7 to SEQ_A */

#endif // #if defined(BOARD_xxx)

staTIc void ADC_PinMuxSetup(void)

{

#if defined(BOARD_NXP_LPCXPRESSO_54102)

/* All pins to inacTIve, neither pull-up nor pull-down. */

Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 0, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_ANALOG_EN);

#elif defined(BOARD_MANLEY_LPC54102)

/* All pins to inactive, neither pull-up nor pull-down. */

Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 4, IOCON_MODE_INACT | IOCON_FUNC1 | IOCON_ANALOG_EN);

#endif

}

2、运行

其余基本不变,下载后,将电位器来回旋转,可以看到串口输出了心跳数据。

lpc54102例程(两种方案代码详解)

3、代码分析

该应用基本采用CM4初始化后即进入休眠。

CM0+核初始化ADC、Timer之后,进入休眠。

每秒20次唤醒后,采样ADC,当采样过半时,调用Compute_Heartrate算法计算是否产生心跳以及心跳间隔IBI。当发现后即输出串口信息。

关键在于Compute_Heartrate算法,该算法采用PulseSensor官方的算法,基本是通过判断ADC模拟量发现峰值、过半点等运算。

void Compute_Heartrate(void)

{

inti, N, Signal, runningTotal, current_sample = 0;

while(current_sample 《 SAMPLE_FREQUENCY/2){

Signal = temp_data[current_sample];

/* Keep track of time in milliseconds with sampleCounter variable */ sampleCounter = sampleCounter + 50;

/* Monitor the time since last beat to avoid noise */

N = sampleCounter - lastBeatTime;

/* Find the peak and trough of the pulse wave, avoid dichrotic noise by waiting 3/5 of last IBI */

if(Signal 《 thresh && N 》 (IBI/5)*3){

if (Signal 《 T){

/* Keep track of lowest point in pulse wave in the T variable */ T = Signal; } } /* Use threshold condition to filter out noise, store peak in P */ if(Signal 》 thresh && Signal 》 P){

P = Signal; } /* Analyze the data to find heartbeat */

f(N》500){

/* Avoid high frequency noise */

if((Signal》thresh)&&(Pulse==0)&&(N》(IBI/5)*3)){ Pulse=1; IBI=sampleCounter-lastBeatTime; lastBeatTime=sampleCounter; if(secondBeat){ secondBeat=0; for(i=0;i《=9;i++){ rate[i]=IBI; } } if(firstBeat){ firstBeat=0; secondBeat=1; continue; } /* Keep a running total of the last 10 IBI values */ runningTotal=0; for(i=0;i《=8;i++){ rate[i]=rate[i+1]; runningTotal += rate[i]; } /* Average the latest IBI values and calculate the BPM */ rate[9]=IBI; runningTotal+=rate[9]; runningTotal/=10; BPM=60000/runningTotal; QS=1; } }

/* Once the beat is over, reset values */

if (Signal 《 thresh && Pulse == 1){

Pulse = 0;

amp = P - T;

thresh = amp/2 + T;

P = thresh;

T = thresh; }

/* If we do not detect a heart beat in 2.5 seconds, reset all values */ if (N 》 2500){

thresh = 2548;

P = 2548;

T=2548; lastBeatTime= sampleCounter;

firstBeat = 1;

secondBeat = 0; } current_sample++; } }

lpc54102例程:二

LPCOpen_V2.14_LPC5410x的Peripheral例程

BOD是在设置了BOD中断电压水平(INTLEVEL),同时设置了重启电压水平(RSTLEVEL)之后,使能中断与重启,

源程序如下:

/* Set BOD detection interrupt to 3.05v and device reset to 1.5v */

Chip_PMU_SetBODLevels(PMU_BODRSTLVL_1_50V, PMU_BODINTVAL_3_05v);

/* Enable BOD reset and interrupt on low power level */

Chip_PMU_EnableBODReset();

Chip_PMU_EnableBODInt();

/* Enable BOD interrupt */

NVIC_EnableIRQ(BOD_IRQn);

为了方便观察BOD中断的运行,在中断中设置Board_LED_Toggle需要修改如下:

/* Brown-out detector interrupt */

void BOD_IRQHandler(void)

{

/* Turn on LED */

for(int i = 0; i 《 1000; i++) {

Board_LED_Toggle(1);

}

}

最终运行效果要求正常运行LED是熄灭的,而掉电过程中BOD中断使得LED闪亮,由于万利的板子是低电平点亮LED,因此在初始化阶段应该吧Board_LED_Set()的参数改为true,高电平之后LED熄灭。然后在BOD中断中可以blink闪亮。

lpc54102例程(两种方案代码详解)

运行效果可以通过拔掉供电电源(本人的为JLINK直接给板子供电,在jlink commander中输入Power off就可以)。此时LED会闪亮一下马上熄灭(断电)。

lpc54102例程(两种方案代码详解)

/**

* @brief PMU register block structure

* @note Most of the PMU support is handled by the PMU library.

*/

typedef struct {

__I uint32_t RESERVED0[4];

__I uint32_t RESERVED1[4];

__I uint32_t RESERVED2[4];

__I uint32_t RESERVED3[4];

__I uint32_t RESERVED4;

__IO uint32_t BODCTRL;

__I uint32_t RESERVED5;

__I uint32_t RESERVED6;

__IO uint32_t DPDWAKESRC;

} LPC_PMU_T;

#define LPC_PMU_BASE 0x4002C000UL

#define LPC_PMU ((LPC_PMU_T *) LPC_PMU_BASE)

(3)CLKOUT

lpc54102例程(两种方案代码详解)

在P0.21(CLKOUT)引脚上可以测量如下时钟信号:

lpc54102例程(两种方案代码详解)

CLKOUT_DIV = 250

lpc54102例程(两种方案代码详解)

CPU被调试器暂停后,CLKOUT依然继续输出。

(4)CRC

CRC只需要运行例程即可。

CRC的功能定义和代码如下:

lpc54102例程(两种方案代码详解)
lpc54102例程(两种方案代码详解)

(5)IAP

IAP只需要运行例程即可。

在IDE中观察memory,地址为0x00078000,可见在运行Chip_IAP_CopyRamToFlash前后的flash存储内容发生了变化。

lpc54102例程(两种方案代码详解)

(6)FreqMeasure

只需要运行例程即可。

lpc54102例程(两种方案代码详解)
型号 厂商 价格
EPCOS 爱普科斯 /
STM32F103RCT6 ST ¥461.23
STM32F103C8T6 ST ¥84
STM32F103VET6 ST ¥426.57
STM32F103RET6 ST ¥780.82
STM8S003F3P6 ST ¥10.62
STM32F103VCT6 ST ¥275.84
STM32F103CBT6 ST ¥130.66
STM32F030C8T6 ST ¥18.11
N76E003AT20 NUVOTON ¥9.67
Baidu
map