我从爱板网有幸获得了SAM-4S Xplained板卡,很想做做试用的。几个晚上下来,战果还可以,至少搞明白了用IAR开发SAM4S16C的方法。有了点点心得,与坛友一起分享。
刚开始用IAR 用库文件的方式操作SAM4S16C吃了不少苦头,随便搞个操作或者是初始化硬件的小程序段都是出错一大堆,后来仔细的研究分析ATMEL公司的库文件, 发现和ST公司的那些STM32的库文件有点不一样的。ST公司的库文件的最底层可以直接看到看到操作STM32FXX 芯片的最原始的硬件寄存器的地方,但是ATMEL公司给的库文件驱动却相反,虽然也是指针形式的操作,但是不操作具体的硬件,却是操作传递近来的参数,所 以这就要求在调用库函数的时候必须传递进来的是实际的寄存器变量结构体。
有SAM-4S Xplained板子的朋友都知道SAM4S16C的WDT是一直开着的,如果不配置,默认是16秒就会reset系统的,程序会自动被WDT重新启动。 刚开始我摸不到ATMEL公司给的库文件驱动的门道,模仿着ST公司的STM32系列的函数操作方式,无论如何都搞不定WDT,我的要求很简单直接关闭 WDT,弄了一天也搞不定。当时直接访问地址的方式暂时“拴住了狗”,不然程序根本没法子调试。所以才能够继续 搞LCD。
本楼主使用的是控制器是OTM3225的 TFT LCD 240X320点阵,刚好屏幕可以设置8or 16bit数据总线。SAM-4S Xplained板子虽然有提供40个pin的扩展插件,但是作为总线使用还是比较麻烦的,I/O次序不是统一。好多缺少的bit。经过本楼研究SAM- 4S Xplained SCH 发现PA口的PA11-PA18刚好是比较连续的,于是用它做LCD的数据线,PC口有几跟用做LCD的RST CS RS WR RD等信号。
连接好的板子如图。
由于之前调试过OTM3225的 TFT LCD 240X320点阵屏幕,没太费太大功夫就初始化好了屏幕。 显示效果如图。调试RTC的时候我还是按照STM32的那种方式,结果可想而知,还是不成功,根本程序不朝下边走,进入初始化RTC的死循环。
我下了决心查找原因,进入 初始化函数一步步分析,发现内部使用的控制积存器都是外面传递过来的,我在RAM里定义个RTC的结构,传递来的依然是RAM里的数据,根本和RTC时钟 没任何的联系和映射关系。于是查找SAM4S16C.H这个文件,发现了下边的语句
#define WDT ((Wdt *)0x400E1450U) /**< rief (WDT ) Base Address */
#define RTC ((Rtc *)0x400E1460U) /**< rief (RTC ) Base Address */
这个RTC才是应该操作的地方,于是直接把这个RTC参数传给函数
RTC_SetDate( RTC, 2013, 2, 5, 2 );//设置日期
RTC_SetTime( RTC, 9, 18, 10 ); //设置时间
编译没问题。
运行下也没问题。
后来添加代码,把读出的RTC显示在OTM3225的 TFT LCD 上。 显示效果如图。
主程序如下:
uint16_t pwYear; uint8_t pucMonth; uint8_t pucDay; uint8_t pucWeek; uint8_t pucHour; uint8_t pucMinute; uint8_t pucSecond; unsigned char lcd_buf[30]; int main(void) { unsigned int i; WDT_Disable(WDT); //WDT_MR =0x8000;//disable WTD // //CLOCK_SetConfig(&clockConfigurations[0]);//24mhz CLOCK_SetConfig(1);//24mhz LED_Configure(0); LED_Configure(1); Initial_lcd( ); LCD_Clear(BLUE); mdelay1(5000); LCD_write_english_string(1*16,3*16,"thanks www.eeboard.com !",RED,YELLOW);//英文字符串显示 LCD_write_english_string(1*16,8*16,"TFT LCD OTM3225 test ok!",RED,YELLOW);//英文字符串显示 RTC_SetDate( RTC, 2013, 2, 5, 2 ); RTC_SetTime( RTC, 9, 18, 10 ); while (1) { LED_Set( 0) ; LED_Set( 1) ; mdelay1(500); LED_Clear( 0 ) ; LED_Clear( 1 ) ; mdelay1(500); RTC_GetDate( RTC, &pwYear, &pucMonth, &pucDay, &pucWeek ); RTC_GetTime( RTC, &pucHour, &pucMinute, &pucSecond ); lcd_buf[0]=pwYear/1000; lcd_buf[1]=(pwYear00)/100; lcd_buf[2]=(pwYear0)/10; lcd_buf[3]=pwYear; lcd_buf[4]='/'-0x30; lcd_buf[5]=pucMonth/10; lcd_buf[6]=pucMonth; lcd_buf[7]='/'-0x30; lcd_buf[8]=pucDay/10; lcd_buf[9]=pucDay; lcd_buf[10]=' '; lcd_buf[11]=' '; lcd_buf[12]=pucHour/10; lcd_buf[13]=pucHour; lcd_buf[14]=':'-0x30; lcd_buf[15]=pucMinute/10; lcd_buf[16]=pucMinute; lcd_buf[17]=':'-0x30; lcd_buf[18]=pucSecond/10; lcd_buf[19]=pucSecond; for(i=0;i<20;i++)lcd_buf=lcd_buf+0x30; lcd_buf[10]=' '; lcd_buf[11]=' '; LCD_write_english_strings(1*16,12*16,lcd_buf,RED,YELLOW,20);//英文字符串显示 mdelay1(500); } } 编译运行都没问题,由于是简单测试,没使用GUI函数,也没做接口,想用我的工程做模板的可以接着做做这个GUI移植。
演示视频: |