3072|4

3416

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

【LPC54100】双核协同工作NO.2驱动AD外设及erro1错误 [复制链接]

开始准备折腾外设了

看了几个库里面的例程

有点眼花缭乱



先折腾AD吧,查询方式

官方的例程很有意思

设置了一个缓冲,用以存储多次采集的数据

很贴合实际的一个例程

东改改西改改,直接把代码撸成了一个头文件

直接调用ROM_ADC_StartConversion和ROM_ADC_Handler

就能进行AD数据采集了: ADC.h.txt (7.44 KB, 下载次数: 3)

直接copy修改例程的,乱的很,大神勿喷



但是真的能直接操作外设吗?

LPCXpresso这个编译环境,或者说官方的设置比较牛x

写好驱动代码,直接编译,是会出错滴

  1. Invoking: MCU Linker
  2. arm-none-eabi-gcc -nostdlib -L"C:\Users\Liao\Documents\LPCXpresso_7.6.2_326\workspace\lpc_board_lpcxpresso_54102_m0\Debug" -L"C:\Users\Liao\Documents\LPCXpresso_7.6.2_326\workspace\lpc_chip_5410x_m0\Debug" -L"C:\Users\Liao\Documents\LPCXpresso_7.6.2_326\workspace\lpc_chip_5410x_m0\libs" -Xlinker -Map="pTest_slave.map" -Xlinker --gc-sections -mcpu=cortex-m0 -mthumb -T "pTest_slave_Debug.ld" -o "pTest_slave.axf"  ./src/boot_multicore_slave.o ./src/cr_startup_lpc5410x-m0.o ./src/crp.o ./src/pTest_slave.o ./src/sysinit.o   -llpc_board_lpcxpresso_54102_m0 -llpc_chip_5410x_m0 -lpower_m0 && arm-none-eabi-objcopy --target elf32-littlearm --verbose --strip-all --redefine-sym __vectors_start__=__vectors_start___core_m0slave --keep-symbol __vectors_start___core_m0slave --rename-section .text=".core_m0slave" --rename-section .data=".core_m0slave.data" "pTest_slave.axf" "pTest_slave.axf.o"
  3. c:/nxp/lpcxpresso_7.6.2_326/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(_deferredlazyseek.o): In function `__flsbuf':
  4. _deferredlazyseek.c:(.text.__flsbuf+0x88): undefined reference to `__sys_istty'
  5. c:/nxp/lpcxpresso_7.6.2_326/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(_writebuf.o): In function `_Cwritebuf':
  6. _writebuf.c:(.text._Cwritebuf+0x16): undefined reference to `__sys_flen'
  7. _writebuf.c:(.text._Cwritebuf+0x26): undefined reference to `__sys_seek'
  8. c:/nxp/lpcxpresso_7.6.2_326/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(alloc.o): In function `_Csys_alloc':
  9. alloc.c:(.text._Csys_alloc+0x12): undefined reference to `__sys_appexit'
  10. c:/nxp/lpcxpresso_7.6.2_326/lpcxpresso/tools/bin/../lib/gcc/arm-none-eabi/4.9.3/../../../../arm-none-eabi/lib/armv6-m\libcr_c.a(fseek.o): In function `fseek':
  11. fseek.c:(.text.fseek+0x18): undefined reference to `__sys_istty'
  12. fseek.c:(.text.fseek+0x3c): undefined reference to `__sys_flen'
  13. collect2.exe: error: ld returned 1 exit status
  14. make: *** [pTest_slave.axf] Error 1
复制代码





从报错来看,似乎是编译链接有问题

找不到对应的库,导致出错

继续黑度娘,毛线都找不到一根

后来还是在NXP官网上找到相关的说明:http://www.lpcware.com/content/faq/lpcxpresso/linker-undefined-reference

一堆鸟文,大概意思是

LPCXpresso其实是存在2个库的,Redlib和Newlib,各有none、nohost、semihost三种附加属性

默认都是none

如果出现
Undefined reference to 'xxx'
就得修改这些属性

在这里:



撸主选择Redlib(nohost),一切井然。



下面玩玩AD

设置了一个工作场景

M0去采集AD0(P1_0)的数据

一次采集8个,通过mailbox发给M4

M4接收后,求一个简单的算术平均(有兴趣可以去试试几何平均)

再将结果返回M0

M0判断结果是否大于2048,根据判断结果,点亮绿灯

M4同时systick闪烁蓝灯



上主要的代码吧

