作业要求
实现UART_2串口的接收程序,当收到字符时:
①在电脑的输出窗口显示下一个字符,如收到A显示B;
②亮灯:收到字符G,亮绿灯;收到字符R,亮红灯;收到字符B,亮蓝灯;收到其他字符,不亮灯。
实现方式:
(1) 用构件调用方式实现;
(2) UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)。
作业实现
(1)用构件调用方式实现
主要代码:
//(1.4)给全局变量赋初值
uint8_t fp=0;
char rec; //接收的字符//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
uart_init(UART_User,115200); //初始化串口模块
//(1.6)使能模块中断
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
//(1)======启动部分(结尾)==========================================//(2)======主循环部分(开头)========================================
for(;;) //for(;;)(开头)
{
rec = (char) uart_re1(UART_User, &fp);
if(fp){ //判断是否接收到数据
if(rec == 'R'){
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_ON);
rec+=1;
uart_send1(UART_User,rec); //要显示的字符
}
else if(rec == 'G'){
gpio_set(LIGHT_BLUE,LIGHT_OFF);
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
rec+=1;
uart_send1(UART_User,rec);
}
else if(rec == 'B'){
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
rec+=1;
uart_send1(UART_User,rec);
}
else{
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
rec+=1;
uart_send1(UART_User,rec);
}
}
} //for(;;)结尾
实验结果:
收到 R 亮红灯
收到 G 亮绿灯
收到 B 亮蓝灯
收到其它字符不亮灯
(2)用直接地址方式实现
主要代码:
uint8_t receivedChar;
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_OFF); //初始化蓝灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_OFF); //初始化绿灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_OFF); //初始化红灯
//(2)======主循环部分(开头)========================================
for(;;)
{
// 接收缓冲区不满,接受字符
if (*uart_isr & (0x1UL << 5U)) {
// 读取接收到的字符
receivedChar = (char)(*uart_tdr & 0xFF);
for (volatile uint32_t j=0;j<=30000;j++){
if (*uart_isr & (0x1UL<<7UL)){
*uart_tdr = receivedChar + 1; //显示下一个字符
break;
}
}
// 接收到字符时的处理
switch (receivedChar) {
case 'B':
gpio_set(LIGHT_BLUE, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
break;
case 'R':
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
break;
case 'G':
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
break;
default:
// 其他字符不亮灯
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
break;
}
}
}
实验结果:
亮红灯
亮绿灯
亮蓝灯
不亮灯