作业要求
作业一:
1、对照命名格式,给出所用MCU芯片型号(STM32L431RCT6)标识所获得的信息。
2、给出所用MCU芯片的RAM及Flash大小、地址范围。
作业二:
1、学习CH04示例程序,包括gpio.c和4个工程中的main.c。
2、给出 gpio set(LIGHT_RED,LIGHT_OFF); 语句中,LIGHT_RED和LIGHT_OFF的值是多少?贴出每一步的査找截图。
3、用直接地址编程方式,实现红绿蓝三灯轮流闪烁。
4、用调用构件方式,实现红绿蓝的八种组合轮流闪烁。
作业结果
作业一:
1、MCU芯片STM32L431RCT6型号标识信息
STM32:芯片家族为32位MCU
L:产品类型为超低功耗型
431:高性能微控制器31型号
R:引脚数目为64
C:Flash大小为256KB
T:封装类型为LQFP封装
6:温度范围为-40℃~+85℃
2、给出所用MCU芯片的RAM及Flash大小、地址范围。
1)STM32L431RCT6的RAM为静态随机存储器,大小为64KB,分成SRAM1和SRAM2,地址范围分别为0x2000_0000~0x2000_BFFF(48KB)和0x2000_C000~0x2000_FFFF(16KB)。大部分编程将它们连续在一起使用,即地址范围为0x2000_0000~0x2000_FFFF,共64KB。
2)STM32L431RCT6的Flash大小为256KB,其地址范围为0x0800_0000~0x0803_FFFF。Flash区中扇区大小为2KB,扇区总共有128个。
作业二:
1)査找LIGHT_RED和LIGHT_OFF的值
打开一个工程,查看其main.c。
点击LIGHT_RED,右键查看定义,转到user.h。
可见,LIGHT_RED的值为(PTB_NUM|7),代表红灯;LIGHT_OFF的值为1,表示灯暗。
2)用直接地址编程方式,实现红绿蓝三灯轮流闪烁。
打开...\04-Software\CH04\GPIO-Output-DirectAddress_STM32L431_20200928工程。
将代码修改为
结果为
LED灯以红->蓝->绿顺序闪烁。
3)用调用构件方式,实现红绿蓝的八种组合轮流闪烁。
打开...\04-Software\CH04\GPIO-Output-Component_STM32L431_20200928工程。
在main函数中初始化蓝、绿、红灯
//(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.3.2)如灯状态标志mFlag为'L',灯的闪烁次数+1并显示,改变灯状态及标志
if (mFlag=='A') //红灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_ON); //灯“亮”
printf(" 红灯亮--\n"); //串口输出灯的状态
}
else if (mFlag=='B') //绿灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
printf(" 绿灯亮--\n"); //串口输出灯的状态
}
else if (mFlag=='C') //黄灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_ON);
printf(" 黄灯亮--\n"); //串口输出灯的状态
}
else if (mFlag=='D') //蓝灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_ON);
printf(" 蓝灯亮--\n"); //串口输出灯的状态
}
else if (mFlag=='E') //紫灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_ON);
printf(" 紫灯亮--\n"); //串口输出灯的状态
}
else if (mFlag=='F') //青灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_GREEN,LIGHT_ON);
printf(" 青灯亮--\n"); //串口输出灯的状态
}
else if (mFlag=='G') //白灯
{
mLightCount++;
printf("灯的闪烁次数 mLightCount = %d\n",mLightCount);
mFlag++; //灯的状态标志
gpio_set(LIGHT_RED,LIGHT_ON);
printf(" 白灯亮--\n"); //串口输出灯的状态
}
//(2.3.3)如灯状态标志mFlag为'A',改变灯状态及标志
else //灯灭
{
mFlag='A'; //灯的状态标志
gpio_set(LIGHT_GREEN,LIGHT_OFF); //灯“暗”
gpio_set(LIGHT_RED,LIGHT_OFF);
gpio_set(LIGHT_BLUE,LIGHT_OFF);
printf(" 灯灭--\n"); //串口输出灯的状态
}
编译并进行串口更新
LED灯以 红->绿->黄->蓝->紫->青->白->无灯->红... 的顺序亮起。