M0侧:

  1. void MAILBOX_IRQHandler(void)//判断M4返回的数据,并点亮LED
  2. {
  3. uint32_t *p = (uint32_t *)Chip_MBOX_GetValue(LPC_MBOX, myCoreBox);
  4.         mutexTake();
  5.         Board_UARTPutSTR("Core M0+ get the Result from M4,");
  6.         if(*p>2048){Board_LED_Set(1,true);Board_UARTPutSTR("SET LED ON");}
  7.         else{Board_LED_Set(1,false);Board_UARTPutSTR("SET LED OFF");}
  8.         Board_UARTPutSTR("\r\n");
  9.                 Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
  10.                 mutexGive();
  11. }


  12. int main(void) {


  13.     SystemCoreClockUpdate();
  14.     Board_Init();
  15.         myCoreBox = MAILBOX_CM0PLUS;
  16.         otherCoreBox = MAILBOX_CM4;
  17.         Chip_MBOX_Init(LPC_MBOX);
  18.         mutexGive();
  19.     Board_UARTPutSTR("Core M0+ boot......\r\n");
  20.     NVIC_EnableIRQ(MAILBOX_IRQn);
  21.     SysTick_Config(SystemCoreClock/10);
  22. //ADC、ADCROM初始化
  23.     if (adcrom_init()) {
  24.                     return 1;
  25.             }

  26.             if (adcrom_config()) {
  27.                     return 1;
  28.             }
  29.     volatile static int i = 0 ;
  30.     while(1) {
  31.         i++;
  32.     }
  33.     return 0 ;
  34. }

  35. void SysTick_Handler(void)//每次systick启动ADC转换,并发送M4
  36. {
  37.                 if (ROM_ADC_StartConversion(hADC, ADC_SEQ_A, &buff_A[0][0], NUM_SAMPLES_A * NUM_CHANNELS_A) != LPC_OK) {
  38.                         DEBUGSTR("ERROR: Starting conversion in SEQ_A\r\n");
  39.                 }

  40.                 if (ROM_ADC_Handler(hADC, ADC_EV_SEQ_A_POLL) == LPC_OK) {
  41.                         pBufA = buff_A;
  42.                         print_buf_A(NUM_SAMPLES_A);
  43.                 }
  44.                 mutexTake();                        Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, (uint32_t) &buff_A);
  45.                                 Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
  46.                                 mutexGive();

  47. }
复制代码



M4侧:

  1. void MAILBOX_IRQHandler(void)//mailbox中断中获取数据,并设置运算标志位
  2. {uint32_t *p = (uint32_t *)Chip_MBOX_GetValue(LPC_MBOX, myCoreBox);

  3.                         mutexTake();
  4.                         if(cflag == 0){
  5.                         cflag = 1;
  6.                         pBufA = p;
  7.                         uint16_t(*buf) = pBufA;
  8. //                        print_buf_A(NUM_SAMPLES_A * NUM_CHANNELS_A);
  9.                         Chip_MBOX_SetValue(LPC_MBOX, otherCoreBox, (uint32_t)&sdata);
  10.                         DEBUGOUT("Core M4 computed:",sdata);
  11.                         DEBUGOUT("%d\r\n",sdata);
  12.                                 Chip_MBOX_ClearValueBits(LPC_MBOX, myCoreBox, 0xFFFFFFFF);
  13.                         }
  14.                                 mutexGive();


  15. }

  16. uint16_t buf2average(void)//简单算术平均
  17. {
  18.         unsigned char i;
  19.         uint16_t(*buf) = pBufA;
  20.         uint16_t average,sum;
  21.         for(i=0;i<8;i++){
  22.         sum=sum+buf[i];
  23.         average=sum/8;
  24.         }
  25.         return average ;
  26. }

  27. int main(void) {

  28.     SystemCoreClockUpdate();
  29.     Board_Init();
  30.         myCoreBox = MAILBOX_CM4;
  31.         otherCoreBox = MAILBOX_CM0PLUS;
  32.         Chip_MBOX_Init(LPC_MBOX);
  33.         mutexGive();
  34.     Board_UARTPutSTR("Core M4 boot......\r\n");
  35.     NVIC_EnableIRQ(MAILBOX_IRQn);
  36.     SysTick_Config(SystemCoreClock/50);
  37.     Board_LED_Set(0, false);

  38.     boot_multicore_slave();

  39.     volatile static int i = 0 ;
  40.     while(1) //循环中根据运算标志位来进行算术平均值计算
  41. {
  42.         i++;
  43.         if(cflag>=1){
  44.                 cflag = 0;
  45.                 sdata = (uint32_t)buf2average();
  46.         }
  47.     }
  48.     return 0 ;
  49. }

  50. void SysTick_Handler(void)//5个systick翻转一次蓝灯
  51. {
  52.         cnt_m4++;
  53.         if(cnt_m4>=5)
  54.         {
  55.                 cnt_m4 = 0;
  56.                 Board_LED_Toggle(2);

  57.         }

  58. }
复制代码



上个GIF:





接下来开始折腾一些总线型的外设了


此帖出自NXP MCU论坛

最新回复

楼主双核怎么编译的呀!,都是在flash还是mo在ram  详情 回复 发表于 2015-4-9 07:04
点赞 关注
个人签名

So TM what......?

 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
我的沙发,割掉
此帖出自NXP MCU论坛
 
个人签名

So TM what......?

 

 

回复

20

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
论坛不错。。。
此帖出自NXP MCU论坛
 
个人签名好好疼你怀里的媳妇吧,六年后她可是奢侈品??ε??
 
 

回复

1403

帖子

1

TA的资源

纯净的硅(中级)

4
 
有意思,不错,👍
此帖出自NXP MCU论坛
 
 
 

回复

10

帖子

2

TA的资源

一粒金砂(初级)

5
 
楼主双核怎么编译的呀!,都是在flash还是mo在ram
此帖出自NXP MCU论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表