1. 程式人生 > >FPGA與STM32串列埠通訊

FPGA與STM32串列埠通訊

FPGA中,新增一個TTL串列埠;與STM32串列埠通訊引腳相連。波特率一致;

FPGA:

void uart_stm32_isr(void *context,alt_u32 id)//中斷服務函式

{

    //i1=0;

  alt_u16 status9;

  do

  {

    status9 =IORD_ALTERA_AVALON_UART_STATUS(UART_TTL_BASE);//等待發送完成

   }

  while (!(status9& ALTERA_AVALON_UART_STATUS_RRDY_MSK));

  read_temp[i2]=IORD_ALTERA_AVALON_UART_RXDATA(UART_TTL_BASE);//

接收資料

  if (read_temp[0]==0xFF)

  {

    i2=i2+1;

  }

  //read_temp[0]=IORD_ALTERA_AVALON_UART_RXDATA(UART_TTL_BASE);//接收資料

  if (i2==5)

  {

    i2=0;

    stm32_flag_RF=1;//接收完一組,標誌置為1

  }

  IOWR_ALTERA_AVALON_UART_STATUS(UART_TTL_BASE,0);//清除接收緩衝區

}

void uart_send(unsigned char data)//uart傳送單個位元組

{

    alt_u8 status;

   status=IORD_ALTERA_AVALON_UART_STATUS(UART_TTL_BASE);

    while(!(status&0x40))

       status=IORD_ALTERA_AVALON_UART_STATUS(UART_TTL_BASE);//等待發送完成

   IOWR_ALTERA_AVALON_UART_TXDATA(UART_TTL_BASE,data);

}

void uart_send_n(unsigned char *ptr,unsigned char n)//uart傳送多個位元組

{

    for(;n>0;n++)

    {

        uart_send(*ptr);

        ptr++;

    }

}

void uart_stm32_init()//串列埠中斷初始化

{

    i2=0;

   IOWR_ALTERA_AVALON_UART_CONTROL(UART_TTL_BASE,0x80);//接受中斷使能

    IOWR_ALTERA_AVALON_UART_STATUS(UART_TTL_BASE,0X00);//清狀態標誌

    alt_u16 control11;   

    control11=ALTERA_AVALON_UART_CONTROL_RRDY_MSK | ALTERA_AVALON_UART_CONTROL_E_MSK;

   IOWR_ALTERA_AVALON_UART_CONTROL(UART_TTL_BASE, control11);

   IOWR_ALTERA_AVALON_UART_DIVISOR(UART_422_BASE, 10416);

   alt_irq_register(UART_TTL_IRQ,0,uart_stm32_isr);////註冊串列埠中斷服務程式

}

void stm32_command_switch(void)//對讀取到的資料進行處理

{  

    High=read_temp[1];

    Low=read_temp[2];

    Temp=(Low+High*256)/100;

    test1=read_temp[3];

    TEC_Flag=test1;

}

STM32

//向FPGA傳送資料

void usart_sendstring(unsigned intdata1,unsigned int data2,unsigned int data3,unsigned int data4)

{

             uart_init(115200);  //串列埠初始化為115200

                          USART_SendData(USART1,data1);//向串列埠1傳送資料頭

                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束

             USART_SendData(USART1, data2);//向串列埠1傳送溫度高八位

                        while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束

                    USART_SendData(USART1, data3);//向串列埠1傳送溫度低八位

                           while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束

                    USART_SendData(USART1, TEC_Flag);//向串列埠1傳送TEC工作狀態//test

                           while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束

             USART_SendData(USART1, 0xDD);//向串列埠1傳送TEC工作狀態//test

                           while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待發送結束

}