做最优秀的电子开发团队
MCU开发
MCU开发,单片机设计
搞定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写入一个字节
**********************************************************************/
UCOS II消息郵箱的使用
十二 15th
具體使用方法與信號量的方式大同小易,點擊這里查看信號量的使用.
首先建立一個OS_EVENT結構體的指針:
OS_EVENT *MSBOX;
然后初始化此結構為消息郵箱的結構:
MSBOX=OSMboxCreate(0);
然后就可以隨時使用此郵箱了.比較常用的有等待消息郵箱與發送消息郵箱:
具體使用方式見以下程式.
#include “stm32f10x_lib.h” #include “includes.h”
OS_STK os_sysinit_stk[60]; OS_STK os_ledshow_stk[60]; OS_STK os_ideluser_stk[60]; OS_STK os_uart_stk[60];
OS_EVENT *UARTBOX; //為串口數據建立一個事件
void os_sysinit_task(void *pdata) { sysinit(); initGPIOA();//
UARTBOX=OSMboxCreate(0); //初始化串口的信箱,值為空
OSTaskSuspend(2); //掛起自已,暫時不讓它運行了 while(1) { } }
void os_ledshow_task(void *pdata) { while(1) { OSTimeDlyHMSM(0,0,0,20); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); OSTimeDlyHMSM(0,0,1,0); GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET); } }
void os_ideluser_task(void *pdata) { INT8U date; while(1) { 更多 >
ucos學習筆記之信號量的使用
十二 1st
臺資黑工廠里寫的,字體為繁體,我也懶的轉換了,反正看的人也不多..
個人理解信號量的作用:任務之間同步的標識,或是對共享資源操作的一個鎖匙(MS有更強大的互斥型的信號量).總之不管那么多,一個任務可以等待一個信號量.任務或是中斷可以發送信號量,等待信號量的任務在收到信號量的時候就繼續運行.可以多個任務同時等待一個信號量,但只有優先級最高的任務得到信號量并執行.中斷不可使用信號量. 簡單的信號量應用 一:先在OS_CFG.H中把OS_SEM打頭的幾個全部定義為1;OS_MAX_EVENTS為所有的事件數量(包括消息隊列等),定義為多少看情況,我設定為20(每加一個就多用掉了近100字節的RAM). 二:定義一個OS_EVENT弄的指針 方法: OS_EVENT *SBSB; 三:在任務中創建一個信號量 方法: SBSB=OSSemCreate(5); 這樣SBSB就是一個指向了新建的一個信號量.后面那個5表示初始值,表示現在有5個信號量
四:接下來就可以在任務中使用信號量了(中斷中只可以發送信號量) 等待信號量方法:OSSemPend(SBSB,0,&ERROR); //等待SBSB這個信號量 后面的一個參數為超時,0表示永不超時,時間單位為OS的TIMESTICK,第三個參數為錯誤代碼 發送信號量方法:很簡單 OSSemPost(SBSB);就收工了
下面是我寫的最簡單應用,STM32用的,放到這里,以免以后忘了.
#include “stm32f10x_lib.h” #include “includes.h”
OS_STK os_sysinit_stk[60]; OS_STK os_ledshow_stk[60]; OS_STK os_ideluser_stk[60];
void os_sysinit_task(void *pdata) { INT8U ERROR; sysinit(); initGPIOA(); while(1) { OSSemPend(SEM01,0,&ERROR); OSTimeDly(40); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_RESET); OSTimeDly(20); GPIO_WriteBit(GPIOA, GPIO_Pin_1, Bit_SET); } }
void os_ledshow_task(void *pdata) { while(1) 更多 >
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 這很容易理解.
uCOS-II 常用函数参考手册[轉]
十一 28th
任务管理 1 OSTaskCreate() 建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务可以为无限循环的结构。 函数原型:INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio); 参数说明:task 是指向任务代码首地址的指针。 pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。 ptos is a pointer to the task’s top of stack. If the configuration constant OS_STK_GROWTH is set to 1, the stack is assumed to grow downward (i.e. from high memory 更多 >
ARM函数调用时参数传递规则
十一 8th
之前在学习如何在C语言中嵌入汇编时有了解到C语言之前的参数调用是使用寄存器R0传递第一个参数,R1传递到第二个..一直到R3传递第四个参数.但是实际上有时可能传递的参数非常多,超过8个,或是参数中有浮点数之类,参数也会超过4个寄存器,对于超出的部份并不使用R4,而是使用堆栈的方式,但具体是如何的方式很多网站就没了下文了,好在在GG的帮助下,让我在凌晨1.30找到了(为啥老是在半夜呢?)
—————————————————-华丽的分割线————————————————
对于ARM体系来说,不同语言撰写的函数之间相互调用(mix calls)遵循的是 ATPCS(ARM-Thumb Procedure Call Standard),ATPCS主要是定义了函数呼叫时参数的传递规则以及如何从函数返回,关于ATPCS的详细内容可以查看ADS1.2 Online Books ——Developer Guide的2.1节。这篇文档要讲的是 汇编代码中对C函数调用时如何进行参数的传递以及如何从C函数正确返回
不同于x86的参数传递规则,ATPCS建议函数的形参不超过4个,如果形参个数少于或等于4,则形参由R0,R1,R2,R3四个寄存器进行传递;若形参个数大于4,大于4的部分必须通过堆栈进行传递。
我们先讨论一下形参个数为4的情况. 实例1: test_asm_args.asm //——————————————————————————– IMPORT test_c_args ;声明test_c_args函数 AREA TEST_ASM, CODE, READONLY EXPORT test_asm_args test_asm_args STR lr, [sp, #-4]! ;保存当前lr ldr r0,=0×10 ;参数 1 ldr r1,=0×20 ;参数 更多 >