FPGA与STM32串口通信

797 阅读1分钟

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);//等待发送结束

} ———————————————— 版权声明:本文为CSDN博主「kobesdu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/kobesdu/art…