#include "UART_TEST.h"
void uart_transmit(alt_u32 uart_addr,char * pt_ch)
{
alt_u32 sstatus = 0;
int ii;
for(ii=0;ii<UART_RX_BUFFER_SIZE;ii++)
{
do
{
sstatus = IORD_ALTERA_AVALON_UART_STATUS(uart_addr);//读入串口状态寄存器中的值
sstatus = sstatus&0x0040;//判断发送数据寄存器TRDY的当前状态
}
while(!sstatus); //发送准备好
IOWR_ALTERA_AVALON_UART_TXDATA(uart_addr, *(pt_ch+ii));//将数据写入接收数据寄存器
// printf("%c",*(pt_ch+ii));
}
}
void uart_interrupter_intinal (alt_u32 uart_addr,int uart_irq_id)
{
alt_u32 context;
alt_irq_register(uart_irq_id,NULL,p_isr_uart_receive); //串口ISR注册
context = alt_irq_disable_all ();//禁止所有的中断并返回一个值给context
IOWR_ALTERA_AVALON_UART_CONTROL(uart_addr,ALTERA_AVALON_UART_STATUS_RRDY_MSK);
//若接受准备好,发送准备好中断使能,即将状态寄存器RRDY里面的值传给控制寄存器的IRRDY
alt_irq_enable_all (context);//打开所有的中断
}
void isr_uart_receive()
{
alt_u32 context;
alt_u32 status = 0;
alt_u32 control = 0;
alt_u32 uart_addr=UART_OLED_BASE;
control=IORD_ALTERA_AVALON_UART_CONTROL(uart_addr);//保存串口控制寄存器里面的值
status = IORD_ALTERA_AVALON_UART_STATUS(uart_addr);//保存串口状态寄存器里面的值
if ((status & ALTERA_AVALON_UART_STATUS_RRDY_MSK)&&
( control & ALTERA_AVALON_UART_CONTROL_RRDY_MSK))
//接受准备好
{
context = alt_irq_disable_all (); //禁止所有的中断
rx_buffer[rx_count] = IORD_ALTERA_AVALON_UART_RXDATA(uart_addr);
//将发送数据寄存器里面的数据传给rx_buffer
rx_count++;
if(rx_count>=UART_RX_BUFFER_SIZE)
{
rx_count=0;
rx_over_flag=1;
}
alt_irq_enable_all (context); //打开所有的中断
}
return;
}
//void led_blink (void)
//{
// IOWR_ALTERA_AVALON_PIO_DATA(PIO_LED_BASE, led_state);
// led_state=~led_state;
//}
int main()
{
alt_u32 context;
uart_interrupter_intinal (UART_OLED_BASE,UART_OLED_IRQ);
while(1)
{
while(rx_over_flag)
{
context = alt_irq_disable_all ();
uart_transmit(UART_OLED_BASE,rx_buffer);
rx_over_flag=0;
alt_irq_enable_all (context);
// led_blink();
alt_busy_sleep(100000);
}
}
return 0;
}
UART_TEST.rar_nios2 serial port
版权申诉
2 浏览量
2022-09-20
16:55:02
上传
评论
收藏 2KB RAR 举报
小波思基
- 粉丝: 72
- 资源: 1万+