在函数main.c中初始化三种颜色的灯:
gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF);
//蓝灯
gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF);
//绿灯
gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_OFF);
//红灯
同时为了响应以上修改,进入isr。c文件添加以下代码:
void UART_User_Handler(void)
{
//声明局部变量
uint8_t ch;
uint8_t flag;
uint32_t mMainLoopCount;
mMainLoopCount=0;
//关总中断
DISABLE_INTERRUPTS;
//读取字节
ch=uart_recv(UART_User, &flag); //调用接收一个字节的函数,清接收中断位
//根据标志判断是否真正收到一个字节的数据
if(flag)
{
//有数据
if(ch=='B')
{
gpio_set(LIGHT_BLUE, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
}
else if(ch=='G')
{
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
}
else if(ch=='R')
{
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
}
else
{
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
}
ch=ch+1;
uart_send(UART_User, ch); //回发接收到的字节
}
}
(2)UART部分用直接地址方式实现(即不调用uart.c中的函数,其他部分如GPIO、中断设置可调用函数)。
在寄存器程序里面初始化:
volatile uint32_t* uart_isr; // UART中断和状态寄存器基地址
volatile uint32_t* uart_crl; //UART控制寄存器1基地址
volatile uint32_t* uart_cr2; //UART控制寄存器2基地址
volatile uint32_t* uart_cr3; //UART控制寄存器3基地址
volatile uint32_t* uart_tdr; //UART发送数据寄存器
volatile uint32_t* uart_rdr; //UART接收数据寄存器32106100129
uint16_t usartdiv; //BRR寄存器应赋的值
//变量赋值
RCC_APB1=0x40021058UL; //UART时钟使能寄存器地址
RCC_AHB2=0x4002104CUL; //GPIO的A口时钟使能寄存器地址
gpio_ptr=0x48000000UL; //GPIOA端口的基地址
uart_ptr=0x40004400UL; //UART2端口的基地址
gpio_mode=0x48000000UL; //引脚模式寄存器地址=口基地址
gpio_afr1=0x48000020UL; // GPIO复用功能低位寄存器
uart_cr1=0x40004400UL; //UART控制寄存器1基地址
uart_rdr=0x40004424UL; //UART接收数据寄存器32106100129
uart_brr=0x4000440CUL; //UART波特率寄存器地址
uart_isr=0x4000441CUL; // UART中断和状态寄存器基地址
uart_tdr=0x40004428UL; //UART发送数据寄存器
uart_cr2=0x40004404UL; //UART控制寄存器2基地址
uart_cr3=0x40004408UL; //UART控制寄存器3基地址
继续在main程序中初始化三种灯:
gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF);
//蓝灯
gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF);
//绿灯
gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_OFF);
//红灯
最后实现并运行:
while(1) {
uint8_t ch;
ch=uart_rdr; //获取接收寄存器中的值
*uart_tdr = ch+1; //发送接收到数据的下一个字符
if(ch=='B')
{
gpio_set(LIGHT_BLUE, LIGHT_ON);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_OFF);
}
else if(ch=='R')
{
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
}
else if(ch=='G')
{
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
}
else
{
gpio_set(LIGHT_BLUE, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_OFF);
}
}
之后运行结果与(1)大致相同
//初始化红灯五、运行结果
用适当的文字、截图、图片等描述实验的结果。
通过以上代码,使用构建调用的方式实现了实验内容功能:
实验主板的灯对应输入字符点亮:
输入R点亮红灯
输入B点亮蓝灯
输入G点亮绿灯。
输入其他字符: