|
昨天我本打算寫(xiě)一篇關(guān)于arm的筆記的,可是昨天我學(xué)得是兩款芯片的使用,重點(diǎn)是nor flash的使用,我翻翻它的資料,覺(jué)得只要對(duì)時(shí)序圖有一定基礎(chǔ)的人都能夠搞定,自己也沒(méi)什么語(yǔ)言可寫(xiě),于是便沒(méi)有記錄,今天我學(xué)了兩個(gè)東西,一個(gè)是串口的使用,一個(gè)是定時(shí)器的使用。總之這兩個(gè)東西其實(shí)也不難,重點(diǎn)還是對(duì)lpc2200芯片相應(yīng)模塊的寄存器要熟悉,下面附上我寫(xiě)的程序,我把這兩個(gè)綜合在一塊寫(xiě)的,注意要把開(kāi)發(fā)板的UART0和PC的UART1(一般是上面那個(gè))連接起來(lái),同時(shí)還得把nitStacks.s中要把系統(tǒng)管理模式堆棧處的代碼改為“MSR CPSR_c, #0x5f”,即使能IRQ,否則永遠(yuǎn)也實(shí)現(xiàn)不了。
#define spi_shcp 0x00000010 //0.4
#define spi_stcp 0x00000100 //0.8
#define spi_q7 0x00000020 //0.5
#define spi_ds 0x00000040 //0.6
#define UART_BPS 115200 //波特率
void delay(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
for(i=0; i<5000; i++);
}
void hc595send_data(uint8 data)
{
uint8 i;
IO0CLR = spi_stcp;
for(i=0;i<8;i++)
{
IO0CLR = spi_shcp;
if((data&0x80)!=0)IO0SET = spi_ds;
else IO0CLR = spi_ds;
data <<= 1;
IO0SET = spi_shcp;
}
IO0SET = spi_stcp;
}
const uint8 DISP_TAB[16] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
0x81,0x42,0x24,0x18,0x24,0x42,0x81,0x00 };
void UART0_Init(void)
{
uint16 fdiv;
U0LCR = 0x83; //DLAB = 1,可設(shè)置波特率
fdiv = (Fpclk/16)/UART_BPS; //設(shè)置波特率
U0DLM = fdiv/256;
U0DLL = fdiv%256;
U0LCR = 0x03; //DLAB = 0
}
void UART_SendByte(uint8 data)
{
U0THR = data;
while((U0LSR&0x40)==0);
}
void URAT_Send(uint8 *str)
{
while(1)
{
if(*str == '\0')break;
UART_SendByte(*str++);
}
}
uint8 mat=0;
void __irq IRQ_Timer0(void)
{
//uint8 i=0;
hc595send_data(~DISP_TAB[mat]);
UART_SendByte(mat);
if(++mat == 16)mat = 0;
T0IR = 0x01;
VICVectAddr = 0x00;
}
void Timer0_Init(void)
{
T0TC = 0;//定時(shí)器設(shè)置為0,即從0開(kāi)始計(jì)數(shù)
T0PR = 0;//時(shí)鐘不分頻
T0MCR = 0x03;//設(shè)置TIMER0匹配后復(fù)位T0TC,并產(chǎn)生中斷標(biāo)志
T0MR0 = Fpclk;//設(shè)置10s匹配值
T0TCR = 0x01;//啟動(dòng)定時(shí)器
VICIntSelect = 0x00;
VICVectCntl0 = 0x24;
VICVectAddr0 = (uint32)IRQ_Timer0;
VICIntEnable = 0x00000010;
}
int main (void)
{// add user source code
uint8 i=0;
PINSEL0 = 0x00000005;
IO0DIR = 0x00000150;//0001 1/0 101 0000
UART0_Init();
Timer0_Init();
while(1);
/*如果不使用中斷調(diào)用程序,也是可以的,那要把imer0_Init()函數(shù)下的關(guān)于中斷的語(yǔ)句屏蔽掉,同時(shí)把下面的while語(yǔ)句開(kāi)啟,還有把上面的while屏蔽;也一樣可以達(dá)到同樣的效果
while(1)
{
while((T0IR&0x01)==0);
T0IR = 0x01;
hc595send_data(~DISP_TAB[ i]);
URAT_Send((uint8 *)DISP_TAB);
if(++i == 16)i = 0;
}
*/
return 0;
} |
|