|
#include "config.h"
BUF_Create(buf1,11);
THR_Create(Thread1);
THR_Create(Thread2);
TMR_Create(timer1);
TMR_Create(timer2);
BUF_Create(UartBuf,100);
MUT_Create(UartMut,1);
uint8 UARTIsBusySend(uint32 base)
{
UARTIntDisable(UART0_BASE,UART_INT_TX);
if(HWREG(base + UART_O_FR) & UART_FR_BUSY)
{
UARTIntEnable(UART0_BASE,UART_INT_TX);
return 1;
}
UARTIntEnable(UART0_BASE,UART_INT_TX);
return 0;
}
uint8 UartPutChar(uint32 base,const uint8 data)
{
if(!UARTIsBusySend(base))
{
HWREG(base + UART_O_DR) = data;
return 1;
}
else
{
return BUF_PutChar(&UartBuf,data);
}
}
uint8 UartPut(uint32 base,const void *pdata,uint8 size)
{
uint8 i=0;
if(!UARTIsBusySend(base))
{
UARTIntDisable(UART0_BASE,UART_INT_TX);
while(UARTSpaceAvail(base))
{
HWREG(base + UART_O_DR) = ((uint8 *)pdata);
if(++i>=size)
{
UARTIntEnable(UART0_BASE,UART_INT_TX);
return 1;
}
}
UARTIntEnable(UART0_BASE,UART_INT_TX);
for(;i<size;i++)
{
if(!BUF_PutChar(&UartBuf,((uint8 *)pdata)))
{
return 0;
}
}
}
else
{
for(i=0;i<size;i++)
{
if(!BUF_PutChar(&UartBuf,((uint8 *)pdata)))
{
return 0;
}
}
}
return 1;
}
uint8 UartPutString(uint32 base,const void *pdata)
{
uint8 size=strlen((char *)pdata)+1;
return UartPut( base,pdata,size);
}
SIGNAL(INT_UART0)
{
uint8 temp;
uint32 status=UARTIntStatus(UART0_BASE,true);
UARTIntClear(UART0_BASE, status);
if(status&UART_INT_TX)
{
while(UARTSpaceAvail(UART0_BASE))
{
if(!UartBuf.BufGetChar(&temp))
{
return ;
}
HWREG(UART0_BASE + UART_O_DR) = temp;
}
}
}
uint8 Thread1(Tpt *pt)
{
PT_BEGIN(pt);
while(1)
{
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_4,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_4));
MUT_Pend(&UartMut);
PT_WAIT_UNTIL(pt,!UARTIsBusySend(UART0_BASE));
UartPutString(UART0_BASE,"Thread1 is running-------------------------------\n");
PT_WAIT_UNTIL(pt,!UARTIsBusySend(UART0_BASE));
MUT_Post(&UartMut);
PT_TIMER_DELAY(&timer1,OS_TICKS_PER_SEC/3);
}
PT_END(pt);
}
uint8 Thread2(Tpt *pt)
{
PT_BEGIN(pt);
while(1)
{
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_5,~GPIOPinRead(GPIO_PORTB_BASE,GPIO_PIN_5));
MUT_Pend(&UartMut);
PT_WAIT_UNTIL(pt,!UARTIsBusySend(UART0_BASE));
UartPutString(UART0_BASE,"Thread2 is running*******************************\n");
PT_WAIT_UNTIL(pt,!UARTIsBusySend(UART0_BASE));
MUT_Post(&UartMut);
PT_TIMER_DELAY(&timer2,OS_TICKS_PER_SEC/2);
}
PT_END(pt);
}
int main()
{
cli();
IntPriorityGroupingSet(2);
IntPrioritySet(FAULT_SYSTICK, 3 << 6 | 1 << 5);
//SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |SYSCTL_XTAL_6MHZ);
SysCtlClockSet(SYSCTL_SYSDIV_10|SYSCTL_USE_PLL|SYSCTL_OSC_MAIN|SYSCTL_XTAL_6MHZ);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIODirModeSet(GPIO_PORTB_BASE,GPIO_PIN_4|GPIO_PIN_5,GPIO_DIR_MODE_OUT);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// 设置GPIO的A0和A1为UART引脚。(A0->RXD,A1->TXD)
UARTConfigSet(UART0_BASE, 9600, (UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));
// 配置UART 为 9600波特率, 8-N-1模式发送数据。
UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX4_8,UART_FIFO_TX4_8);
UARTIntEnable(UART0_BASE, UART_INT_TX);
IntEnable(INT_UART0);
SysTickPeriodSet(SysCtlClockGet()/OS_TICKS_PER_SEC-1);
SysTickEnable();
IntEnable(FAULT_SYSTICK);
sei();
while(1)
{
PT(Thread1)->execute();
PT(Thread2)->execute();
}
//return 0;
}
1 |
|