做最优秀的电子开发团队
Cortex-M3
搞定12864M LCD在流明LM3S系列ARM上的驱动
十二 19th
话说现在的ARM都是玩的TFT LCD了,但是仍有一些应用中还会用到在8051单片机常用的12864M显示屏了.晚上在公司加班无事可做,发现抽屉中居然有个12864,刚好也正在学Cortex-M3所以就顺便把它移植到了我的LM3S1138的开发板上来了.程式是我之前在8051上用写过并稳定运行过的,所以整体移植几乎没遇到什么问题.程式也很简单,所以直接上源.系统是繁体的,所以注解也是繁体,没办法公司电脑都是繁体的.
51上面的驱动也可以找我要.留言就可以了
由于是使用流明的LM3S系列芯片,所以我也使用固件库,这样更方便一点. /* CS == PE1 SIO== PE2 CLK== PE3 */
#define LCD_CS GPIO_PIN_1 #define LCD_SIO GPIO_PIN_2 #define LCD_CLK GPIO_PIN_3 #define com 0 #define dat 1 /*********************************************************************
相关IO的初始化
**********************************************************************/ void softspi_init(void) { /* CS == PE1 SIO== PE2 CLK== PE3 */
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, //设置两个LED为输出模式 GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_1);
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_1,0×0);
}
/*********************************************************************
向12864写入一个字节
**********************************************************************/
void lcd_byte(INT8U byte) //LCD寫字節指令 { 更多 >
STM32最簡單應用之GPIO點燈
十一 28th
老板現在不在,抽空寫一篇文章:STM32的初學者可以看看,老鳥請自覺飄過-_-!.
由于公司為台灣黑工廠,所以所有電腦都是繁體系統,所以所有文字也為繁體的,不過應該不影響閱讀.
剛購入STM32時,對它的資料看的有點頭痛,不過在整理了一下之后就大至清析明了,特別是它的固件庫使用風格比較另類,使用了大量的結構體,然后用整個結構作為固件庫函數的參數,這樣雖然可以減少函數參數的傳遞,但對于習慣了NPX與TI的固件庫來說這樣有點不習慣.
廢話這么多,現在就上我的STM32第一個程式,點亮一個LED! 須要注意的是須要使用固件庫.
GPIO_InitTypeDef GPIOASET; //定義一個GPIO_InitTypeDef類型的結構 GPIO_DeInit(GPIOA); //GPIOA恢復默認值 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //先使能GPIO A的時鐘 (幾乎所有的CORTEX-M3核的外設都須要先使能時鐘) GPIOASET.GPIO_Pin=(GPIO_Pin_0|GPIO_Pin_1); /*選擇到GPIO_PIN 0還有1 */ GPIOASET.GPIO_Speed=GPIO_Speed_50MHz; //GPIO的速度 GPIOASET.GPIO_Mode=GPIO_Mode_Out_PP; /* 輸入輸出類型:當然是輸出型的 */ GPIO_Init(GPIOA,&GPIOASET); //然后設置GPIO,它是根據GPIOASET中各個成員的值來進行設定的
接下來我們就可以直接使用GPIO了,如果為了效率可以使用匯編或是直接寫寄存器的方法操作,如果無所謂效率就使用固件庫;
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); //置位相應的LED
GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); //清零相應的LED 這很容易理解.
UC/OS-II中OSTaskStkInit()移植详解(基于Cortex-M3)
十一 1st
OSTaskStkInit()在Cortex-M3中主要功能为初始化任务的栈的桔构,使任务的栈看起来就好像刚发生了一个中断一样的结构,这些UC/OS的作者都有说到.现在我们须要了解的是Cortex-M3在发生中断时,它的堆栈结构.在我们之前有提它中断时的压栈过程为xPSR–>PC–>LR–>R12–>R3-R0(详情点这里:Cortex-M3中断时,自动压栈的顺序),推断出中断后的任务堆栈应该为下图:
所以OSTaskStkInit()的作用就是将传递过来的参数(其中包含了堆栈地址与任务入口地址等)
标准的OSTaskStkInit()的原型为:
OS_STK *OSTaskStkInit(void (*task)(void *pd),void *pdata,OS_STK *ptos,INT16U opt);
ptos是传入是堆栈的初始值,task则是任务PC的起始地址指针.opt则是操作数,一般的任务都没用上.
所以我们最主要的任务就是把ptos,task按中断的方式压入堆栈中,堆栈的地址由ptos给出,然后再把新的堆栈的值传回去.方法:
opt=opt; //未使用,防止编译器警告 OS_STK *OSTaskStkInit (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT16U opt) { OS_STK *stk; //定义一个指针变量,用来对堆栈的操作
stk = ptos; //将传递过来的堆栈指针值赋值给STK
*(stk) = (INT32U)0x01000000L; //首先压入的是xPSR *(–stk) = (INT32U)task; //然后自减一后把任务的入口地址压入 *(–stk) = (INT32U)0xFFFFFFFEL; //接下来压入LR,由于CORTEX-M3的LR在中断时是非常特殊值,所以这经的值须要根据实际情况去确定,比如在任务模式下使用PSP那么就得把LR的值设定为FFFFFFFE
*(–stk) = (INT32U)0x12121212L; /* R12 */ *(–stk) = (INT32U)0x03030303L; /* R3 */ *(–stk) 更多 >
Cortex-M3中断时,自动压栈的顺序
十 30th
Cortex-M3,你选择STM还是LM?
十 29th
STM32系列芯片由于它的低价与高性能,现在是火的不行了,各式各样的开发板到处都是,之前我也有购买一块STM的开发板,不过没怎么去用,最近打算拿出来试着点亮LED,结果发现STM给的数据手册简直无法阅读.扯来扯去的,最简单的GPIO寄存器地址我都差不多找到快半小时,后来在网络上一查,发现抱怨STM32的人还大把大把的,更让人气愤的是STM官方员工居然说它的资料是给本科学历以上的人看的.看来像我等初中未毕来的人是别想用STM的芯片了.
后来又入手周立功的LM3S的开发板一块,先看了看它的资料,也很乱,只是相对STM来说要好那么一点点,比起NXP还是MICROCHIP来也是没的比的,不过好在它的驱动库用起来非常舒服,感觉就根51单片机差不多简章了.所以现在想暂时先放弃STM,所以现在LM被TI收购了,它的芯片质量应该不会差到哪里去.不过经过对比,发现STM与LM芯片的价格差距可不是一个等级的,烦闷,想让让识的高手们帮帮忙,结果他们都还玩ARM7/ARM9.唉
Cortex-M3在MDK C语言中嵌入汇编语言的方法
十 11th
在传统的ARM处理器中(ARM7/ARM9),如果要在C程式中嵌入汇编,可以有两种方法:
一:内联汇编程式 方法如下:
在汇编语句可以直接做用C语言中的变量.编译器会对这些代码进一步优化,函数返回也由编译器自动给出,但是有些限制就是不能对SP,LR,PC等直接操作,或者会出错,并且只能是ARM状态的代码.
二:使用嵌入式汇编的方式 示例代码如下:
嵌入式汇编的好处就是它看起来更像是一个函数,它的第一个参数放在R0中,第二个参数放在R1中,以此类推. 在嵌入式汇编的代码中,只能够使用汇编代码,如果须要访问C程式中的变量,可以使用_cpp关键字,编译器自动为这些C的变量加上IMPORT引用;如
编译器不会对嵌入式汇编做优化,也不会自动加入函数反回等,所以可以在嵌入式汇编程式中完成绝大部分纯汇编文件才能完成的工作,比如说对SP这些寄器的操作. 由于内联式汇编只能在ARM状态中进行,而Cortex-M3只支持Thumb-2,所以Cortex-M3只能使用内嵌汇编的方式,也就是第二种方式
更多 >