在线时间49 小时
UID3126933
注册时间2015-10-21
NXP金币0
TA的每日心情 | 开心 2017-7-10 09:04 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
中级会员
 
- 积分
- 342
- 最后登录
- 2020-7-29
|
本帖最后由 baicaiaichibaicai 于 2017-7-3 09:33 编辑
官方和万利都提供了库,但是我已习惯用纯寄存器的方式开发程序,所以我打算用纯寄存器的方式开发LPC54114开发板。双核的代码都是放在flash上,可以将m0的bin文件当作一个数组存放在m4的程序中,我的做法如下
1. 创建m0工程,设置flash地址为 0x00020000~0x00040000,ram地址为 0x20010000~0x20020000,同时在"Option for target"的Asm中定义宏NO_CRP。
2. 增加编译完转换成bin文件 “$K\ARM\ARMCC\bin\fromelf.exe --bincombined --bincombined_base=0x00020000 --output ../../m4f/code/m0Image.bin !L”
3. 创建m4工程,设置flash地址为0x00000000~0x00020000,ram地址为0x20000000~0x20010000,同时增加 incm0.s文件如下
- AREA |.ARM.__AT_0x00020000|,CODE,READONLY,ALIGN=3
- INCBIN m0Image.bin
- END
复制代码 将m0镜像放在0x00020000的位置,注意此地址要与生成bin文件是的参数--bincombined_base=0x00020000 一致,否则会导致m0的链接与运行地址不一致。
编写简单的例程。
m0+
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "chip.h"
- int main(void){
- int i,cnt;
- cnt = 0xFFFFFFFF;
- while(cnt--){
- i = 0xFFFFFF;while(i--);
- sprintf((void *)0x04000000,"0x%08x",cnt);
- LPC_MBOX->BOX[1].IRQ = 1;
- }
- return 0;
- }
复制代码 M4
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include "chip.h"
- LPC_USART_T * usart0 = (LPC_USART_T *)(LPC_FLEXCOMM0_BASE);
- #pragma import(__use_no_semihosting_swi)
- struct __FILE {
- /* Whatever you require here. If the only file you are using is */
- /* standard output using printf() for debugging, no file handling */
- /* is required. */
- int handle;
- };
- void _ttywrch(void){
- }
-
- int _sys_open(const char *name, int openmode){
- return 0;
- }
- int _sys_exit(int x){
- x = x;
- return 0;
- }
- int fputc(int ch, FILE *f){
- while(0 == (usart0->FIFOSTAT & (1 << 5)));
- usart0->FIFOWR = ch;
- return ch;
- }
- void MAILBOX_IRQHandler(){
- LPC_MBOX->BOX[1].IRQCLR = 0xFFFFFFFF;
- printf("%s\r\n",(unsigned char *)0x04000000);
- return;
- }
- int main(void){
- unsigned int run = 1;
- LPC_SYSCON->FROCTRL = (1 << 14) | (1 << 30) | (1UL << 31); // enable fro_hf to 96M
- LPC_SYSCON->MAINCLKSELA = 3; // select main clock A to fro_hf
- LPC_SYSCON->MAINCLKSELB = 0; // select main clock A as input source of main clock clock B
- LPC_SYSCON->FXCOMCLKSEL[0] = 0; // select fro_12m as clock of flexcomm0
- LPC_SYSCON->AHBCLKCTRL[1] |= (1 << 11); // enable clock of flexcomm0
- LPC_SYSCON->PRESETCTRL[1] |= (1 << 11); // reset flexcomm0
- LPC_SYSCON->PRESETCTRL[1] &= ~(1 << 11); // un-reset flexcomm0
- *((volatile unsigned int *)(LPC_FLEXCOMM0_BASE + 0xFF8)) = (1 << 0) | (1 << 3); // set flexcomm0 as UART and lock it
- LPC_SYSCON->AHBCLKCTRL[0] |= (1 << 13); // enable clock of IOCON
- LPC_IOCON->PIO[0][0] = (1 << 0) | (1 << 7) | (1 << 9); // set pin0.0
- LPC_IOCON->PIO[0][1] = (1 << 0) | (1 << 7) | (1 << 9); // set pin0.1
- usart0->CTL = (0 << 6); // enable uart0 tx
- usart0->FIFOCFG = (1 << 0); // enable tx FIFO
- usart0->OSR = 13; // set oversample
- usart0->BRG = 8; //8 == (12000000/(115200*13));
- usart0->CFG = (1 << 0) | (1 << 2); // 8b none 1b stop,enable
- LPC_SYSCON->AHBCLKCTRL[0] |= (1 << 26); // enable clock of MBOX
- NVIC_EnableIRQ(MAILBOX_IRQn); // enable mbox irq
- LPC_SYSCON->CPCTRL |= (0xC0C40000 | (1 << 3) | (1 << 5)); //enable CM0 clock and reset it
- LPC_SYSCON->CPBOOT = *((unsigned int *)0x00020004); // set CM0 enter address
- LPC_SYSCON->CPSTACK = *((unsigned int *)0x00020000); // set CM0 stack pointer
- LPC_SYSCON->CPCTRL = 0xC0C40000 | (LPC_SYSCON->CPCTRL & (~(1 << 5))); //un-reset CM0
- while(run);
- return 0;
- }
复制代码 LPC54114的双核使用中断,对LPC_MBOX->BOX[coreNumber].IRQ写任意值即可触发该核的中断,要传输数据给另外一个核时,只要对该核的IRQ寄存器进行写操作即可。另还提供一个硬件互斥锁LPC_MBOX->MUTEX(本例子没用到)
PS1: CM0的代码我是没有拷贝到RAM中,优点是节省RAM,缺点是执行效率低下,因为两个核心都要通过总线去访问flash。
PS2: 中断里不应该放打印的,这里只是例程,就比较随意了。
|
|