赛普拉斯(Cypress)单片机
最近在开发车载电子模块时,用到了赛普拉斯(Cypress)单片机CY8C4147系列。这个芯片在功能上还是比较强大的,基于ARM Cortex M0的内核,集成1路CAN和LCD驱动,还支持触摸按键。基本上一块芯片就可以满足现在车载ECU的所有需求,不需要再做外部扩展。
编译器
建议采用官方编译推荐的编译器PSoC Creator,可以生成一些底层代码,免得去一页页啃数据手册。而且免费,也不需要破解。
用的过程中,可能会出现工程关闭以后再打开,会发现源文件无法编辑。这时候只需要关闭已经打开的源文件,再重新打开就可以了。
修改生成的代码
系统生成的代码中,如果需要修改部分内容,需要注意修改的位置。选择clean&build,代码将重新生成,修改部分会丢失。
/* `#START isr_systemtimer_Interrupt` */
添加的代码一定要写在这种特殊的位置,才能不被clean掉
#if _M_DRV_MCU_ISR_TIMESLICE
flgTimeSlice = true;
#endif
/* `#END` */
串行控制模块SCB
同一个SCB是不能共用的。比如,SCB[0]不同时用做Uart和spi,必须错开使用。也就是说,如果SCB[0]用作Uart,那么就不能再配置成spi了。
TopDesign.cysch
PSoC Creator提供图形化的驱动代码配置TopDesign.cysch
但是应用过程中,也会有些问题。比如,删除部分模块,再恢复该模块后,会报错,可能需要重启软件修复;修改配置报错,恢复修改之前的状态后依旧报错,需要重启软件,重新编译才能修复。
内部EEPROM
CY8C4147支持内部EEPROM,实际上是FLASH模拟的。定义内部EEPROM起始地址,
const uint8_t Em_EEPROM_em_EepromStorage[Em_EEPROM_PHYSICAL_SIZE]
__ALIGNED(CY_FLASH_SIZEOF_ROW) = {0u};
起始地址必须是CY_FLASH_SIZEOF_ROW(0x80)的倍数。
添加内部EEP调试,仿真速度会变慢。
接下来,讨论一下关于Bootloader的几个问题。
内部时钟和外部时钟
在设计Boot到App的跳转时,如果选择外部时钟跳转,程序会跑飞,因此boot程序中可以采用内部时钟来规避这个问题。
flash读写
根据编译器提供flash块写驱动,需要自行开发字写驱动,在这个过程中需要注意跨块flash写。
固件s19文件制作
应用程序偏移,修改起始地址cm0plusgcc.ld中修改
CY_APPL_ORIGIN = 0x5000;
生成HEX,取 0x5000到有效程序长度,再通过JFlash生成S19文件。
本文暂时没有评论,来添加一个吧(●'◡'●)