1、学习CH04示例程序,包括gpio.c和4个工程中的main.c
2、给出 gpio set(LIGHT RED,LGHT OFF);语句中,LIGHT RED和LIGHT OFF的值是多少?贴出每一步的查找截图。
一个简单的主循环程序:实现了一个循环计数器 `mMainLoopCount` 和一个灯的控制逻辑。
1. 主循环次数变量增加:
主循环次数变量 `mMainLoopCount` 会增加一次。这个变量用来记录主循环的执行次数。
2. 检查主循环次数是否达到设定值
3. 灯的亮暗处理:
如果达到设定的主循环次数,会执行以下步骤:
清除循环次数变量 `mMainLoopCount`,重置为0,以重新开始计数。
检查灯的状态标志 `mFlag`,如果为 `'L'`,则表示灯状态为“亮”,执行以下操作:
- 增加灯的闪烁次数 `mLightCount`。
- 输出当前灯的闪烁次数到串口。
- 将灯的状态标志 `mFlag` 改为 `'A'`,表示下一次循环将灯状态设为“暗”。
- 控制灯的状态为“亮”,并输出到串口。
如果灯状态标志 `mFlag` 为 `'A'`,则表示灯状态为“暗”,执行以下操作:
- 将灯的状态标志 `mFlag` 改为 `'L'`,表示下一次循环将灯状态设为“亮”。
- 控制灯的状态为“暗”,并输出到串口。
在每次主循环执行完指定次数后,会使灯交替地从亮到暗,然后再从暗到亮进行闪烁,并在每次闪烁时计数并输出到串口。
编译成功:
运行信息:
3、用直接地址编程方式,实现红绿蓝三灯轮流闪烁
代码如下:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
int main(void)
{
uint32_t mMainLoopCount;
uint8_t mFlag;
DISABLE_INTERRUPTS;
mMainLoopCount = 0;
mFlag = 'B';
volatile uint32_t* RCC_AHB2;
volatile uint32_t* gpio_ptr;
volatile uint32_t* gpio_mode;
volatile uint32_t* gpio_bsrr;
volatile uint32_t* gpio_brr;
RCC_AHB2 = (uint32_t*)0x4002104C;
gpio_ptr = (uint32_t*)0x48000400;
gpio_mode = gpio_ptr;
gpio_bsrr = gpio_ptr + 6;
gpio_brr = gpio_ptr + 10;
*RCC_AHB2 |= (1 << 1);
*gpio_mode &= ~(3 << 18);
*gpio_mode |= (1 << 18);
ENABLE_INTERRUPTS;
printf("-----------------------------------------------------\r\n");
printf("金葫芦提示:直接地址方式进行GPIO输出\r\n");
printf(" 这个编程有点难以看懂,使用构件编程就简单多了,\r\n");
printf(" 但是构件制作要经过这一关,因此,我们把构件制作与\r\n");
printf(" 基于构件的编程分成不同过程。学习嵌入式系统,\r\n");
printf(" 以理解GPIO、UART、定时器、Flash、ADC、...\r\n");
printf(" 知识要素为出发点,学会正确运用构件进行应用编程,\r\n");
printf(" 理解和掌握2~3个简单构件的制作方法即可。\r\n");
printf("----------------------------------------------------\r\n");
for(;;)
{
mMainLoopCount++;
if (mMainLoopCount <= 6556677) continue;
mMainLoopCount = 0;
if (mFlag == 'B')
{
*gpio_bsrr |= (1 << 7);
*gpio_brr |= (1 << 9);
printf("蓝灯:亮\r\n");
mFlag = 'G';
}
else if(mFlag == 'G')
{
*gpio_bsrr |= (1 << 9);
*gpio_brr |= (1 << 8);
printf("绿灯:亮\r\n");
mFlag = 'R';
}
else
{
*gpio_bsrr |= (1 << 8);
*gpio_brr |= (1 << 7);
printf("红灯:亮\r\n");
mFlag = 'B';
}
}
}
4、用调用构件方式,实现红绿蓝的八种组合轮流闪烁
代码如下:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
int main(void)
{
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
DISABLE_INTERRUPTS;
mMainLoopCount = 0;
mFlag = 'B';
gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_ON); //初始化蓝灯
ENABLE_INTERRUPTS;
printf("------------------------------------------------------\n");
printf("金葫芦提示:构件法输出控制小灯亮暗 \n");
printf(" 第一次用构件方法点亮的蓝色发光二极管,\n");
printf(" 这是进行应用编程的第一步,可以在此基础上,\n");
printf(" “照葫芦画瓢”地继续学习实践。\n");
printf(" 例如:改为绿灯;调整闪烁频率等。\n");
printf("------------------------------------------------------\n");
for (;;)
{
mMainLoopCount++;
if (mMainLoopCount <= 12888999)
continue;
mMainLoopCount = 0;
if (mFlag == 'R')
{
mFlag = 'G';
gpio_set(LIGHT_RED, LIGHT_ON);
printf("红灯: ON\n");
}
else if (mFlag == 'G')
{
mFlag = 'B';
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_ON);
printf("绿灯: ON\n");
}
else if (mFlag == 'B')
{
mFlag = 'Y';
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_ON);
printf("蓝灯: ON\n");
}
else if (mFlag == 'Y')
{
mFlag = 'P';
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_BLUE, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_ON);
printf("黄灯: ON\n");
}
else if (mFlag == 'P')
{
mFlag = 'C';
gpio_set(LIGHT_RED, LIGHT_ON);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_BLUE, LIGHT_ON);
printf("紫灯: ON\n");
}
else if (mFlag == 'C')
{
mFlag = 'W';
gpio_set(LIGHT_BLUE, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_ON);
printf("青灯: ON\n");
}
else if (mFlag == 'W')
{
mFlag = 'D';
gpio_set(LIGHT_BLUE, LIGHT_ON);
gpio_set(LIGHT_GREEN, LIGHT_ON);
gpio_set(LIGHT_RED, LIGHT_ON);
printf("白灯: ON\n");
}
else if (mFlag == 'D')
{
mFlag = 'R';
gpio_set(LIGHT_BLUE, LIGHT_OFF);
gpio_set(LIGHT_GREEN, LIGHT_OFF);
gpio_set(LIGHT_RED, LIGHT_OFF);
printf("暗灯: OFF\n");
}
}
}