【嵌入式】Freescale K30 使用注意事项
0赞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 的使用,后续慢慢的补充。
