蝈蝈

【嵌入式】Freescale K30 使用注意事项

0
阅读(3175)

FlexBus for k30 MCU. Application notes

使用的时候,一定注意要先开启(能使)CS0的V flag,之后才可以能使其他的片选,否则会进入HardFalut。

基于MCU IO的引出脚的数量限定,一般使用8bit 模式就可以了。

用一颗74HC373分离数据和地址。使用过MCS51单片机的朋友一定很熟悉了。这里不再详细描述。

如果外接的SRAM或ROM是16bit总线的,只需要将A0地址信号取反,将A0 与 A0反 两个信号接入UBS和LBS即可。

如果是32bit总线的,就将A0 A1 两个信号取反就行了。

 

程序初始化:

1. 能使FlexBus的Clock

2. 能使FlexBus使用的IO clock

3. FlexBus使用的IO 设置成 ALT5

4.  配置CSn 的地址起点(BA)和范围(BAM)

 

呵呵,先写到这里,之后慢慢补充。

 

用于学习,本人将FlexBus所有片选全部外接,在50Mhz的Busclock,成功启动了4Mbyte的SRAM。2Mbyte用于代码(代码在SRAM中执行的速度比ROM快)2Mbyte+128Kbyte用与数据。成功的运行128个任务,同时开启的TCP连接数497个(同时连接497的telnet console terminal, 第498个telnet 报告连接超时!!!)。呵呵,一个字,爽。原来在ARM9上才可以跑的数据,现在也可以在低成本的ARM上run了。

 

贴上部分驱动代码:

   // FlexBus clock
   SIM->SCGC7 |= SIM_SCGC7_FLEXBUS_MASK;
    //SIM->CLKDIV1 |= SIM_CLKDIV1_OUTDIV3(0);
  
   SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK \
              |  SIM_SCGC5_PORTB_MASK \
              |  SIM_SCGC5_PORTC_MASK \
              |  SIM_SCGC5_PORTD_MASK \
              |  SIM_SCGC5_PORTE_MASK \
              ;

   FB->CSPMCR = FB_CSPMCR_GROUP1(0) /* ALE  */ \
              | FB_CSPMCR_GROUP2(0) /* CS4  */ \
              | FB_CSPMCR_GROUP3(0) /* CS5  */ \
              | FB_CSPMCR_GROUP4(0) \
              | FB_CSPMCR_GROUP5(0) \
              ;
   // IO
   PORTE->PCR[12] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 0
   PORTE->PCR[11] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 1
   PORTE->PCR[10] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 2
   PORTE->PCR[ 9] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 3
   PORTE->PCR[ 8] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 4
   PORTD->PCR[14] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 5
   PORTD->PCR[13] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 6
   PORTD->PCR[12] = PORT_PCR_MUX(5) | PORT_PCR_PE_MASK | PORT_PCR_PS_MASK;   //AD 7
   PORTD->PCR[11] = PORT_PCR_MUX(5);   //AD 8
   PORTD->PCR[10] = PORT_PCR_MUX(5);   //AD 9
   PORTA->PCR[28] = PORT_PCR_MUX(5);   //AD10
   PORTA->PCR[27] = PORT_PCR_MUX(5);   //AD11
   PORTA->PCR[26] = PORT_PCR_MUX(5);   //AD12
   PORTA->PCR[25] = PORT_PCR_MUX(5);   //AD13
   PORTA->PCR[24] = PORT_PCR_MUX(5);   //AD14
   PORTA->PCR[10] = PORT_PCR_MUX(5);   //AD15
   PORTA->PCR[ 9] = PORT_PCR_MUX(5);   //AD16
   PORTA->PCR[ 8] = PORT_PCR_MUX(5);   //AD17
   PORTA->PCR[ 7] = PORT_PCR_MUX(5);   //AD18
   PORTA->PCR[29] = PORT_PCR_MUX(5);   //AD19
   PORTE->PCR[28] = PORT_PCR_MUX(5);   //AD20
   PORTE->PCR[27] = PORT_PCR_MUX(5);   //AD21
   PORTE->PCR[26] = PORT_PCR_MUX(5);   //AD22
   PORTE->PCR[25] = PORT_PCR_MUX(5);   //AD23
  
   PORTE->PCR[ 6] = PORT_PCR_MUX(5);   //ALE
   PORTD->PCR[15] = PORT_PCR_MUX(5);   //RW (WE)
   PORTA->PCR[11] = PORT_PCR_MUX(5);   //OE
   PORTE->PCR[ 7] = PORT_PCR_MUX(5);   //CS0
   PORTA->PCR[13] = PORT_PCR_MUX(5);   //CS4
   PORTA->PCR[12] = PORT_PCR_MUX(5);   //CS5  

 

   FB->CS[0].CSAR = (unsigned long)&MRAM_SCS0_ADDRESS;
   FB->CS[0].CSCR = FB_CSCR_BLS_MASK \
                  | FB_CSCR_PS(1) \
                  | FB_CSCR_AA_MASK \
                  | FB_CSCR_ASET(FLEX_BUS_ASET) \
                  | FB_CSCR_WS(FLEX_BUS_WS) \
                    ;
   FB->CS[0].CSMR = FB_CSMR_BAM(0x1f) \
                  | FB_CSMR_V_MASK
                    ; //2M Flash rom for boot IMG

   FB->CS[4].CSAR = (unsigned long)&MRAM_SCS4_ADDRESS;
   FB->CS[4].CSCR = FB_CSCR_BLS_MASK \
                  | FB_CSCR_PS(1) \
                  | FB_CSCR_AA_MASK \
                  | FB_CSCR_ASET(FLEX_BUS_ASET) \
                  | FB_CSCR_WS(FLEX_BUS_WS) \
                    ;
   FB->CS[4].CSMR = FB_CSMR_BAM(0x1f) \
                  | FB_CSMR_V_MASK
                    ; //2M Ram for run code, After boot ,MPU lock this block at Read only
   
   FB->CS[5].CSAR = (unsigned long)&MRAM_SCS5_ADDRESS;
   FB->CS[5].CSCR = FB_CSCR_BLS_MASK \
                  | FB_CSCR_PS(1) \
                  | FB_CSCR_AA_MASK \
                  | FB_CSCR_ASET(FLEX_BUS_ASET) \
                  | FB_CSCR_WS(FLEX_BUS_WS) \
                    ;
   FB->CS[5].CSMR = FB_CSMR_BAM(0x1f) \
                  | FB_CSMR_V_MASK
                    ; //2M Ram for data, heap and stack

 

以上代码基于keil调试通过,大家在调试这个代码的时候,还请劲量的多阅读原厂提供的数据手册。

因为不想花钱买开发板,所以必须完全理解芯片的工作原理才可以代码调试,否则芯片可能会死锁。

本人比较笨,原厂提供的数据手册读了不知道多少遍了(至少50遍有了,惭愧),才理解工作原理。

呵呵,权当是学习english了。

 

有关于 Freescale kinetis MCU 的使用,后续慢慢的补充。