实现UART_2串口的接收程序,当收到字符时:
①在电脑的输出窗口显示下一个字符,如收到A显示B;
②亮灯:收到字符G,亮绿灯;收到字符R,亮红灯;收到字符B,亮蓝灯;收到其他字符,不亮灯。
实现方式:
(1) 用构件调用方式实现;
(2) UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)。
1.
void UART_User_Handler(void)
{
uint8_t ch;
uint8_t flag;
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_ON); //初始化绿灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON); //初始化红灯
DISABLE_INTERRUPTS; //禁用中断,保持停止状态
ch=uart_re1(UART_User,&flag);
if(flag) //数据传入
{
if(ch=='R')
{
gpio_set(LIGHT_RED,LIGHT_ON); //红灯亮起
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);//蓝绿灯关闭
uart_send_string(UART_User,(uint8_t *)"字符为:");
uart_send1(UART_User,ch);//输出字符
uart_send_string(UART_User,(uint8_t *)",red,下一个字符为:");
uart_send1(UART_User,ch+1);//输出下一个字符
}
else if(ch=='G')
{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯亮起
gpio_set(LIGHT_BLUE,LIGHT_OFF);//红蓝灯关闭
uart_send_string(UART_User,(uint8_t *)"字符为:");
uart_send1(UART_User,ch);//输出字符
uart_send_string(UART_User,(uint8_t *)",green,下一个字符为:");
uart_send1(UART_User,ch+1);//输出下一个字符
}
else if(ch=='B')
{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);//红绿灯关闭
gpio_set(LIGHT_BLUE,LIGHT_ON);//蓝灯亮起
uart_send_string(UART_User,(uint8_t *)"字符为:");
uart_send1(UART_User,ch);//输出字符
uart_send_string(UART_User,(uint8_t *)",blue,下一个字符为:");
uart_send1(UART_User,ch+1);//输出下一个字符
}
}
ENABLE_INTERRUPTS; //开总中断
}
运行结果:
2.
void Custom_UART_Handler(void)
{
volatile uint32_t *uartStatusReg = (uint32_t *)0x4000441C;
volatile uint32_t *uartSendReg = (uint32_t *)0x40004428;
volatile uint32_t *uartReceiveReg = (uint32_t *)0x40004424;
uint8_t receivedData;
uint8_t dataFlag = 0;
Init_LED(LIGHT_BLUE, LED_ON);
Init_LED(LIGHT_GREEN, LED_ON);
Init_LED(LIGHT_RED, LED_ON); // 初始化LED灯
Disable_Global_Interrupts();//禁用中断,保持停止状态
// 检查是否有接收到的数据
if (*(uartStatusReg) & (1UL << 5))
{
receivedData = *(uartReceiveReg);
dataFlag = 1;
}
if (dataFlag)
{
if(ch=='R')
{
gpio_set(LIGHT_RED,LIGHT_ON);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
else if(ch=='G')
{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
}
else if(ch=='B')
{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
} }
// 发送数据
*(uartSendReg) = receivedData + 1;
}
}
运行结果:
- 分析思考
需要学习编写UART-2程序初始化参数的地址,了解其中的用处,才可以比较好的完成,完成实验的过程中也有出现像是输入字符串不为一个或是rgb三色导致系统崩溃的情况,以后的实验需要注意这个情况。