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);//等待發送結束
}