1.学习示例程序gpio.c和main.c
2.给出gpio_set(LIGHT_RED,LIGHT_OFF);语句中,LIGHT_RED和LIGHT_OFF的值是多少?
打开文件usr.h查阅可知
LIGHT_RED的值是PTB_NUM|7;
LIGHT_OFF的值是0。
打开文件gpio.h可知
PTB_NUM定义为0b10000 0000,
所以LIGHT_RED的值PTB_NUM|7 = 0b10000 0111
3.用直接地址编程方式,实现红绿蓝三灯轮流闪烁
导入工程
添加定义
修改main函数结构,改成红绿蓝三色顺序轮流闪烁:
红:
绿:
蓝:
//切换灯状态
if(mColor==0)
{
if (mFlag=='A') //若灯状态标志为'A'
{
*gpio_mode &= ~(3 << 14); // 将B口7脚对应的位清零
*gpio_mode |= (1 << 14); // 设为输出引脚
*gpio_brr|=(1<<7); //设置灯“亮”
printf("红灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='L'; //改变状态标志
}
else //否则,若灯状态标志不为'A'
{
*gpio_bsrr|=(1<<7); //设置灯“暗”
printf("红灯:暗\r\n"); //通过调试串口输出灯的状态
mFlag='A'; //改变状态标志
mColor++;
continue;
}
}
if(mColor==1)
{
if (mFlag=='A') //若灯状态标志为'A'
{
*gpio_mode &= ~(3 << 16); // 将B口8脚对应的位清零
*gpio_mode |= (1 << 16); // 设为输出引脚
*gpio_brr|=(1<<8); //设置灯“亮”
printf("绿灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='L'; //改变状态标志
}
else //否则,若灯状态标志不为'A'
{
*gpio_bsrr|=(1<<8); //设置灯“暗”
printf("绿灯:暗\r\n"); //通过调试串口输出灯的状态
mFlag='A'; //改变状态标志
mColor++;
continue;
}
}
if(mColor==2)
{
if (mFlag=='A') //若灯状态标志为'A'
{
*gpio_mode &= ~(3<<18); //0b11111111111100111111111111111111;
*gpio_mode |=(1<<18); //0b00000000000001000000000000000000;
*gpio_brr|=(1<<9); //设置灯“亮”
printf("蓝灯:亮\r\n"); //通过调试串口输出灯的状态
mFlag='L'; //改变状态标志
}
else //否则,若灯状态标志不为'A'
{
*gpio_bsrr|=(1<<9); //设置灯“暗”
printf("蓝灯:暗\r\n"); //通过调试串口输出灯的状态
mFlag='A'; //改变状态标志
mColor=0;
continue;
}
}
} //for(;;)结尾
运行结果:
红绿蓝三色闪烁:
4、用调用构建方式,实现红绿蓝的八种组合轮流闪烁
导入工程
修改工程代码结构,实现三色组合(即七色)闪烁:
#define GLOBLE_VAR
#include "includes.h" //包含总头文件
//----------------------------------------------------------------------
//声明使用到的内部函数
//main.c使用的内部函数声明处
//----------------------------------------------------------------------
//主函数,一般情况下可以认为程序从此开始运行(实际上有启动过程,参见书稿)
int main(void)
{
//(1)======启动部分(开头)==========================================
//(1.1)声明main函数使用的局部变量
uint32_t mMainLoopCount; //主循环次数变量
uint8_t mFlag; //灯的状态标志
uint32_t mLightCount; //灯的状态切换次数
uint32_t mColor;//七色标志
//(1.2)【不变】关总中断
DISABLE_INTERRUPTS;
//(1.3)给主函数使用的局部变量赋初值
mMainLoopCount=0; //主循环次数变量
mFlag='A'; //灯的状态标志
mLightCount=0; //灯的状态切换次数
mColor=0;//七色标志
//(1.4)给全局变量赋初值
//(1.5)用户外设模块初始化
gpio_init(LIGHT_BLUE,GPIO_OUTPUT,LIGHT_ON); //初始化蓝灯
gpio_init(LIGHT_GREEN,GPIO_OUTPUT,LIGHT_ON); //初始化绿灯
gpio_init(LIGHT_RED,GPIO_OUTPUT,LIGHT_ON); //初始化红灯
//(1.6)使能模块中断
//(1.7)【不变】开总中断
ENABLE_INTERRUPTS;
printf("------------------------------------------------------\n");
printf("金葫芦提示:构件法输出控制小灯亮暗 \n");
printf(" 第一次用构件方法点亮的蓝色发光二极管,\n");
printf(" 这是进行应用编程的第一步,可以在此基础上,\n");
printf(" “照葫芦画瓢”地继续学习实践。\n");
printf(" 例如:改为绿灯;调整闪烁频率等。\n");
printf("------------------------------------------------------\n");
//asm ("bl .");
//for(;;) { } //在此打桩,理解蓝色发光二极管为何亮起来了?
//(1)======启动部分(结尾)==========================================
//(2)======主循环部分(开头)========================================
for(;;) //for(;;)(开头)
{
//(2.1)主循环次数变量+1
mMainLoopCount++;
//(2.2)未达到主循环次数设定值,继续循环
if (mMainLoopCount<=12888999) continue;
//(2.3)达到主循环次数设定值,执行下列语句,进行灯的亮暗处理
//(2.3.1)清除循环次数变量
mMainLoopCount=0;
//(2.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志
if (mColor==0) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“暗”
printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:OFF\nLIGHT_RED:OFF\n蓝色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==1) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“暗”
printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:ON\nLIGHT_RED:OFF\n绿色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==2) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_ON);//绿灯“亮”
gpio_set(LIGHT_RED,LIGHT_OFF); //红灯“暗”
printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:ON\nLIGHT_RED:OFF\n青色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==3) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
gpio_set(LIGHT_RED,LIGHT_ON); //红灯“亮”
printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:OFF\nLIGHT_RED:ON\n红色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==4) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//绿灯“暗”
gpio_set(LIGHT_RED,LIGHT_ON); //红灯“亮”
printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:OFF\nLIGHT_RED:ON\n紫色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==5) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
gpio_set(LIGHT_RED,LIGHT_ON); //绿灯“亮”
printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:ON\nLIGHT_RED:ON\n黄色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==6) //判断灯的状态标志
{
mLightCount++;
mColor++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_ON); //蓝灯“亮”
gpio_set(LIGHT_GREEN,LIGHT_ON);//红灯“亮”
gpio_set(LIGHT_RED,LIGHT_ON); //绿灯“亮”
printf(" LIGHT_BLUE:ON\nLIGHT_GREEN:ON\nLIGHT_RED:ON\n白色灯\n"); //串口输出灯的状态
continue;
}
if (mColor==7) //判断灯的状态标志
{
mColor=0;
mFlag='L'; //灯的状态标志
gpio_set(LIGHT_BLUE,LIGHT_OFF); //蓝灯“暗”
gpio_set(LIGHT_GREEN,LIGHT_OFF);//红灯“暗”
gpio_set(LIGHT_RED,LIGHT_OFF); //绿灯“暗”
printf(" LIGHT_BLUE:OFF\nLIGHT_GREEN:OFF\nLIGHT_RED:OFF\n灭灯\n"); //串口输出灯的状态
}
} //for(;;)结尾
//(2)======主循环部分(结尾)========================================
} //main函数(结尾)
运行结果: